洪立兰 發表於 2021-10-19 16:33:00

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

<p>&nbsp;</p>
<pre><em id="__mceDel">苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功</em></pre>
<p>这是苹果wwdc2021 推出的新功能</p>
<p>参考官网链接</p>
<p>App Store Server API | Apple Developer Documentation</p>
<p>https://developer.apple.com/documentation/appstoreserverapi</p>
<p>&nbsp;</p>
<p>先要通过 JWT签名</p>
<p>https://developer.apple.com/documentation/appstoreserverapi/generating_tokens_for_api_requests</p>
<p>&nbsp;作者:Yanlongli &lt;ahlyl94@gmail.com&gt;</p>
<p>来源:博客园&nbsp;苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 - IM小白 - 博客园 (cnblogs.com)</p>
<p>参考以下PHP伪代码</p>
<pre>      $privateKey = &lt;&lt;&lt;key<br>-----BEGIN PRIVATE KEY-----<br>xxxx<br>-----END PRIVATE KEY-----<br>key;<br><br><br>      $payload = [<br>            'iss' =&gt; 'xxxxxx',<br>            "iat" =&gt; time() - 10,<br>            "exp" =&gt; time() + 3590,<br>            "aud" =&gt; "appstoreconnect-v1",<br>            "nonce" =&gt; "随机字符串",<br>            "bid" =&gt; "xxx.xxx.xxx.xxx",<br>      ];<br><br>      $auth_token = JWT::encode($payload, $privateKey, 'ES256', '私钥id');</pre>
<pre><em><br>iss 通过 https://appstoreconnect.apple.com/access/api 获得,操作路径是   用户和访问、密钥、App Store Connect API、</em>Issuer ID<br>bid 是应用的 bundleid</pre>
<pre>iat 当前时间戳,到秒的,-10 是测试发现,接口直接请求时有几率失败,应该时本地时间和苹果服务器时间有误差导致失败,减去10秒不影响请求,能忽略时间差。</pre>
<pre>exp 过期时间戳,在这个时间之后,该签名会失效,苹果文档给的是60分钟,应该可以更久,看你需求<br>nonce 随机字符串 6edffe66-b482-11eb-8529-0242ac130003这是苹果给的格式,我也这么生成的,没测试是否任意随机字符串都可以</pre>
<pre>私钥id 通过在上面相同网址中,密钥页面,创建一个密钥,或者用已存在的密钥,列表会显示密钥id,注意该私钥仅允许下载一次,所以你要保存好,忘了的话就要创建一个新的密钥。</pre>
<pre><em id="__mceDel"><br>// <br>// 签名后通过get请求</em></pre>
<pre>https://api.storekit.itunes.apple.com/inApps/v1/lookup/{tradeNo}<br><br>headers 添加上认证方式<br>Authorization: Bearer {auth_token}</pre>
<pre>{tradeNo} 替换成用户邮件收到的订单号</pre>
<pre>{auth_token} 替换成上面伪代码的签名<br><br>请求成功会返回</pre>
<p>{<br>"status": 0,<br>"signedTransactions": [<br>    "header.payload.sign"<br>]<br>}</p>
<p>signedTransactions&nbsp; 的格式是&nbsp; 头.载体.签名</p>
<p>如果有需要自行处理签名验证,这里不验证了</p>
<p>将&nbsp;signedTransactions 按 . 点分割,获取载体内容 payload,再将这个payload字符串base64解码,即可得到该订单的内容,参考如下</p>
<pre></pre>
<p>{<br>"transactionId": "xxx",&nbsp; // 本次交易号<br>"originalTransactionId": "xxx", // 第一次交易号<br>"webOrderLineItemId": "xxx",<br>"bundleId": "com.xx.xx", // 应用的 bundleid<br>"productId": "com.xx.xx.xxx", // 套餐商品的唯一标识key<br>"subscriptionGroupIdentifier": "xx",&nbsp; // 订阅组id<br>"purchaseDate": 1631718985000, // 支付时间<br>"originalPurchaseDate": 1599242074000, // 首次支付时间<br>"expiresDate": 1634310985000, // 过期时间,订阅有效<br>"quantity": 1, // 数量<br>"type": "Auto-Renewable Subscription", //类型 非订阅的是&nbsp;Non-Renewing Subscription<br>"inAppOwnershipType": "PURCHASED",&nbsp; //&nbsp;<br>"signedDate": 1634625372402 // 请求响应的签名时间<br>}</p>
<pre><br>其他api<br>https://api.storekit-sandbox.itunes.apple.com/inApps/v1/history/{originalTransactionId}<br><br><span class="token-baseURL" data-v-c98d4a62="" data-v-2ca63188="">https://api.storekit.itunes.apple.com/inApps/v1<span class="token-path" data-v-c98d4a62="" data-v-2ca63188="">/subscriptions/<span class="token-parameter" data-v-c98d4a62="" data-v-2ca63188="">{originalTransactionId}</span></span></span></pre><br><br>
来源:https://www.cnblogs.com/yanlongli/p/15425293.html
頁: [1]
查看完整版本: 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功