服務(wù)端驗(yàn)證自動續(xù)期訂閱的收據(jù)過程如下:
服務(wù)端收到客戶端發(fā)送的收據(jù)后,向蘋果服務(wù)器發(fā)送post請求
蘋果測試環(huán)境 https://sandbox.itunes.apple.com/verifyReceipt,
蘋果生產(chǎn)環(huán)境 https://buy.itunes.apple.com/verifyReceipt
請求的http body是json格式,receipt-data字段對應(yīng)的就是收據(jù)數(shù)據(jù),password字段對應(yīng)蘋果開發(fā)賬號設(shè)置的秘鑰,exclude-old-transactions字段為true時(shí),可過濾掉大部分舊的購買,只顯示新的訂閱。例如:
{
"exclude-old-transactions":true,
"password": "***",
"receipt-data":"***"
}
蘋果服務(wù)器返回的http body里的status字段對應(yīng)的是收據(jù)狀態(tài),若為0,則收據(jù)為真。
在receipt字段里,bundle_id 是APP的固定ID,可用于檢查收據(jù)是否屬于我們的APP。
在latest_receipt_info數(shù)組里,遍歷數(shù)據(jù),找到最大的expires_date,這個(gè)是訂閱過期的日期,也可用expires_date_ms或expires_date_pst字段。服務(wù)器應(yīng)保存該字段到數(shù)據(jù)庫
product_id 是商品id,要與購買的商品ID相符才有效。
web_order_line_item_id 是本次購買的ID
original_transaction_id 是第一次訂閱的交易ID,服務(wù)器應(yīng)保存該字段到數(shù)據(jù)庫
例如
{
? "status": 0,
? "environment": "Sandbox",
? "receipt": {
? ? "receipt_type": "ProductionSandbox",
? ? "adam_id": 0,
? ? "app_item_id": 0,
? ? "bundle_id": "***",
? ? "application_version": "6",
? ? "download_id": 0,
? ? "version_external_identifier": 0,
? ? "receipt_creation_date": "2019-11-28 05:38:19 Etc/GMT",
? ? "receipt_creation_date_ms": "1574919499000",
? ? "receipt_creation_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",
? ? "request_date": "2019-11-28 08:18:12 Etc/GMT",
? ? "request_date_ms": "1574929092579",
? ? "request_date_pst": "2019-11-28 00:18:12 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": "***",
? ? ? ? "transaction_id": "1000000598465716",
? ? ? ? "original_transaction_id": "1000000598465716",
? ? ? ? "purchase_date": "2019-11-28 05:38:19 Etc/GMT",
? ? ? ? "purchase_date_ms": "1574919499000",
? ? ? ? "purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",
? ? ? ? "original_purchase_date": "2019-11-28 05:38:19 Etc/GMT",
? ? ? ? "original_purchase_date_ms": "1574919499000",
? ? ? ? "original_purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",
? ? ? ? "expires_date": "2019-11-28 05:43:19 Etc/GMT",
? ? ? ? "expires_date_ms": "1574919799000",
? ? ? ? "expires_date_pst": "2019-11-27 21:43:19 America/Los_Angeles",
? ? ? ? "web_order_line_item_id": "1000000048591202",
? ? ? ? "is_trial_period": "false",
? ? ? ? "is_in_intro_offer_period": "false"
? ? ? }
? ? ]
? },
? "latest_receipt_info": [
? ? {
? ? ? "quantity": "1",
? ? ? "product_id": "***",
? ? ? "transaction_id": "1000000594693615",
? ? ? "original_transaction_id": "1000000594693615",
? ? ? "purchase_date": "2019-11-20 06:33:11 Etc/GMT",
? ? ? "purchase_date_ms": "1574231591000",
? ? ? "purchase_date_pst": "2019-11-19 22:33:11 America/Los_Angeles",
? ? ? "original_purchase_date": "2019-11-20 06:33:11 Etc/GMT",
? ? ? "original_purchase_date_ms": "1574231591000",
? ? ? "original_purchase_date_pst": "2019-11-19 22:33:11 America/Los_Angeles",
? ? ? "is_trial_period": "false"
? ? },
? ? {
? ? ? "quantity": "1",
? ? ? "product_id": "***",
? ? ? "transaction_id": "1000000598475362",
? ? ? "original_transaction_id": "1000000598465716",
? ? ? "purchase_date": "2019-11-28 06:03:19 Etc/GMT",
? ? ? "purchase_date_ms": "1574920999000",
? ? ? "purchase_date_pst": "2019-11-27 22:03:19 America/Los_Angeles",
? ? ? "original_purchase_date": "2019-11-28 05:38:19 Etc/GMT",
? ? ? "original_purchase_date_ms": "1574919499000",
? ? ? "original_purchase_date_pst": "2019-11-27 21:38:19 America/Los_Angeles",
? ? ? "is_trial_period": "false",
? ? ? "expires_date": "2019-11-28 06:08:19 Etc/GMT",
? ? ? "expires_date_ms": "1574921299000",
? ? ? "expires_date_pst": "2019-11-27 22:08:19 America/Los_Angeles",
? ? ? "web_order_line_item_id": "1000000048591627",
? ? ? "is_in_intro_offer_period": "false",
? ? ? "subscription_group_identifier": "20577287"
? ? }
? ],
? "latest_receipt": "***",
? "pending_renewal_info": [
? ? {
? ? ? "auto_renew_product_id": "jfldsjf",
? ? ? "original_transaction_id": "1000000598465716",
? ? ? "product_id": "jfldsjf",
? ? ? "auto_renew_status": "0",
? ? ? "expiration_intent": "1",
? ? ? "is_in_billing_retry_period": "0"
? ? }
? ]
}
收據(jù)應(yīng)該保存在服務(wù)器里,當(dāng)訂閱到期時(shí),再次用收據(jù)向蘋果發(fā)送請求,更新用戶的訂閱到期時(shí)間。
在latest_receipt_info數(shù)組里,用original_transaction_id找到對應(yīng)的交易,查看expires_date。若expires_date是過去的日期,表示用戶沒有續(xù)訂。若expires_date是未來的日期,表示用戶已續(xù)訂。更新用戶的過期日期。
latest_receipt是最新的收據(jù),應(yīng)保存到服務(wù)器數(shù)據(jù)庫里,替換舊收據(jù)。
pending_renewal_info里的auto_renew_status表示是否還可能有后續(xù)的訂閱,若為0表示用戶已取消訂閱
is_in_billing_retry_period為1表示用戶支付信息有問題,蘋果正在嘗試重新扣款(最長持續(xù)60天),為0表示蘋果停止重新扣款。
對于用戶退款、更改訂閱的行為的檢查,服務(wù)器可與蘋果建立服務(wù)端的連接,獲取用戶的訂閱狀態(tài)變化通知。開發(fā)賬戶中要設(shè)置服務(wù)器的URL。