如何在服务器端验证Android应用程序的购买(谷歌在应用程序开发v3中播放)

vir*_*sir 81 android in-app-purchase in-app-billing

我有一个简单的应用程序(需要用户登录帐户).我为付费用户提供了一些高级功能,比如更多新闻内容.

我需要记录用户是否已在我的服务器数据库中购买此项目.当我向用户的设备提供数据内容时,我可以检查用户的状态,并为付费用户提供不同的内容.

我检查了Google提供的官方Trivialdrive示例,它没有提供任何服务器端验证的示例代码,这里是我的问题.

  1. 我发现样本使用我的应用程序的公钥来验证购买,它看起来不太好,我想我可以将验证过程移到我的服务器结合用户登录凭据,看看用户购买是否完成,然后更新数据库.
  2. 还有我可以用来查询的购买API,我需要的是将用户的purchaseToken传递到服务器.

我不确定我应该采用什么方法来验证用户的购买,并在我的数据库中标记用户的状态,可能两者都有?

我担心有一种情况,如果用户从谷歌播放购买此项目,但由于某种原因,就在那个时候,当我的应用程序启动验证到我的服务器,网络连接断开或我自己的服务器关闭,用户只是在谷歌播放中支付了钱,但我没有在我的服务器上记录购买?我该怎么办,我该如何处理这种情况.

Mar*_*ock 133

听起来你正在寻找的是一种检查用户是否在他们的帐户上启用了高级功能的方法,所以这就是我要开始的地方;

确保数据库上有某种标记,指示用户是否具有高级功能,并在请求帐户信息时将其包含在API响应有效负载中.此标志将是您"高级功能"的主要权限.

当用户进行应用内购买时,在客户端(即应用)本地缓存详细信息(令牌,订单ID和产品ID),然后将其发送到您的API.

然后,您的API应将其发送purchaseTokenGoogle Play Developer API进行验证.

从这里可能会发生一些事情:

  1. 收据有效,您的API使用200 Ok状态代码响应客户端
  2. 收据无效,您的API使用400 Bad Request状态代码响应客户端
  3. Google Play API已关闭,您的API会使用502 Bad Gateway状态代码进行响应

在1.或2.(2xx或4xx状态代码)的情况下,您的客户端会清除购买详细信息的缓存,因为它不再需要它,因为API已指示已收到.

验证成功后(情况1),您应该premium为用户将标志设置为true.

在3.(5xx状态代码)或网络超时的情况下,客户端应继续尝试,直到它从您的API收到2xx或4xx状态代码.

根据您的要求,您可以在再次发送之前等待几秒钟,或者只是在应用程序再次启动时将详细信息发送到您的API,或者如果应用程序缓存中存在购买详细信息,则将信息发送到后台.

这种方法应该处理网络超时,服务器不可用等.

现在需要考虑几个问题:

购买后会立即发生什么?应用程序应该等到验证成功后再提供优质内容,还是暂时授予访问权限并在验证失败时将其删除?

授予对高级功能的暂时访问权限可以为大多数用户提供流程,但是当您的API验证时,您也将授予对多个欺诈用户的访问权限purchaseToken.

换句话说:购买有效,直到证明有欺诈行为或; 欺诈直到证明有效?

为了识别用户是否仍然具有有效的预订时,他们的认购期出现续期,则需要安排在一个再验证purchaseToken,以在运行expiryTimeMillis这是在返回的结果.

如果expiryTimeMillis是过去,您可以将premium标志设置为false.如果是将来,请重新安排新的expiryTimeMillis.

最后,为了确保用户具有高级访问权限(或不访问),您的应用应该在API中查询用户有关应用启动或背景信息的详细信息.

  • 嗨!无法通过Google访问订阅历史记录?如果应用在存储purchaseToken时崩溃了,该如何防止已经使用的已购买cubitscription丢失的事实呢? (2认同)
  • 我有一个类似的问题.. 而不是让应用程序将令牌发送到 api 来指示谷歌开发人员服务器这样做并直接向我的 api 推送通知? (2认同)

Min*_*vME 14

