首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Google商店在过期后重新订阅时不返回obfuscatedExternalAccountId

Google商店在过期后重新订阅时不返回obfuscatedExternalAccountId
EN

Stack Overflow用户
提问于 2021-10-29 02:06:10
回答 1查看 426关注 0票数 2

复制步骤:

  1. 订阅应用程序中的订阅
  2. 到google商店并取消订阅。
  3. 回到订阅页面
  4. 等待订阅到期
  5. 订阅将显示在过期标题下面。
  6. 点击重新订阅。

我收到的google play商店通知如下:

代码语言:javascript
运行
复制
{
    "version": "1.0",
    "packageName": "package.name",
    "eventTimeMillis": "111111111111",
    "subscriptionNotification": {
        "version": "1.0",
        "notificationType": 4,
        "purchaseToken": "purchase token",
        "subscriptionId": "first_subscription"
    }
}

当我打电话给订阅获取api时,我得到了这样的信息:

代码语言:javascript
运行
复制
{
    "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"
}

如果我既没有obfuscatedExternalAccount id,也没有要查询的linkedPurchaseToken,那么如何标识用户呢?

EN

Stack Overflow用户

发布于 2022-03-15 15:57:33

编辑:

让我尽量直截了当地说:

尽管Google中的按钮显示“重新订阅”,但您可以看到您的通知数据显示"notificationType": 4,实际上是一种全新订阅的购买。这是一个“应用程序外”的购买场景。谷歌的通知不会告诉你在这种情况下是谁购买了这个应用程序。

我对此也不满意。谷歌对开发人员投入了大量精力来处理这个用例。

让我们从正常的用例开始:在应用程序中购买

在我的例子中,我们的应用程序有一个后端来处理身份验证和授权(我们没有使用Firebase进行身份验证,如果我们这样做,这可能会大大简化问题)。

我们有跟踪用户订阅的表。它有用户id、购买令牌和过期日期(加上一些其他数据)。购买令牌是唯一的密钥,这在以后很重要。

第一步是登录用户注册。用户输入凭据后,应用程序向服务器发送请求,以创建新的用户身份。

下一步是订阅购买。当应用程序收到购买通知后,它会请求服务器将购买令牌与新创建的用户关联起来。当这种情况发生时,Google正在向我们的服务器发出购买通知请求。我们不知道这些请求将以什么顺序发生(种族条件)。

(我们可以使用obfuscatedAccountId获取用户id吗?我想,但这仍然不能帮助我们解决应用程序外的购买问题。另外,该应用程序的请求告诉服务器将请求发送到Google以确认订阅购买。)

来自应用程序的请求具有用户身份。来自RTDN的请求具有其他数据,如过期日期。这两个请求都有购买令牌。

我们的系统使用INSERT ... ON DUPLICATE UPDATE,这样第一个请求将使用购买令牌键创建一个记录,第二个请求将更新已经创建的记录。(购买令牌唯一的密钥使之成为可能。)

通过使用“insert-或-update”,系统不必关心这些请求的顺序。一旦处理了这两个请求,我们就有了用户许可/订阅的完整图片。

当用户再次登录时,我们可以参考这些数据,这些数据显示用户拥有基于他们的Google订阅的许可证。

效果很好..。直到该应用程序没有发送它的请求。然后我们有一个空用户id -这意味着系统有一个“孤儿”订阅,我们不知道谁拥有它。

这就把我们带到了:的应用程序外的购买

在这种情况下,我们得到RTDN请求,而不是app请求。我们已经有了系统中的用户标识,但它与购买令牌没有关联。

处理这种情况的方法只有一种:每次应用程序启动时,它都必须在计费客户端库上调用queryPurchasesAsync(),以检查是否有Google订阅而没有相应的用户许可证。

如果应用程序检测到这一点,它会立即发送购买请求,以更新订阅表,并将用户分配给“孤儿”订阅。

希望这能更清楚地解释这个问题。

我强烈建议深入研究谷歌的游戏计费-示例代码,以了解它们如何使用计费客户端库并处理不同的用例。

我们正在为我们的应用程序实现订阅,我刚刚遇到了这个问题。

在查看了所有文档之后,我得出的结论是,谷歌希望您的应用程序在应用程序启动时查询计费客户端库,如果queryPurchasesAsync()返回您的许可数据服务所称过期的SKU,您的应用程序将向您的服务发送一个请求,以便相应地更新您的许可数据。

queryPurchasesAsync / BillingClient / Android开发人员

我建议请求处理程序在更新许可证数据之前通过查询Developer来检查购买令牌。

方法: purchases.subscriptions.get \ Google的计费系统

这意味着Google Play和您的服务都是真实的来源,因此您的许可模式和流程需要支持这个奇怪的用例:创建订阅并稍后将其分配给用户。

另外,我们已经看到,Developer将发送更新通知,而我们的服务器不需要发送订阅确认,因此在这种情况下,显然您不必确认订阅购买。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69762817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档