【苹果支付二】apple pay苹果支付以及自动续订订阅开发

Song4071 次浏览0个评论2020年07月03日

一、APP端获取数据

1、订阅后APP端会获取到如下信息:

{
 "payment": {
  "productid": "1",
  "quantity": "1"
 },
 "transactionDate": "2020-07-04 10:06:42",
 "transactionIdentifier": "100000...",
 "transactionReceipt": "ewoJInNpZ25hdHVyZSIgPSA...",
 "transactionState": "1",
 "errMsg": "requestPayment:ok"
}

2、沙盒续期时间是缩短了的,并且会在5次续订(一共6条收据)后自动取消

续期时间

二、验证收据(调用apple server的接口)

1.普通购买收据验证

验收接口如下:

  • 沙盒:https://sandbox.itunes.apple.com/verifyReceipt
  • 生产环境:https://buy.itunes.apple.com/verifyReceipt

参数如下,transactionReceipt为返回的凭证

{
    "receipt-data" : transactionReceipt
}

注意:这里是POST推送json参数,以Laravel使用guzzle 发送请求为例:

use GuzzleHttp\Client;

···
$client = new Client();
$transactionReceipt = "ewoJInNpZ25hd...";
$response = $client->request('POST', 'https://sandbox.itunes.apple.com/verifyReceipt', ['json' => ["receipt-data"=>$transactionReceipt]]);
$body = json_decode($response->getBody());
dd($body);

2、自动续费收据验证

自动订阅的收据验证接口和其他IAP一样,只是需要加入password参数:

{
    "receipt-data": "(actual receipt bytes here)",
    "password": "(shared secret bytes here)"
}

Laravel PHP调用如需啊

$client = new Client();
$transactionReceipt = "ewoJInNpZ25hd...";
$response = $client->request('POST', 'https://sandbox.itunes.apple.com/verifyReceipt', ['json' => ["receipt-data"=>$transactionReceipt,,"password"=>"2d745..."]]);
$body = json_decode($response->getBody());
dd($body);
  • password是在App Store connect上创建的秘钥

password

三、返回数据说明

a、auto_renew_status: 订阅自动续订状态
  • 1:-订阅将在当前订阅期结束时续订。
  • 0:-客户已关闭其订阅的自动续订。
b、status: 状态码

参考ios 订阅类收据的服务器处理

一般票据会有3种情况:

  • 0:刚付费,有效状态
  • 21006:时间到了,没有续费
  • 0:时间到了后,又续费了,返回的为0,即使是之前返回21006 的老凭据,只要续费后也返回0。
c、auto_renew_product_id: 在Apple App Store中标识产品的字符串。即产品ID
d、expires_date: 订阅的过期时间
e、original_transaction_id: 初次购买的交易标识。所有订阅的更新和恢复交易都共享这个标识。
f、original_purchase_date: 初次购买(订阅)的日期。
g、purchase_date: 交易的日期。对于更新订阅的交易来说,这个日期表示更新日期。如果从App Store解析的数据是最新的订阅收据,这个值表示最近更新订阅的日期。
h、latest_receipt:新的收据,即每次用户续订后返回新的latest_receipt凭证,

注意:必须使用新的凭证才能查询新的续约信息,如果无新的续费信息则latest_receipt值不会改变。可以对比latest_receipt值判断是否有新的续费信息。

i、receipt、latest_expired_receipt_info、latest_receipt_info:返回数据,三个返回的数据类型是一样的、优先使用receipt,使用老的收据返回latest_receipt_info,使用新的收据则返回latest_expired_receipt_info

各种状态操作流程参考【苹果支付一】应用内购买(IAP)各类型在服务端的验证规则

字段解释参考:Receipt Fields或者iOS内购 服务器文档 摘要

四、App Store状态回调

APPStore输入用于接收App Store服务器通知的网址(URL)

Subscription_Status_URL.png

配置此url后,apple会在以下状态时调用配置的接口。

notification_type

  • CANCEL:取消了订阅
  • DID_CHANGE_RENEWAL_PREF:取消了订阅,在sandbox测试时,6次收据之后,就会变成这个状态
  • DID_CHANGE_RENEWAL_STATUS:是各种状态改变下都会调用,比如说首次购买会收到两次回调,一个是INITIAL_BUY一个是DID_CHANGE_RENEWAL_STATUS
  • DID_FAIL_TO_RENEW:由于结算问题,订阅无法续订
  • DID_RECOVER:App Store通过计费重试恢复了已过期的订阅
  • INITIAL_BUY:首次订阅成功
  • INTERACTIVE_RENEWAL:恢复了订阅,在sandbox测试时,6次收据之后,重新订阅,就会是这个状态
  • RENEWAL:恢复了订阅
  • REFUND:AppleCare成功退还了有关消耗性,非消耗性或非续订订阅的交易

参考文档: notification_type

更多相关好文

    当前暂无更多相关好文推荐...