Google Play Store订阅到期后续订未返回obfuscatedExternalAccountId问题
问题复现与背景
操作步骤
- 在应用内完成一款订阅商品的订阅流程
- 进入Google Play Store取消该订阅
- 返回应用的订阅页面
- 等待该订阅自然到期
- 到期后该订阅将展示在「已过期」分类栏下
- 点击该订阅的重新订阅按钮
收到的Google Play推送通知
{ "version": "1.0", "packageName": "package.name", "eventTimeMillis": "111111111111", "subscriptionNotification": { "version": "1.0", "notificationType": 4, "purchaseToken": "purchase token", "subscriptionId": "first_subscription" } }
订阅查询接口返回结果
调用Google Play Developer API的purchases.subscriptions.get接口查询订阅详情,返回结果如下:
{ "startTimeMillis": "1635472371631", "expiryTimeMillis": "1635472675112", "autoRenewing": false, "priceCurrencyCode": "EUR", "priceAmountMicros": "4300000", "countryCode": "IN", "developerPayload": "", "cancelReason": 1, "orderId": "GPA.3388-8947-4636-69596", "purchaseType": 0, "acknowledgementState": 0, "kind": "androidpublisher#subscriptionPurchase" }
核心疑问
当前既无法获取obfuscatedExternalAccountId,也没有对应的linkedPurchaseToken可用于查询,应该通过什么方式识别对应订阅的用户?
解决方案
你可以通过以下几种方式实现用户识别,按落地优先级排序如下:
- 本地绑定purchaseToken与用户ID:用户在应用内发起订阅、重新订阅操作时,Google Play Billing Library会在支付完成后立即将本次订阅对应的purchaseToken返回给客户端,你可以在该节点将purchaseToken与当前应用登录的用户ID绑定,上传到你的服务端做持久化存储。不需要依赖Play接口的扩展返回字段,即可直接完成映射。
- 通过orderId匹配历史订单:接口返回的
orderId字段可直接用于匹配你服务端存储的历史订单数据。如果是原有过期订阅的重新订阅,新的orderId会在原有orderId基础上追加..0、..1这类后缀,你可以通过匹配orderId前缀的方式关联到原始订阅所属的用户。 - 利用developerPayload字段传递用户标识:你当前返回结果中
developerPayload为空,后续可在客户端调起订阅支付时,将加密后的用户ID写入该字段。后续不管是接口查询还是Play推送通知,你都可以直接解析该字段拿到对应用户身份。 - 客户端回传订阅数据补全映射:如果没有历史绑定数据,你可以在应用启动时调用Billing Library的
queryPurchases()接口拉取当前设备上所有关联的订阅purchaseToken,回传到服务端和你收到的推送token做匹配,关联当前登录的用户ID。
内容的提问来源于stack exchange,提问作者Hemil
相关产品推荐
相关产品推荐

