我有一个简单的应用程序(需要用户登录帐户).我为付费用户提供了一些高级功能,比如更多新闻内容.
我需要记录用户是否已在我的服务器数据库中购买此项目.当我向用户的设备提供数据内容时,我可以检查用户的状态,并为付费用户提供不同的内容.
我检查了Google提供的官方Trivialdrive示例,它没有提供任何服务器端验证的示例代码,这里是我的问题.
我不确定我应该采用什么方法来验证用户的购买,并在我的数据库中标记用户的状态,可能两者都有?
我担心有一种情况,如果用户从谷歌播放购买此项目,但由于某种原因,就在那个时候,当我的应用程序启动验证到我的服务器,网络连接断开或我自己的服务器关闭,用户只是在谷歌播放中支付了钱,但我没有在我的服务器上记录购买?我该怎么办,我该如何处理这种情况.
我的Android应用有问题.我正在尝试实施每月订阅.我创建了IAP,该应用程序处于测试阶段,我注册为测试人员.
购买订阅时,一切都按预期工作.我可以将其作为测试人员购买,这意味着订阅实际上并未收费,而且每天都会续订.
但这是我的问题开始的地方.我总是得到原始收据,原件purchaseTime和purchaseToken.每当应用程序启动时,我都会打电话queryInventoryAsync,我希望得到最新的续订收据.但我总是得到原始收据.
我的想法错了吗?我不应该获得新的收据orderID吗?(如谷歌文档说,我应该得到一个orderID样GPA.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的最大响应大小强加的.
在我的Google Play控制台中,我链接了一个项目.然后我创建了一个服务帐户.尽管如此,在刷新控制台时,仍然会说"没有与您的项目关联的服务帐户".已经等了24个多小时了.所有这一切的目的是收据验证.
android google-api service-accounts receipt-validation google-play-console
我开始创建一个可以从中购买商品的APP。可能是这样的:
在这里你可以看到Image,Name of product和Price。嗯,我有媒体链接一个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
我正在将 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)