IOS 인앱 결제 서버
안녕하십니까 저번에 Inapp서버 개요 이후 이번에는 IOS 인앱 결제를 알아보겠습니다.
개요는 이전 글을 참고해주세요.
2019/09/13 - [인앱 결제 서버] - IOS & Android Inapp Server - 개요
참고로 이 글은 구체적인 소스코드를 제공하지 않으며, 어떻게 구현하는지에 대한 힌트만 제공합니다.
IOS는 Client단에서 인앱 결제 로직을 통해 받은 receipt-data를 서버에 넘겨 영수증 검증만 해주면 되는
오히려 Android보다 더 쉽게 구현할 수 있습니다.
receipt-data는 웹 상에서 떠돌아다니는 data를 test 할 수 있습니다.
그리고 IOS는 기본적으로 테스트를 할 때는 밑의 url을 base로 사용되며
https://sandbox.itunes.apple.com/verifyReceipt
실 서버에서는 밑의 url이 사용됩니다.
https://buy.itunes.apple.com/verifyReceipt
postman으로 test를 하면
POST /verifyReceipt HTTP/1.1
Host: sandbox.itunes.apple.com
cache-control: no-cache
Postman-Token: ca973415-6ad0-4bd0-9629-187cfed7731f
{"receipt-data":"MIIT5wYJKoZIhvcNAQcCoIIT2DCCE9QCAQExCzAJBgUrDgMC......"}
아래와 같은 결과를 얻을 수 있습니다.
{
"receipt":{
"receipt_type":"ProductionSandbox",
"adam_id":0,
"app_item_id":0,
"bundle_id":"kr.co.cheolcheol.inapp.ios",
"application_version":"1",
"download_id":0,
"version_external_identifier":0,
"receipt_creation_date":"2019-08-05 00:51:31 Etc/GMT",
"receipt_creation_date_ms":"1564966291000",
"receipt_creation_date_pst":"2019-08-04 17:51:31 America/Los_Angeles",
"request_date":"2019-09-05 00:03:19 Etc/GMT",
"request_date_ms":"1567641799618",
"request_date_pst":"2019-09-04 17:03:19 America/Los_Angeles",
"original_purchase_date":"2013-08-01 07:00:00 Etc/GMT",
"original_purchase_date_ms":"1375340400000",
"original_purchase_date_pst":"2013-08-01 00:00:00 America/Los_Angeles",
"original_application_version":"1.0",
"in_app":[
{
"quantity":"1",
"product_id":"kr.co.cheolcheol.inapp.ios.iap.star.100",
"transaction_id":"1000000553487969",
"original_transaction_id":"1000000553487969",
"purchase_date":"2019-08-02 07:07:45 Etc/GMT",
"purchase_date_ms":"1564729665000",
"purchase_date_pst":"2019-08-02 00:07:45 America/Los_Angeles",
"original_purchase_date":"2019-08-02 07:07:45 Etc/GMT",
"original_purchase_date_ms":"1564729665000",
"original_purchase_date_pst":"2019-08-02 00:07:45 America/Los_Angeles",
"is_trial_period":"false"
},
{
"quantity":"1",
"product_id":"kr.co.cheolcheol.inapp.ios.iap.star.300",
"transaction_id":"1000000553512679",
"original_transaction_id":"1000000553512679",
"purchase_date":"2019-08-02 07:41:37 Etc/GMT",
"purchase_date_ms":"1564731697000",
"purchase_date_pst":"2019-08-02 00:41:37 America/Los_Angeles",
"original_purchase_date":"2019-08-02 07:41:37 Etc/GMT",
"original_purchase_date_ms":"1564731697000",
"original_purchase_date_pst":"2019-08-02 00:41:37 America/Los_Angeles",
"is_trial_period":"false"
}
]
},
"status":0,
"environment":"Sandbox"
}
정상적으로 처리가 된다면 status는 0이 내려오며, 그 외에는 참고 url을 통해 error code를 확인할 수 있습니다.
그리고중요한 게 있는데, 인앱 검증을 통해 response를 해주고 client가 서버에
response받은 것을 전달하지 않으면
in_app key에 처리되지 않은 영수증이 점점 쌓이게 되며 response 처리를 해줘야 사라집니다.
저 같은 경우는 실서버와 테스트 처버를 운용을 하기 위해 21006 or 21007 에러를 잡아줬으며, transaction_id를 이용하여 아이템이 중복 지급이 되었는지 체크하는 로직 정도를 넣어줬습니다.
로직 자체는 어려운 편이 아니라 프로그래밍하는 것도 쉬울 것이라 생각합니다.
그럼 다음에는 AOS 인앱 결제 하는법도 작성해볼게요!
출처 및 참고
https://developer.apple.com/documentation/appstorereceipts/verifyreceipt