我通过in_app_purchase
拿到PurchaseDetails
后,我把其中的serverVerificationData
传递给服务端,但是怎么也验证不成功。
我去看了 apple 开发文档,里面提到了两种验证方式
Deprecated
第一种方式,得到状态码一直是 21002 ,不清楚是 password 出了问题还是 recipt-data 出了问题(后者我就是拿 APP 获取到的 serverVerificationData 传递的)
第二种方式,chatGPT 告诉我需要通过以 JWT 的格式解析 serverVerificationData ,拿到 originalTransactionId ,但是当我在沙盒模式下多次购买一次性物品的时候,serverVerificationData 并不是一个 JWT 格式( GPT 给出的提示说需要通过 split(".")来获取三段信息,才是 JWT 格式)
如果有了解过流程的大佬,希望帮我指出问题所在,感恩!!
2/2
1
yuservanteshar94 31 天前 ![]() 有服务端推荐用 服务端通知回调 https://developer.apple.com/documentation/AppStoreServerNotifications ,5 月 27 日起一次性消耗品支付通知( https://developer.apple.com/documentation/appstoreservernotifications/app-store-server-notifications-changelog#May-27-2025 )正式环境也可以用了,我们这边已经全面切到服务端回调了。
服务端收到通知回调,先校验 JWS 合法性( https://developer.apple.com/documentation/appstoreservernotifications/receiving-app-store-server-notifications ),解析出 payload ,然后验证订单有效性就行了,通过下发商品给用户就行了。 |
![]() |
2
burden7 OP @yuservanteshar94 谢谢,我来研读一下(补充问一句,订阅支付有这个通知吗)
|
3
yuservanteshar94 31 天前 ![]() @burden7 #2 订阅通知很早就有了。此外,方式一里的票据验证没有密码,21002 就是票据校验不通过。注意一点 post 数据时 receipt-data 需要进行 base64 编码
``` 'receipt-data' => base64_encode(xxxxx) ``` 这个票据验证很多坑,一定做好校验,比如相同 cp 订单号不要重复发送。appAccountToken 校验一定要做。防止有人弄票据池刷你。 |
4
justtokankan 28 天前
建议你直接只做 storekit2 的方案
|