kokbee-Hive
article thumbnail

2023.05.31일 자로 회사의 앱 V2 가 정식으로 출시되었다.
출시되기까지에 과정 중에서도 백앤드로써 참여했던 기억 중에 iOS storekit2 적용에 대한 내용을 적어보고자 한다.
 
 
 

Storekit2로 굳이 왜 해야 했을까?

설명을 하자면 시한부 인생이랄까..
앱 스토어에 앱을 올리게 되면 심사를 받게 되는데, 이 과정에서 앱에 테스트 및 보안 관련 내용 등등.. 여러 가지 내용을 심사받게 된다.
그 과정에서 미비한 내용이나 보안상 문제가 있다고 하면, 앱을 출시하지 못하거나 까딱하면 앱을 내려서 다시 출시해야 할 수도 있다.
 
또 워낙 깐깐한 애플이다 보니... 🫠
 
그래서 위에 내용처럼 회사에서도 심사를 받고, 권고사항을 하나 받았는데..
그 부분은 결제에 대한 내용이었다. 
 
 
 
 
기존 애플을 통해 결제 시 구성은 아래와 같았다.

"뭐야? 일반적인 결제 플로우 아냐?"라고 생각이 들 거다. 
맞다고 할 수 있다.. 단지 문제라면 검증하는 내용이 부실하다는 것, 영수증을 받았는데 영수증 검사를 제대로 안 한다.  이것이 문제.. 🛠
 
그래서 wwdc 2021에서 storekit 2라는 새로운 결제 방식을 선보이고 이걸 적용하게 되었다.
그렇다면 수정해보도록 하자. 
 
 
 
 
 

Storekit2을 이용한 결제 플로우

아래와 같이 플로우를 짜보았다.

덤으로 기존에 환불 관련 내용에 관해서도 추가했다.
회사에 애플 관련 결제에 대한, 환불요청에 대한 알림을 받지 않고 있었다.
CS에서 매번 확인한다고.... 🥹
 
 
 
 

 Storekit2을 이용한 결제를 위한 사전 작업 및 삽질

플로우 및 사용방법은 apple document를 읽어서 대충 알게 되었다.
하지만, 읽었다고 해서 바로 되는 법이 거의 없는지라.. 바로 벽에 헤딩 중..
 
문제점은 아래와 같았다.
1. 결제 테스트를 하려면, 결제를 해봐야 함
2. storekit2를 사용하려면 사용할 수 있게, 애플 인증서를 새로 받아야 한다는 것
 
위 두 가지였다.
 
 
 
하지만 몰랐기에.. 앱팀 팀장님과 계속 헤딩했음.. (⭐️ 서로 자주 대화하기에 반말이 적혀 있습니당. 회사는 존칭문화에요!)

  • Storekit2 사용을 위한 인증서가, 기존 꺼 인 줄 알고 헤맴
  • 권한 없어서 질문....ㅋㅋㅋ
  • sandbox, production 트랜잭션 id가 서로 다름

앱팀 팀장님이랑 나눈 대화들..
 
 
 
 

Storekit2 사용한  결제 코드 작성

step by step으로 나누었지만 코드는 쉽다.
 
step.1 store API 사용에 필요한 값 사용 및 선언 

// store API를 사용하기 위해 필요한 공용 변수 선언
const KEY = appStoreConfig.auth_key.secret
const KEY_ID = appStoreConfig.auth_key.key_id
const ISSUER = appStoreConfig.issuer
const APP_BUNDLE_ID = appStoreConfig.bundle_id
const ENVIRONMENT = gConfig.env === 'production' ? Environment.Production : Environment.Sandbox

 
 
step.2 storeAPI 호출 - https://www.npmjs.com/package/app-store-server-api

const { AppStoreServerAPI, Environment, decodeTransactions, decodeTransaction, decodeNotificationPayload } = require('app-store-server-api')

const storeAPI = new AppStoreServerAPI(KEY, KEY_ID, ISSUER_ID, APP_BUNDLE_ID, ENVIRONMENT)

 
 
step.3  앱을 통해서 전달받은 영수증 ID를 가지고, storeAPI 를 통해 영수증 검증

const result = await storeAPI.getTransactionHistory({ 영수증 ID })

 
 
step.4 받아온 영수증 안에 데이터를 분해

// 제품 유형 type (Auto-Renewable: 자동 갱신 구독, Non-Consumable: 비소모성 구매, Consumable: 소모성 구매, Non-Renewing: 비 갱신 구독
const [{ productId, type, quantity, purchaseDate }] = await decodeTransactions(영수증 내용)

 
 
step.5  데이터를 검증 후 비즈니스 로직 후 포인트 전달

...
const putOpt = {
  id: productId,
  user,
  point: orderPoint,
}
...
    
return point

 
 
 
 
 
 

테스트 및  dev, production 적용 

dev에서 잘 작동되는 것을 확인함, 하지만 v2 출시 때 적용돼야 하기에 일단 API만 새로 파놓기로 해둠
하지만 환불 callback은 작동해도 되기에, 개발 완료 후 배포

칼 같이 날아오는 환불 알림 👀

 
 
 
 

V2 배포 후, 앱스토어 심사 통과 및 후일담

✨ 문제없이 잘됨 👍🏻

  • 애플 측에서 8월에 결제 관련 개선하지 않으면 앱 내려버린다고 함

 
앱팀 팀장님이 슬랙으로 언급해주심 😎 하하하하하하

profile

kokbee-Hive

@콕비

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!