You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:36:04