将Flutter包 in_app_purchase: ^3.2.3集成到苹果应用内购买中,但支付完成后,后端的appAccountToken显示为null

移动开发 2026-07-08

在我的Flutter应用中,我集成了 in_app_purchase: ^3.2.3,用于 Apple InAppPurchases

我的后端使用Java。

我把PurchaseParam设置成如下:

final purchaseParam = PurchaseParam(productDetails: product, applicationUserName: "$userID|$myCustomOrderID");

await _iAP.buyConsumable(
    purchaseParam: purchaseParam);

支付完成后,我会把数据发送到后端:

{
  "productID": purchase.productID,
  "verificationData": purchase.verificationData.serverVerificationData,
}

在这里,purchase的类型是

PurchaseDetails

我的后端会拿到 "purchase.verificationData.serverVerificationData",并通过调用Apple InAppPurchase的 Java库中的方法来获取相关交易信息。

但后端得到的是:appAccountToken=null

返回结果:

WSTransactionDecodedPayload{originalTransactionId='20000****', transactionId='23534534534531', webOrderLineItemId='null', bundleId='com.hik.per', productId='mv_beginner_156', subscriptionGroupIdentifier='null', purchaseDate=1780639615000, originalPurchaseDate=1780639615000, expiresDate=null, quantity=1, type='Consumable', appAccountToken=null, inAppOwnershipType='PURCHASED', signedDate=1780639619905, revocationReason=null, revocationDate=null, isUpgraded=null, offerType=null, offerIdentifier='null', environment='Sandbox', storefront='IND', storefrontId='143467', transactionReason='PURCHASE', price=150000, currency='INR', offerDiscountType='null', appTransactionId='70559876545671681177', offerPeriod='null', revocationType='null', revocationPercentage=null, advancedCommerceInfo=null, billingPlanType='null', commitmentInfo=null, unknownFields={deviceVerification=qDSO8ySeKZmuvzghsdfghjhgfd5PcRkhfPiX1KuqbGTknh0zS51NygYuHLLhM, deviceVerificationNonce=6f64b7a8-b67f-487d-b2ca-5e0d535a702d}}

为什么 appAccountToken 会变成 null,因为我在 PurchaseParam 中正确设置了 applicationUserName

applicationUserName: "$userID|$myCustomOrderID" // here userID and myCustomOrderID is not null.

并且 appAccountToken 对获取userID和 myCustomOrderID非常重要,因为我的后端用它把购买的内容映射到userId?

在这里我使用 SandBoxTesting 在苹果设备上测试购买。

解决方案

我找到了这个解决方案: 支付完成后需要调用以下:

     if (purchase.pendingCompletePurchase) {
       await InAppPurchase.instance.completePurchase(purchase);
     }

其实它解决了我的两个问题: 1. appAccountToken为空的问题得到解决 2.付款完成后未触发后端的App Store服务器通知(webhook)的问题也得到解决。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章