iOS 앱에서 상품을 등록하고 판매하는 과정은 꽤나 복잡하다. 그 중에서도 정기구독 자동결제(Auto-Renewable Subscription) 상품을 판매하는 경우 신경써야 할 부분이 매우 많다. 2016년 WWDC에서 애플은 Auto-Renewable Subscription을 모든 카테고리의 앱에 적용가능하도록 허용하기로 했고(기존에는 잡지, 음악 등 특정 컨텐츠에 대해서만 허용되었었음), 해당 타입의 결제를 통해 발생한 매출의 경우 다음 조건을 만족할 경우 앱 판매 수수료를 30% ->15%로 인하 하는 내용에 대해서 발표했다. Show
Auto-Renewable Subscription에 대해 자세히 설명하기 전에 먼저 앱스토어의 다른 상품 타입들에 대해서도 간략히 정리해보도록 하자. 인앱 결제 (In-App Purchase) 종류
인앱 결제 구현하기Auto-Renewable Subscription 상품에 대한 결제 방식은 다른 종류의 IAP 상품들과 동일하니 여기서 자세히 설명하지는 않고 넘어가도록 한다. 인앱 정기 결제시 리뉴얼 결제 절차정기결제가 진행중인 경우 다음과 같은 절차를 통해서 리뉴얼 결제가 발생한다.
영수증 검증하기 (Receipt Validation)
인앱 결제 내역 복원하기 (Restore In-App Purchase Products)위 표에서 많이들 헷갈려 하는 부분이 Restored by the system 과 by your app의 차이이다. by the system 이란 Apple에서 지원하는 StoreKit을 이용해서 Apple server와 통신해서 상품을 restore를 하는 것이고 by your app이란 Apple과의 통신 없이 서비스 서버에서 상품을 restore 해 주는 것이다.
얼핏 보면 Non-renewable Subscription 은 로그인 한 유저만 살 수있도록 해도 무방할 것 같다. 그러나 stack over flow에서 Non-renewable Subscription를 구매할 때 Registration을 requirement로 했을 때 스토어 리뷰과정에서 reject 당했다는 사람이 많았다 (참고). 앱스토어에서 리젝을 피하기 위해 다음과 같은 가이드라인을 따르면 된다.
Code in Action: 인앱 결제 내역 복원하기Apple Store Kit이 제공하는 Restore 기능은 해당 기기에 로그인된 Apple ID를 기준으로 동작한다. 이는 서비스 registration id 와는 상관이없다. 따라서 같은 Apple ID를 공유하면서 생길 수 있는 abusing 이슈에 대해서는 서비스 서버에서 따로 방어햐야 한다. Restore 로직을 짜기 위해서 SKPaymentTransaction class 에 대한 이해가 필요하다.
위 API문서에는 restored 된 transaction 은 항상 originalTransaction 을 가지고 있는 것 처럼 설명되어 있지만, Apple 버그인지는 몰라도 originalTransaction 이 nil로 넘어올 때가 있으니 꼭_ nil check를 하는 것이 중요하다. _ 이렇게 해당 애플 아이디로 구매했던 non-consumable 과 auto-renewable subscription의 목록을 가져와서 서비스 서버로 응답해 주면 서버가 실제 그 user 에게 이전에 구매했던 상품들을 다시 matching 시켜주면 된다. 예제코드
애플 샌드박스 계정을 통한 결제 테스트 (Test Using Sandbox)이제 Auto-Renewable Subscription 상품에 대해 어느정도 개발이 진행되었으니 테스트를 해보도록 하자. 그런데 내가 설정한 상품의 subscription 기간이 1달이라면 다음 정기결제가 일어나는 시점까지 기다려서 테스트 하기가 매우 어려울 것이다. 아직 개발중인 앱의 경우 해당 상품이 앱스토어 상품 리뷰를 통과하지 않았기 때문에 경우 실제 Apple ID로 결제 테스트 하는 것도 불가능 하다. 이때 사용하는 것이 SandBox 계정이다. SandBox 계정은 Apple Developer Center에 가서 추가할 수 있다. SandBox 결제의 특징들과 몇가지 테스팅 팁을 정리해보았다.
정기 구독 상품 가격 관련
인앱 정기 결제 FAQ 정리
애플 결제 서버 정기구독 관련 2017년 7월 18일 업데이트 내용^애플에서 개발사들의 의견을 반영하여 2017년 7월 18일에 아래 기능들이 추가했다고 발표하였다. 좀더 자세한 내용은 WWDC 2017 Advanced StoreKit 세션을 참고하면 된다.
참고자료IAP auto renewal subscription 종합 IAP 정기 결제 단점 정리 Server-side Auto Renewable Subscription Receipt Verification Apple Developer - Receipt Validation Apple Developer - Subscription Apple Announcement - Server notifications and enhanced receipts for subscriptions Status Update Notifications |