Google Play Developer API - 为啥在用户执行重新订阅时找不到linkedPurchaseToken?

Posted

技术标签:

【中文标题】Google Play Developer API - 为啥在用户执行重新订阅时找不到linkedPurchaseToken?【英文标题】:Google Play Developer API - Why linkedPurchaseToken is not found when user perform resubscribe?Google Play Developer API - 为什么在用户执行重新订阅时找不到linkedPurchaseToken? 【发布时间】:2021-07-18 06:14:47 【问题描述】:

在我们的后端服务器中,当用户

    取消订阅。 几天后重新订阅。

重要的是我们要知道,旧的购买令牌和新的购买令牌都是指同一个用户。

原因是,之前,用户已经使用旧的取消订阅购买令牌在服务器中创建了一些数据。

当用户取消订阅并再次重新订阅时,我们希望确保用户仍然有权使用新的购买令牌访问旧数据。

我们希望我们可以从linkedPurchaseToken 获取信息,其中新的购买令牌将指向旧的购买令牌。

这在https://medium.com/androiddevelopers/implementing-linkedpurchasetoken-correctly-to-prevent-duplicate-subscriptions-82dfbf7167da中有描述

但是,根据我们的测试结果,情况并非如此。

Google Play 开发者 API

credentials = service_account.Credentials.from_service_account_file(
    constant.PATH_TO_SERVICE_ACCOUNT_JSON, 
    scopes = constant.SCOPES
)
    
androidpublisher = googleapiclient.discovery.build(
    'androidpublisher', 
    'v3', 
    credentials = credentials
)

product = androidpublisher.purchases().subscriptions().get(
    packageName = "com.xxx.yyy",
    subscriptionId = product_id,
    token = token
).execute()

return product

当前有效订阅


   'startTimeMillis':'1619245597271',
   'expiryTimeMillis':'1619246015249',
   'autoRenewing':True,
   'priceCurrencyCode':'SGD',
   'priceAmountMicros':'6980000',
   'countryCode':'SG',
   'developerPayload':'',
   'paymentState':1,
   'orderId':'GPA.3314-4833-2752-47988',
   'purchaseType':0,
   'acknowledgementState':1,
   'kind':'androidpublisher#subscriptionPurchase'

之前取消的订阅


   'startTimeMillis':'1619244776697',
   'expiryTimeMillis':'1619245074590',
   'autoRenewing':False,
   'priceCurrencyCode':'SGD',
   'priceAmountMicros':'6980000',
   'countryCode':'SG',
   'developerPayload':'',
   'cancelReason':3,
   'orderId':'GPA.3358-9904-1003-13416',
   'purchaseType':0,
   'acknowledgementState':1,
   'kind':'androidpublisher#subscriptionPurchase'


我们没有linkedPurchaseToken 信息。因此,我们无法知道,两个订阅都指向同一个用户。

在 Google Play Console 中,即使订单 ID 不同,它也能分辨出订阅来自同一用户。 但是,无法通过 Google Play Developer API 响应来知道这些。


我们最初的猜测是,这可能是由于我们的 Google Play 管理中心没有启用重新订阅功能。

但是,目前,我们所有的生产/测试版/测试版 APK 早已升级到 3.0.1。因此,我们不确定是否存在这样的“Resubscribe 目前对您的用户不可用,因为您的应用并未在所有活动 APK 中使用 Billing Library 2.0。”消息。

任何想法,我们如何找出最新的有效订阅和取消的非有效订阅是否实际上指的是同一用户?

【问题讨论】:

【参考方案1】:

在取消的原始订阅到期之前重新订阅将重新使用相同的购买令牌。原订阅过期后重新订阅被视为新购买,因此您将获得全新的购买令牌,并且不会设置linkedPurchaseToken字段。链接购买令牌字段将仅针对升级和降级流程设置。见Purchase Tokens and Order IDs docs。

过去,为重新订阅流程设置了linkedPurchaseToken,如果您在原始订阅到期之前取消并重新订阅,就会发生这种情况。使用Resubscribe 不再是这种情况。 (请注意,Medium 文章有 an updated note 和此信息 - 免责声明我是那篇文章的作者)。具体来自重新订阅文档:

恢复的订阅使用与取消订阅时相同的 purchaseToken。从资源中清除所有取消字段。

所以不会设置linkedPurchaseToken。注意:这只发生在重新订阅发生在原始订阅到期之前

在您上面提供的购买示例中,在我看来,第二次购买似乎发生在 原始第一次订阅过期之后。 (来自新订阅的'startTimeMillis':'1619245597271'大于来自旧订阅的'expiryTimeMillis':'1619245074590',因此旧订阅已经过期。在这种情况下,新订阅被视为具有全新购买令牌的全新订阅。

在回答您如何将两次购买联系在一起的问题时,答案是您不能在设计上仅使用 Google Play 提供的信息。每个购买令牌及其相关信息不包含用户身份信息。

但是,当您说第一次购买时保存了“[服务器中的数据”时,我认为您有一个带有某种用户帐户的后端服务器。在这种情况下,您应该在您的后端服务器和您自己的代码中将两次购买与特定用户相关联。这是执行此操作的正确方法(请参阅Classy Taxi sample)。

注意:我注意到 upgrade/downgrade docs 仍然提到过时的重新注册。

【讨论】:

感谢详细的回答。哈哈。我像圣经一样阅读了整篇媒体文章,执行服务器端实现。现在只有我意识到信息已经过时了。【参考方案2】:

在我看来,这似乎是一个错误,不仅它不发送 linkedPurchaseToken,而且还存在 obfuscatedExternalAccountIdobfuscatedExternalProfileId原始购买。

所以似乎没有办法将重新订阅链接到重新订阅的用户并授予他们购买的物品。

您可以尝试从 Play 控制台的“订单管理”页面手动链接订单,但这不太实用。

据我所知,唯一的选择似乎是从 Play 控制台的订阅设置页面禁用“重新订阅”功能。

【讨论】:

以上是关于Google Play Developer API - 为啥在用户执行重新订阅时找不到linkedPurchaseToken?的主要内容,如果未能解决你的问题,请参考以下文章

Google Play Developer API - 超出配额

获取访问令牌Google Play Android Developer API

获取访问令牌 Google Play Android Developer API

使用 Google Play Developer API 取消发布应用

Google Play Android Developer API - 列出权利 - “权限不足”

查询 Google Play Developer API 时出现意外错误