V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
burden7
V2EX  ›  Flutter

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

  •  
  •   burden7 · 31 天前 · 518 次点击

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

    • Validating receipts with the App Store Deprecated
    • Get Transaction History

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

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

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

    2/2

    4 条回复    2025-06-20 11:28:11 +08:00
    yuservanteshar94
        1
    yuservanteshar94  
       31 天前   ❤️ 1
    有服务端推荐用 服务端通知回调 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
        2
    burden7  
    OP
       31 天前
    @yuservanteshar94 谢谢,我来研读一下(补充问一句,订阅支付有这个通知吗)
    yuservanteshar94
        3
    yuservanteshar94  
       31 天前   ❤️ 1
    @burden7 #2 订阅通知很早就有了。此外,方式一里的票据验证没有密码,21002 就是票据校验不通过。注意一点 post 数据时 receipt-data 需要进行 base64 编码
    ```
    'receipt-data' => base64_encode(xxxxx)
    ```

    这个票据验证很多坑,一定做好校验,比如相同 cp 订单号不要重复发送。appAccountToken 校验一定要做。防止有人弄票据池刷你。
    justtokankan
        4
    justtokankan  
       28 天前
    建议你直接只做 storekit2 的方案
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 23:01 · PVG 07:01 · LAX 16:01 · JFK 19:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.