使用适用于PHP的Google API客户端库的完整示例:

  1. 如Marc的答案/sf/answers/2459721981/所述,为您的服务帐户设置Google项目并访问Google Play.

  2. 安装库:https://developers.google.com/api-client-library/php/start/installation.

  3. 现在,您可以通过以下方式验证收据:

    $client = new \Google_Client();
    $client->setAuthConfig('/path/to/service/account/credentials.json');
    $client->addScope('https://www.googleapis.com/auth/androidpublisher');
    $service = new \Google_Service_AndroidPublisher($client);
    $purchase = $service->purchases_subscriptions->get($packageName, $productId, $token);
    
    Run Code Online (Sandbox Code Playgroud)

    之后,$ purchase是Google_Service_AndroidPublisher_SubscriptionPurchase的实例

    $purchase->getAutoRenewing();
    $purchase->getCancelReason();
    ...
    
    Run Code Online (Sandbox Code Playgroud)


Dhi*_*pta 14

关于这一点的文档令人困惑,并且对于几乎无关紧要的事情而言非常冗长,同时使实际重要的文档几乎不相关且非常难以找到.这应该适用于最流行的服务器平台,可以运行google api客户端库,包括Java,Python,.Net和NodeJS等.注意:我只测试了Python api客户端,如下所示.

必要的步骤:

  1. 通过Google Play控制台中的API访问链接制作API项目

  2. 创建一个新的服务帐户,保存生成的JSON私钥.您需要将此文件带到您的服务器.

  3. 按播放控制台的服务帐户部分中的完成以刷新,然后授予对服务帐户的访问权限

  4. https://developers.google.com/api-client-library获取适用于您的服务器平台的google api客户端库

  5. 使用特定平台的客户端库构建服务界面并直接读取购买验证的结果.

不会需要授权范围打扰,使得定制请求调用,刷新访问令牌等的API客户端库完成所有的操作.这是验证订阅的python库用法示例:

首先,在您的pipenv中安装google api客户端,如下所示:

$ pipenv install google-api-python-client
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用私钥json文件设置api客户端凭据以验证服务帐户.

credentials = service_account.Credentials.from_service_account_file("service_account.json")
Run Code Online (Sandbox Code Playgroud)

现在,您可以直接使用库验证订阅购买或产品购买.

#Build the "service" interface to the API you want
service = googleapiclient.discovery.build("androidpublisher", "v3", credentials=credentials)

#Use the token your API got from the app to verify the purchase
result = service.purchases().subscriptions().get(packageName="your.app.package.id", subscriptionId="sku.name", token="token-from-app").execute()
#result is a python object that looks like this ->
# {'kind': 'androidpublisher#subscriptionPurchase', 'startTimeMillis': '1534326259450', 'expiryTimeMillis': '1534328356187', 'autoRenewing': False, 'priceCurrencyCode': 'INR', 'priceAmountMicros': '70000000', 'countryCode': 'IN', 'developerPayload': '', 'cancelReason': 1, 'orderId': 'GPA.1234-4567-1234-1234..5', 'purchaseType': 0}
Run Code Online (Sandbox Code Playgroud)

Play开发人员API的平台服务界面的文档没有以易于查找的方式链接,对于一些人来说很难找到.以下是我发现的热门平台的链接:

Python | Java | .NET | PHP | NodeJS(Github TS) | 去(Github JSON)

  • 同意,文档太可怕了……关于如何使用Firebase(Firestore)和Cloud作为后端的任何想法? (2认同)
  • 很难找到,因为他们想要推广需要付费的 Cloud PubSub (2认同)
  • 这个信息是黄金! (2认同)

ran*_*dom 12

您可以尝试使用Purchases.subscriptions:获取服务器端.它将packageName,subscriptionId和token作为参数,需要授权.

检查用户的订购购买是否有效并返回其到期时间.

如果成功,此方法将在响应正文中返回Purchases.subscriptions资源.

  • 我有严重的问题让授权工作. (8认同)
  • 认真.对于某些应用程序的重要购买情况,支持和文档是无法实现的.这是您需要在服务器上执行的操作:https://github.com/google/google-api-nodejs-client#using-jwt-service-tokens.更多信息:/sf/ask/2458896051/#35138885 (8认同)

归档时间:

查看次数:

59206 次

最近记录:

7 年 前