애플 인앱(in-app purchase) 영수증 검증시 참고하면 좋은

애플의 인앱구매 기능 구현후 테스트시에 참고하면 도움이 될만한것 같아 남겨봅니다.

 

 

구글플레이의 경우에는

 

1. 항상 동일한 특정 구매 결과값을 리턴하는 고정인앱상품명을 사용해서

 

테스트 계정이든 아니든 동일한 구매 결과에 따른 flow를 테스트해볼수 있고,

 

2. 아니면 테스트 계정을 앱 설정에 추가하여 이 계정으로 실제와 동일한 구매 프로세스를 이용하되 인앱구매 요금이 청구되지 않도록 할 수있습니다.

 

3. 그것도 아니면 실제 계정을 사용하여 구매하고 구글플레이콘솔에서 해당 인앱구매를 손쉽게 환불처리할수 있습니다.

 

 

그리고 테스트 결제든 실제 결제든 모든 결제는 동일한 

 

https://developers.google.com/android-publisher/api-ref/purchases/products/get?hl=ko

 

googleplay developer api를 통해서 서버사이드에서 검증이 가능합니다.

 

 

 

하지만 ios는 비슷하면서도 약간 다른 부분이 있는데요. 

 

1. 앱스토어도 마찬가지로 테스트 계정을 생성하여 인앱구매 테스트를 동일하게 진행할 수 있습니다.

테스트 계정이 구매한 인앱구매는 실제로 청구되지 않습니다

 

2. 실제 결제를 발생시켜서 테스트해볼수 있지만, 애플에서는 앱개발자를 위한 쉬운 방법의 환불방법을 제공하고 있지 않아, 실제 구매자가 애플측에 직접 요청을 넣어 환불취소를 요청해야합니다.

 

3. testflight를 이용해서 다운받은 빌드에서의 결제도 sandbox용 결제로 간주됩니다

이게 가장 혼란스러운 부분이었는데요 testflight에 올린 추후 앱스토어를 통해 배포될 빌드에서도

인앱 구매를 할때, 테스트 계정이 아닌 일반 계정을 사용해도 실제 인앱구매 과정을 그대로 진행할 수 있지만,

해당 결제는 실제로 청구되지 않는 sandbox용 결제로 간주됩니다.

 

 

그러면 당연히 의문이 생기는데 말이죠.

 

 

애플은 인앱 영수증 검수를 위해 2개의 endpoint를 제공해주고 있습니다


Use the sandbox URL https://sandbox.itunes.apple.com/verifyReceipt

Use the production URL https://buy.itunes.apple.com/verifyReceipt

테스트 계정으로 구매하거나, testflight에서 다운받은 빌드를 통해 구매한 인앱구매는 sandbox 에서 조회해야 원하는 영수증 검증값을 받을 수 있고,

앱스토어에서 다운받아 실제 유저가 구매한 인앱구매는 production에서 조회해야 원하는 영수증 검증값을 받을 수 있습니다.



그렇다면 서버사이드에서 영수증에 대한 검증을 할때 해당 결제가 sandbox인지, production인지 어떤 결제인지 알려줘야 어떤 endpoint에 영수증 검증을 요청하던지 할거 아닌가? 이렇게 생각을 하게 마련인데요.

그런데 애플은 어플리케이션 side에서는 인앱구매시에 해당 값을 리턴해주지 않습니다.

 

 

 

그래서 이 경우를 어떻게 해결해야하는거지 고민을 했는데

 

다음과 같은 내용이 애플개발자홈페이지에 있는것을 확인했습니다.

 

 

https://developer.apple.com/library/archive/technotes/tn2413/_index.html#//apple_ref/doc/uid/DTS40016228-CH1-RECEIPTURL

 

 

What url should I use to verify my receipt?
Use the sandbox URL https://sandbox.itunes.apple.com/verifyReceipt while testing your application in the sandbox and while your application is in review.
Use the production URL https://buy.itunes.apple.com/verifyReceipt once your application is live in the App Store.
Important: The App Review team reviews apps in the sandbox.

Always verify your receipt first with the production URL; proceed to verify with the sandbox URL if you receive a 21007 status code. Following this approach ensures that you do not have to switch between URLs while your application is being tested or reviewed in the sandbox or is live in the App Store.
The 21007 status code indicates that this receipt is a sandbox receipt, but it was sent to the production service for verification. A status of 0 indicates that the receipt was properly verified. See for WWDC 2012: Managing Subscriptions with In-App Purchase more information.

 

 

이 내용이 약간 구석진곳에 있어서 저도 다른 사례들을 찾다찾다 우연히 발견했네요

 

내용을 번역하자면

 

 

어떤 종류의 결제 영수증이든 먼저 production url로 검증을 요청하고,

 

21007 status 코드를 리턴하면 sandbox용 결제니깐 sandbox url로 검증을 요청해라 라는 얘기였네요


리턴된 status 코드가 0인 경우가 검증이 된 영수증이라는 의미인데요 0이 아닌 status값들에 대한 예외처리를 할 때

 

21007 코드에 대해서는 sandbox용 결제니깐 sandbox로 한번더 검증하라는 로직을 넣으면 되는거였네요

 

 

이렇게 하면 서버에서 검증시에 sandbox용 결제인지 production용 결제인지 알 수 있겠죠?

| 1 | ··· | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | ··· | 1806 |