相关疑难解决方法(0)

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

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

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

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

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

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

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

android in-app-purchase in-app-billing

81
推荐指数
4
解决办法
6万
查看次数

Android In App Subscription始终返回初始收据,我从未获得续订

我的Android应用有问题.我正在尝试实施每月订阅.我创建了IAP,该应用程序处于测试阶段,我注册为测试人员.

购买订阅时,一切都按预期工作.我可以将其作为测试人员购买,这意味着订阅实际上并未收费,而且每天都会续订.

但这是我的问题开始的地方.我总是得到原始收据,原件purchaseTimepurchaseToken.每当应用程序启动时,我都会打电话queryInventoryAsync,我希望得到最新的续订收据.但我总是得到原始收据.

我的想法错了吗?我不应该获得新的收据orderID吗?(如谷歌文档说,我应该得到一个orderIDGPA.blabla..0|1|2.我知道有一些缓存机制,但我已经等了三天,我仍然得到原始顺序,而我应该得到的最新一个.

我总是在人行横道上使用cordova,我使用以下插件进行购买:https://github.com/j3k0/cordova-plugin-purchase.我不知道它是否重要,它不应该因为它使用每个其他插件使用的相同的IABHelper类,但也许它们的代码有问题?

我记录了从通话中收到的确切响应mService.getPurchases(3, mContext.getPackageName(), itemType, continueToken);,它包含错误的数据(原始收据).为什么?:(

有没有其他人有类似的问题?是因为测试订阅了吗?实际购买时会起作用吗?我已经开始使用真钱进行测试,但需要一周的时间才能续订.

非常感谢.

修改:无法从Google Play商店应用中清除缓存.我不能要求我的用户这样做.此外,我测试了这个,它不起作用!

编辑2生产订阅(真钱,没有测试)也不起作用!仍然收到原始收据!

编辑3我还没有解决这个问题.检测续订的正确方法是什么?我应该只在后端运行cronjob并根据Google的Purchase Status API查询每个订阅吗?

编辑4感谢您的回答.我已经在后端使用Purchase Status API来确定订阅是否已续订.但它有点糟糕,如果我获得100.000订阅会导致什么?遍历所有这些并查询Google API的脚本将花费非常漫长的时间......脚本应该每天运行!

但是让我们清理一下.

这是否意味着官方文档已过时?.

GPA.blabla..0 GPA.blabla..1风格续费死

编辑2016年12月5日更新:我已经在生产中运行了几个月的订阅,我仍然没有获得..0,..1的续订.我做的是设置每天运行的cronjob.它会通过我的有效订阅并针对Google的Purchase API查询它们.如果API返回的截止日期与我的数据库中保存的日期不同,则表示订阅已续订.

编辑2017年7月6日更新 我仍然依赖我的每日脚本来解析所有订阅,并通过使用Purchases API查询Google来更新其状态https://developers.google.com/android-publisher/api-ref/purchases/subscriptions.到目前为止它一直很好用.

编辑2018年10月7日更新 Google现在提供实时通知:https://developer.android.com/google/play/billing/realtime_developer_notifications

我实现了这些通知,并将它们与每日cronjob一起使用,以获取每个订阅的真实状态和到期日期.

快速提示:批量查询订阅!我做了一些测试,并且我能够在同一个请求中捆绑多达1.000个订阅.该限制是由API的最大响应大小强加的.

android in-app-billing cordova crosswalk

26
推荐指数
1
解决办法
1492
查看次数

创建后,服务帐户不会显示在Google Play Console中

在我的Google Play控制台中,我链接了一个项目.然后我创建了一个服务帐户.尽管如此,在刷新控制台时,仍然会说"没有与您的项目关联的服务帐户".已经等了24个多小时了.所有这一切的目的是收据验证.

图1:一个链接项目: 在此输入图像描述

图2:创建的服务帐户: 在此输入图像描述

android google-api service-accounts receipt-validation google-play-console

24
推荐指数
2
解决办法
2252
查看次数

应用内结算连接到Firebase并获取产品

我开始创建一个可以从中购买商品的APP。可能是这样的:图片]在这里你可以看到ImageName of productPrice。嗯,我有媒体链接一个Sign-in with Google用做Authentication Firebase和我存储它Firebase database,我想创建下面这个结构@Alex马莫向我建议:

Firebase-root
    |
    --- users
    |     |
    |     --- uid1
    |          |
    |          --- //user details (name, age, address, email and so on)
    |          |
    |          --- products
    |                |
    |                --- productId1 : true
    |                |
    |                --- productId2 : true
    |
    --- products
    |     |
    |     --- productId1
    |     |     |
    |     |     --- productName: "Apples"
    |     |     | …
Run Code Online (Sandbox Code Playgroud)

android in-app-purchase in-app-billing firebase firebase-realtime-database

6
推荐指数
1
解决办法
3051
查看次数

Google API - invalid_request - 无法根据请求确定客户端 ID

我正在将 google play 应用内订阅集成到我的应用程序中。要访问 google API,首先我需要获取 access_token,然后在标头中使用它来访问订阅 API。按照程序(Android:inApp购买收据验证google play)我得到了我的凭据文件,如下所示

{
  "type": "service_account",
  "project_id": "my-project-id",
  "private_key_id": "x",
  "private_key": "-----BEGIN PRIVATE KEY-----y-----END PRIVATE KEY-----\n",
  "client_email": "google-play-developer@z.iam.gserviceaccount.com",
  "client_id": "x",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/google-play-developer%40y.iam.gserviceaccount.com"
}
Run Code Online (Sandbox Code Playgroud)

注意:真实的 id 和值替换为 x、y 和 z

接下来,为了用 JWT 交换 access_tokenm,我正在使用 php 的 Google API 客户端库 https://github.com/googleapis/google-api-php-client

这是我的代码

$client = new \Google_Client();
$client->setAuthConfig('client_secret.json');
$client->addScope('https://www.googleapis.com/auth/androidpublisher');
$client->setRedirectUri($request->redirect_uri);
$token = $client->fetchAccessTokenWithAuthCode($request->code);
Run Code Online (Sandbox Code Playgroud)

但我无法获取访问令牌。出现以下错误

{
    "error": "invalid_request",
    "error_description": "Could not determine client ID from request."
}
Run Code Online (Sandbox Code Playgroud)

php google-play in-app-subscription

5
推荐指数
0
解决办法
1129
查看次数