vir*_*sir 81 android in-app-purchase in-app-billing
我有一个简单的应用程序(需要用户登录帐户).我为付费用户提供了一些高级功能,比如更多新闻内容.
我需要记录用户是否已在我的服务器数据库中购买此项目.当我向用户的设备提供数据内容时,我可以检查用户的状态,并为付费用户提供不同的内容.
我检查了Google提供的官方Trivialdrive示例,它没有提供任何服务器端验证的示例代码,这里是我的问题.
我不确定我应该采用什么方法来验证用户的购买,并在我的数据库中标记用户的状态,可能两者都有?
我担心有一种情况,如果用户从谷歌播放购买此项目,但由于某种原因,就在那个时候,当我的应用程序启动验证到我的服务器,网络连接断开或我自己的服务器关闭,用户只是在谷歌播放中支付了钱,但我没有在我的服务器上记录购买?我该怎么办,我该如何处理这种情况.
Mar*_*ock 133
听起来你正在寻找的是一种检查用户是否在他们的帐户上启用了高级功能的方法,所以这就是我要开始的地方;
确保数据库上有某种标记,指示用户是否具有高级功能,并在请求帐户信息时将其包含在API响应有效负载中.此标志将是您"高级功能"的主要权限.
当用户进行应用内购买时,在客户端(即应用)本地缓存详细信息(令牌,订单ID和产品ID),然后将其发送到您的API.
然后,您的API应将其发送purchaseToken
到Google Play Developer API进行验证.
从这里可能会发生一些事情:
在1.或2.(2xx或4xx状态代码)的情况下,您的客户端会清除购买详细信息的缓存,因为它不再需要它,因为API已指示已收到.
验证成功后(情况1),您应该premium
为用户将标志设置为true.
在3.(5xx状态代码)或网络超时的情况下,客户端应继续尝试,直到它从您的API收到2xx或4xx状态代码.
根据您的要求,您可以在再次发送之前等待几秒钟,或者只是在应用程序再次启动时将详细信息发送到您的API,或者如果应用程序缓存中存在购买详细信息,则将信息发送到后台.
这种方法应该处理网络超时,服务器不可用等.
现在需要考虑几个问题:
购买后会立即发生什么?应用程序应该等到验证成功后再提供优质内容,还是暂时授予访问权限并在验证失败时将其删除?
授予对高级功能的暂时访问权限可以为大多数用户提供流程,但是当您的API验证时,您也将授予对多个欺诈用户的访问权限purchaseToken
.
换句话说:购买有效,直到证明有欺诈行为或; 欺诈直到证明有效?
为了识别用户是否仍然具有有效的预订时,他们的认购期出现续期,则需要安排在一个再验证purchaseToken
,以在运行expiryTimeMillis
这是在返回的结果.
如果expiryTimeMillis
是过去,您可以将premium
标志设置为false.如果是将来,请重新安排新的expiryTimeMillis
.
最后,为了确保用户具有高级访问权限(或不访问),您的应用应该在API中查询用户有关应用启动或背景信息的详细信息.
Min*_*vME 14
使用适用于PHP的Google API客户端库的完整示例:
如Marc的答案/sf/answers/2459721981/所述,为您的服务帐户设置Google项目并访问Google Play.
安装库:https://developers.google.com/api-client-library/php/start/installation.
现在,您可以通过以下方式验证收据:
$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客户端,如下所示.
通过Google Play控制台中的API访问链接制作API项目
创建一个新的服务帐户,保存生成的JSON私钥.您需要将此文件带到您的服务器.
按播放控制台的服务帐户部分中的完成以刷新,然后授予对服务帐户的访问权限
从https://developers.google.com/api-client-library获取适用于您的服务器平台的google api客户端库
你不会需要授权范围打扰,使得定制请求调用,刷新访问令牌等的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)
ran*_*dom 12
您可以尝试使用Purchases.subscriptions:获取服务器端.它将packageName,subscriptionId和token作为参数,需要授权.
检查用户的订购购买是否有效并返回其到期时间.
如果成功,此方法将在响应正文中返回Purchases.subscriptions资源.
归档时间: |
|
查看次数: |
59206 次 |
最近记录: |