将Flutter包 in_app_purchase: ^3.2.3集成到苹果应用内购买中,但支付完成后,后端的appAccountToken显示为null
在我的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)的问题也得到解决。