公司有部分需求用到google play 结算服务(google 订阅),去实现商品的订阅,所以研究了一下,记录一下这次开发流程。
订阅流程:
用户从 Google Play 下载安装 APP, 通过APP的支付接口调用 Google Play 的支付界面, 成功后,App 获取到 Google 返回的携带 Token, productId, 与本APP的用户信息, 发送到后端, 进行验证, 验证成功后 发放/开通 相应权限;
续订流程:
订单续订后,google会发生通知到服务端(需要提供一个api),订单只要有状态变化,服务端都会收到通知。启用实时开发者通知后,订阅项目有更新,服务端就会收到Cloud Pub/Sub 推送的购买令牌,然后利用购买令牌去请求Google Play Developer API,以获取订单完整信息,然后将订单信息更新后端。
Google 实时开发者通知文档:https://developer.android.com/google/play/billing/realtime_developer_notifications.html#scale_notification_processing
官方接入文档:
https://developer.android.com/google/play/developer-api
developer Api 需要oauth认证:这里是后端认证,选择的是服务账户的方式。(权限生效要24小时)
文档:https://developers.google.com/android-publisher/getting_started
配置好后,会下载下来一个json文件,格式如下:
参数说明:
https://developers.google.com/android-publisher/api-ref/purchases/subscriptions
第一种方式:
直接请求google api:
POST https://www.googleapis.com/androidpublisher/v3/applications/packageName/purchases/subscriptions/subscriptionId/tokens/token:acknowledge
Path parameters:
packageName string 购买此订阅的应用程序的包名称(例如: 'com.some.thing'.)
subscriptionId string 购买的订阅ID (例如,'monthly001')
token string 购买订阅时提供给用户设备的令牌。
加密token方法:
https://developers.google.com/identity/protocols/oauth2/service-account#jwt-auth
第二种方式:
使用google 官方client :
https://developers.google.com/api-client-library:
我是使用的php client:
$client = new \Google_Client();
$client->setAuthConfig(EASYSWOOLE_ROOT . '/google_services_account.json');
$client->addScope('https://www.googleapis.com/auth/androidpublisher');
$service = new \Google_Service_AndroidPublisher($client);
$postBody = new \Google_Service_AndroidPublisher_SubscriptionPurchasesAcknowledgeRequest();
$postBody->setDeveloperPayload("test");
$purchase = $service->purchases_subscriptions->acknowledge(
$packageName,
$subscriptionId,
$token,
$postBody
);
return $purchase;
有两种类型,拉取和推送(提供一个api)
消息格式:
{
"message": {
"attributes": {
"key": "value"
},
"data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
"messageId": "136969346945"
},
"subscription": "projects/myproject/subscriptions/mysubscription"
}
message里面的data是需要的数据,是base64加密的,解密后可以得到购买的用户令牌,后端可以请求google的api,进行订单的其他操作