微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Google Play Developer API - 为什么在用户执行重新订阅时找不到linkedPurchaseToken?

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

  1. 取消订阅
  2. 几天后重新订阅

我们必须知道,旧的购买令牌和新的购买令牌都指向同一个用户

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

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

我们希望可以从 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,'cancelReason':3,'orderId':'GPA.3358-9904-1003-13416','kind':'androidpublisher#subscriptionPurchase'
}

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

在 Google Play Console 中,即使订单 id 不同,也可以判断订阅来自同一用户但是,没有办法知道,通过 Google Play Developer API 响应。

enter image description here


我们最初的猜测是,这可能是因为我们的 Google Play 管理中心未启用重新订阅功能

enter image description here

但是,目前,我们所有的生产/测试/测试 APK 很久以前都已升级到 3.0.1。因此,我们不确定是否存在“您的用户目前无法重新订阅,因为您的应用未在所有活动 APK 中使用 Billing Library 2.0。”消息。

知道如何确定最新的活跃订阅和取消的非活跃订阅实际上指的是同一个用户吗?

解决方法

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

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

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

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?