如何通过Flutter in_app_purchase获取匹配谷歌Webhook的购买令牌?
解决Flutter in_app_purchase购买令牌与Google Play Webhook不一致问题
你当前通过purchase.verificationData.serverVerificationData获取到的GPA开头值是订单ID(Order ID),并非Webhook中返回的真正购买令牌(Purchase Token)。要获取与Webhook一致的令牌,需直接从购买详情对象中提取purchaseToken属性,具体操作如下:
1. 区分购买类型并获取令牌
in_app_purchase库中,单次购买和订阅的购买对象类型不同,需分别处理:
针对单次购买(消耗品/非消耗品)
将PurchaseDetails转型为GooglePlayPurchaseDetails,直接读取purchaseToken字段:
if (purchase is GooglePlayPurchaseDetails) { String correctPurchaseToken = purchase.purchaseToken; // 将此值存入数据库即可与Webhook返回的令牌匹配 }
针对订阅
处理SubscriptionPurchase对象时,同样直接提取purchaseToken:
for (var purchase in subscriptionPurchases) { if (purchase is SubscriptionPurchase) { String correctPurchaseToken = purchase.purchaseToken; // 后续存储或验证逻辑 } }
2. 为什么之前的方式不对
serverVerificationData是Google提供的服务器验证用完整数据(通常是包含订单ID、购买令牌、商品ID等信息的结构化数据),你之前从中提取的GPA开头内容只是其中的订单ID,并非Webhook中使用的购买令牌。直接读取购买对象的purchaseToken属性,才能得到与Webhook完全一致的令牌值。
内容的提问来源于stack exchange,提问作者Henrique Postalli
相关产品推荐
相关产品推荐

