
애플 정기 결제 신규 구매 처리
- 결제 정보 수신
- 유저가 앱에서 정기 결제 상품을 구매하면, 클라이언트는 결제 정보를 서버로 전송한다.
- ex:
originalTransactionId
등
- 결제 정보 검증
- 서버는 클라이언트로부터 받은 결제 정보를 애플 서버로 보내 검증한다.
https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/${originalTransactionId}
- 응답 데이터 처리:
- 애플 서버는 암호화된 응답을 반환한다.
- 디코딩하여 필요한 유저의 구매 정보를 추출한다.
- 구매 정보 저장 및 제공:
- 디코딩한 정보를 기반으로 유저의 구매 정보를 저장하고 구매한 상품을 유저에게 제공한다.
애플 정기 결제 상품 관리
- 실시간 알림 수신:
- 앱스토어가 구독 상품의 상태가 변경될 때마다(ex: 갱신, 결제 실패 등) 실시간 알림을 서버로 보내준다.
- 알림을 받기 위한 서버 URL을 애플 사이트에 등록해야한다.
- 알림 데이터 처리:
- 실시간 알림은 암호화되어 있으므로 이를 디코딩해야한다.
- 디코딩한 데이터에서 필요한 정보를 추출하여 구매 정보로 저장한다.
- 구독 상태 관리:
- 실시간 알림을 통해 구독 상태를 관리하고, 필요시 유저에게 결제 상품을 제공한다.
- 신규 구독에 대해서는 클라이언트가 보내주는 데이터를 기반으로 처리하며, 기타 상태 변경은 실시간 알림 기반으로 처리하도록 구현함.
구글 정기 결제 신규 구매 처리
- 결제 정보 수신:
- 유저가 앱에서 정기 결제 상품을 구매하면, 클라이언트는 결제 정보를 서버로 전송한다.
- ex:
token
, packageName
등
- 결제 정보 검증:
- 서버는 클라이언트로부터 받은 결제 정보를 구글 서버로 보내 정기 결제 여부를 검증한다.
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptionsv2/tokens/${token}
- 구매 처리:
- 구글 서버에서 받은 응답 데이터를 사용하여 구매 처리 를 진행한다.
https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${packageName}/purchases/subscriptions/${subscriptionId}/tokens/${token}:acknowledge
- 구매 정보 저장 및 제공:
- 2번에서 받은 응답 데이터 중 필요한 유저의 구매 정보를 저장하고, 구매한 상품을 제공한다.
구글 정기 결제 상품 관리
- 알림 시스템(Pub/Sub) 설정:
- 구글의 Pub/Sub 서비스를 통해 구독 상태 변경 알림을 수신한다.
- 구독자의 엔드포인트로 구독 주제에 대한 메세지를 전송해주는 방식
- Push 방식과 Pull 방식이 있으며 Push 방식을 채택함
- Push 방식을 채택한 이유: 실시간 처리가 중요했으며, 이벤트가 발생하면 구글이 알아서 메시지를 보내주기 때문에 구현이 비교적 간편해 보였음.
- 알림 데이터 처리:
- Push 방식으로 받은 알림 데이터를 처리하여 구독 상태 변경을 관리한다.
- 필요한 데이터를 추출하여 유저의 구매 정보를 갱신한다.
- 구독 상태 관리:
- 실시간 알림을 통해 구독 상태를 관리하고, 필요시 유저에게 결제 상품을 제공한다.
- 신규 구독에 대해서는 클라이언트가 보내주는 데이터를 기반으로 처리하며, 기타 상태 변경은 실시간 알림 기반으로 처리하도록 구현함.
정리하다 보니 생각난, 겪었던 에러사항 🔥
구글의 Pub/Sub 서비스를 사용하면서 동일한 구독 상품에 대해 테스트 환경(dev, stage)과 프로덕션 환경에 맞는 URL을 각각 입력하고 싶었지만 방법을 찾지 못해 어려움을 겪었던 게 기억난다. 애플은 애플은 샌드박스 환경이 별도로 제공되어 상대적으로 편리했지만, 구글의 경우 하나의 주제에 대해 하나의 구독만 가능했기에(내가 못찾았을 수도 있음) 테스트 환경에서의 정기 결제 이벤트 처리가 어려웠다.
이 문제를 해결하기 위해서 새로운 구독 상품도 만들어보고, 구글에 문의 사항도 제출해보았지만 테스트용 url을 추가로 입력할 수 없다는 답변을 받았었다. 추가 구독 상품을 만들려면 안드로이드 개발자의 시간도 필요했기에 과잉 개발로 판단하고 그만두게 되었다.
테스트가 필요한 경우, 실제 구독자의 갱신 날짜를 모두 계산하여 의존성 없는 시간대에 테스트 url로 수정 후 테스트를 진행했는데, 매우 불편하고 쫄리는(?) 경험이였다. 회사를 다니며 진행했던 가장 큰 프로젝트였다. 이때 구독상품뿐만 아니라 다양한 인앱상품도 같이 개발했는데 제대로된 상사의 피드백을 못받았기 때문에 다른 회사에서는 어떻게 처리하는지 매우 궁금하다.
기억이 휘발되고 있어서 짧게 나마 정리해봤는데 정리하길 잘했두 :)
ㅋㅋㅋ 통곡의 구독 상품 개발이 이거였군요