Leo
In App Purchase (4) 본문
인앱결제에서 가장 중요하다고 생각하는 영수증 검증입니다.
우선, 영수증을 검증하는 방법에는 두 가지가 있습니다.
- 로컬(App) - 디바이스에서 영수증 검증을 하는 방법
- Server - 서버가 AppStore를 통해 영수증 검증을 하는 방법
Service에 적합한 영수증 검증 방식을 선택하시면 됩니다.
저희는 서버 사이드를 통한 검증 방식을 사용하기 때문에 로컬 검증 방식에 대한 설명은 생략하겠습니다.
3. Validating receipt
a. 결제 완료 후, 서버에게 영수증에 대한 검증 요청을 보낸다. (Frontend)
PurchaseStatus.purchased
를 통해 수신받은 영수증 정보를 서버에게 전달합니다.
(상황에 따라 영수증 전체를 보낼 수도 있고, 아래 코드처럼 id만 전달 할 수 있습니다.)
b. 서버는 영수증 검증진행 (Backend)
1. Client to Server (영수증 전송): 사용자가 인앱 결제를 완료하면, 앱은 구매한 영수증 데이터를 서버로 전송합니다.
클라이언트에게 받은 transactionId
혹은 영수증 정보는 거래 정보 조회에 사용됩니다.
2. Server to App Store (거래 내역 조회): 서버는 transactionId
를 사용하여 App Store에 해당 거래 내역 조회 요청을 보냅니다.
- Get Transaction Info - link
- deprecated 된 verifyRequest의 대체 API
- 클라이언트에서 결제 완료 후 생성된 transactionId를 전달 받아 단일 결제 건에 대한 정보 조회
3. Validation Transaction in Server (영수증 검증): App Store로부터 응답을 받으면, 서버는 응답 데이터(거래 ID, 상품 ID 등)를 클라 이언트가 보낸 영수증 데이터와 비교하여 거래를 검증합니다. 클라이언트에게 받은 transactionId 와 Store에게 받은 transactionId 의 일치 여부에 따라 이 거래가 유효한지 판단합니다.
4. Response Result (검증 완료): 검증이 성공하면, 서버는 해당 결제가 유효함을 확인하고 클라이언트에 구매 완료 응답을 보냅니다.
c. 구매 Transaction 종료 처리 후, 응답 결과에 따라 로직을 처리한다. (Frontend)
결제가 끝나면 반드시 Store에 구매 프로세스가 완료되었다는 신호를 보내줘야 합니다. completePurchase()
결제가 완료되지 않은 transaction이 남아 있을 가능성에 대비해서 모든 transaction 확인하고 수동 종료하는 함수도 결제 종료 시점에 함께 호출하고 있습니다.
✔️ 거래 완료된 상품에 대한 환불 처리
성공적으로 결제가 끝났어도 환불을 요청하는 유저에 대한 처리 로직을 고려해야합니다.
기본적으로 Play Store는 개발자가 직접 환불 혹은 부분 환불이 가능하지만, App Store의 경우에는 직접 환불을 해줄 수 있는 권한이 없습니다. 환불 기간 이후, 환불 요청을 할 경우 각 회사마다 환불에 대한 메뉴얼을 따로 만들 어서 진행하는 곳이 많다고 합니다.
그럼 환불 요청은 어떻게 들어오고 어떻게 처리해야 할까요.
유저의 거래 상태, 즉 유저가 거래를 취소하거나 환불을 요청했을 때와 같이 기존 거래에 변경이 이루어질 경우, Store가 서버에게 Notification
을 전송합니다. 알림을 수신한 서버는 거래 정보를 decoding한 뒤에 transactionId
로 해당하는 유저의 거래를 찾아 상태 Update를 진행합니다. (Front는 해줄 수 있는 게 없어요)
알림 데이터의 자세한 정보는 공식 문서를 통해 확인하실 수 있습니다. link
여기까지 마쳤다면 인앱결제에 대한 전체 프로세스가 종료됩니다.
[참고]
https://pub.dev/packages/in_app_purchase_storekit/example
https://developer.apple.com/documentation/appstoreservernotifications/app_store_server_notifications_v2
https://developer.apple.com/documentation/appstoreservernotifications/signedpayload
https://developer.apple.com/documentation/storekit/in-app_purchase/original_api_for_in-app_purchase/validating_receipts_with_the_app_store
'개발 정리 > Flutter' 카테고리의 다른 글
[Branch] App Link (2) (2) | 2024.11.21 |
---|---|
[Branch] App Link (1) (0) | 2024.11.16 |
In App Purchase (3) (2) | 2024.11.14 |
In App Purchase (2) (1) | 2024.11.13 |
In App Purchase (1) (10) | 2024.11.13 |