苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

时间:2024-02-25 16:44:56

 

苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

这是苹果wwdc2021 推出的新功能

参考官网链接

App Store Server API | Apple Developer Documentation

https://developer.apple.com/documentation/appstoreserverapi

 

先要通过 JWT签名

https://developer.apple.com/documentation/appstoreserverapi/generating_tokens_for_api_requests

 作者:Yanlongli <ahlyl94@gmail.com>

来源:博客园 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 - IM小白 - 博客园 (cnblogs.com)

参考以下PHP伪代码

        $privateKey = <<<key
-----BEGIN PRIVATE KEY-----
xxxx
-----END PRIVATE KEY-----
key;


$payload = [
\'iss\' => \'xxxxxx\',
"iat" => time() - 10,
"exp" => time() + 3590,
"aud" => "appstoreconnect-v1",
"nonce" => "随机字符串",
"bid" => "xxx.xxx.xxx.xxx",
];

$auth_token = JWT::encode($payload, $privateKey, \'ES256\', \'私钥id\');

iss 通过 https://appstoreconnect.apple.com/access/api 获得,操作路径是 用户和访问、密钥、App Store Connect API、
Issuer ID
bid 是应用的 bundleid
iat 当前时间戳,到秒的,-10 是测试发现,接口直接请求时有几率失败,应该时本地时间和苹果服务器时间有误差导致失败,减去10秒不影响请求,能忽略时间差。
exp 过期时间戳,在这个时间之后,该签名会失效,苹果文档给的是60分钟,应该可以更久,看你需求
nonce 随机字符串 6edffe66-b482-11eb-8529-0242ac130003 这是苹果给的格式,我也这么生成的,没测试是否任意随机字符串都可以
私钥id 通过在上面相同网址中,密钥页面,创建一个密钥,或者用已存在的密钥,列表会显示密钥id,注意该私钥仅允许下载一次,所以你要保存好,忘了的话就要创建一个新的密钥。

//
// 签名后通过get请求
https://api.storekit.itunes.apple.com/inApps/v1/lookup/{tradeNo}

headers 添加上认证方式
Authorization: Bearer {auth_token}
{tradeNo} 替换成用户邮件收到的订单号
{auth_token} 替换成上面伪代码的签名

请求成功会返回

{
"status": 0,
"signedTransactions": [
"header.payload.sign"
]
}

signedTransactions  的格式是  头.载体.签名

如果有需要自行处理签名验证,这里不验证了

将 signedTransactions 按 . 点分割,获取载体内容 payload,再将这个payload字符串base64解码,即可得到该订单的内容,参考如下


{
"transactionId": "xxx",  // 本次交易号
"originalTransactionId": "xxx", // 第一次交易号
"webOrderLineItemId": "xxx",
"bundleId": "com.xx.xx", // 应用的 bundleid
"productId": "com.xx.xx.xxx", // 套餐商品的唯一标识key
"subscriptionGroupIdentifier": "xx",  // 订阅组id
"purchaseDate": 1631718985000, // 支付时间
"originalPurchaseDate": 1599242074000, // 首次支付时间
"expiresDate": 1634310985000, // 过期时间,订阅有效
"quantity": 1, // 数量
"type": "Auto-Renewable Subscription", //类型 非订阅的是 Non-Renewing Subscription
"inAppOwnershipType": "PURCHASED",  // 
"signedDate": 1634625372402 // 请求响应的签名时间
}


其他api
https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/{originalTransactionId}

https://api.storekit.itunes.apple.com/inApps/v1/subscriptions/{originalTransactionId}