Google Play 开发者 API - 为什么当用户执行重新订阅时找不到 linkedPurchaseToken?

Che*_*eng 3 android in-app-billing google-play google-play-developer-api google-play-console

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

  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
Run Code Online (Sandbox Code Playgroud)

当前活跃订阅

{
   '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'
}
Run Code Online (Sandbox Code Playgroud)

先前取消的订阅

{
   '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'
}
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述


我们最初的猜测是,这可能是由于我们的 Google Play Console 中未启用重新订阅功能。

在此输入图像描述

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

知道吗,我们如何才能查明最新的活跃订阅和取消的非活跃订阅实际上是否指的是同一用户?

Emi*_*lie 5

在原始取消的订阅到期之前重新订阅将重新使用相同的购买令牌。原始订阅已过期后重新订阅将被视为新购买,因此您将获得全新的购买令牌,并且不会设置 linkedPurchaseToken 字段。链接购买令牌字段实际上仅针对升级和降级流程进行设置。请参阅购买令牌和订单 ID 文档

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

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

所以linkedPurchaseToken不会被设置。注意:只有在原始订阅到期之前重新订阅时才会发生这种情况。

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

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

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

注意:我注意到升级/降级文档仍然提到重新注册,这已经过时了。