求助贴!关于 Flutter 接入 in_app_purchase 内购服务端部分二次验证的

32 天前
 burden7

我通过in_app_purchase拿到PurchaseDetails后,我把其中的serverVerificationData传递给服务端,但是怎么也验证不成功。 我去看了 apple 开发文档,里面提到了两种验证方式

第一种方式,得到状态码一直是 21002 ,不清楚是 password 出了问题还是 recipt-data 出了问题(后者我就是拿 APP 获取到的 serverVerificationData 传递的)

第二种方式,chatGPT 告诉我需要通过以 JWT 的格式解析 serverVerificationData ,拿到 originalTransactionId ,但是当我在沙盒模式下多次购买一次性物品的时候,serverVerificationData 并不是一个 JWT 格式( GPT 给出的提示说需要通过 split(".")来获取三段信息,才是 JWT 格式)

如果有了解过流程的大佬,希望帮我指出问题所在,感恩!!

2/2

520 次点击
所在节点    Flutter
4 条回复
yuservanteshar94
32 天前
有服务端推荐用 服务端通知回调 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 ,然后验证订单有效性就行了,通过下发商品给用户就行了。
burden7
32 天前
@yuservanteshar94 谢谢,我来研读一下(补充问一句,订阅支付有这个通知吗)
yuservanteshar94
32 天前
@burden7 #2 订阅通知很早就有了。此外,方式一里的票据验证没有密码,21002 就是票据校验不通过。注意一点 post 数据时 receipt-data 需要进行 base64 编码
```
'receipt-data' => base64_encode(xxxxx)
```

这个票据验证很多坑,一定做好校验,比如相同 cp 订单号不要重复发送。appAccountToken 校验一定要做。防止有人弄票据池刷你。
justtokankan
29 天前
建议你直接只做 storekit2 的方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1139079

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX