复制步骤:
我收到的google play商店通知如下:
{
"version": "1.0",
"packageName": "package.name",
"eventTimeMillis": "111111111111",
"subscriptionNotification": {
"version": "1.0",
"notificationType": 4,
"purchaseToken": "purchase token",
"subscriptionId": "first_subscription"
}
}
当我打电话给订阅获取api时,我得到了这样的信息:
{
"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,那么如何标识用户呢?
发布于 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将发送更新通知,而我们的服务器不需要发送订阅确认,因此在这种情况下,显然您不必确认订阅购买。
https://stackoverflow.com/questions/69762817
复制相似问题