Flutter中通过RTDN关联Android内购与用户ID的方案咨询
解决Android内购与用户ID关联的可行方案
针对你使用in_app_purchase插件的场景,以下是几种让后端在Google Play实时通知(RTDN)中获取用户ID的可行方案:
方案1:使用Google Play官方账号关联字段(推荐)
Google Play原生支持在发起购买时传入accountId(对应RTDN通知中的obfuscatedAccountId),专门用于关联用户身份。在Flutter中需要使用Android专属的GooglePlayPurchaseParam来传递该参数:
// 导入Android专属购买参数类 import 'package:in_app_purchase_android/in_app_purchase_android.dart'; // 构建Android购买参数并传入用户ID final purchaseParam = GooglePlayPurchaseParam( productDetails: productDetails, accountId: SessionData().currentUser?.id, // 传入你的用户ID ); // 发起订阅购买(一次性商品用buyNonConsumable) InAppPurchase.instance.buySubscriptions(purchaseParam: purchaseParam);
后端接收RTDN通知时,可从通知体的subscriptionNotification(订阅场景)或oneTimeProductNotification(一次性商品场景)节点下,读取obfuscatedAccountId字段获取用户ID。该字段会被Google轻度混淆,但不影响唯一性,可直接用于用户关联。
方案2:自定义开发者负载(Developer Payload)
你也可以通过developerPayload字段传递用户ID,同样需要使用GooglePlayPurchaseParam:
final purchaseParam = GooglePlayPurchaseParam( productDetails: productDetails, developerPayload: SessionData().currentUser?.id, // 将用户ID放入负载 ); InAppPurchase.instance.buySubscriptions(purchaseParam: purchaseParam);
后端在RTDN通知中,可从purchase对象的developerPayload字段读取用户ID。注意该字段有100字符长度限制,建议仅传递轻量身份信息,不要存放敏感数据。
方案3:前端主动关联订单与用户ID(兜底方案)
如果上述方案因插件版本或配置问题无法生效,可在购买成功后由前端主动将订单核心信息与用户ID绑定并同步到后端:
// 监听购买状态流 final StreamSubscription<List<PurchaseDetails>> purchaseSubscription = InAppPurchase.instance.purchaseStream.listen((List<PurchaseDetails> detailsList) { for (var details in detailsList) { if (details.status == PurchaseStatus.purchased) { final userId = SessionData().currentUser?.id; if (userId != null) { // 调用后端接口,传递订单token和用户ID await yourBackendApi.bindOrderUser( purchaseToken: details.purchaseToken, userId: userId, ); } } } });
后端后续收到RTDN通知时,可通过通知中的purchaseToken查询已存储的用户ID,完成关联。
内容的提问来源于stack exchange,提问作者Ahmed Yacoub
相关产品推荐
相关产品推荐

