google play 结算服务接入流程

公司有部分需求用到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

google play 结算服务接入流程_第1张图片

正式开发:

官方接入文档:

https://developer.android.com/google/play/developer-api

oauth认证:

developer Api 需要oauth认证:这里是后端认证,选择的是服务账户的方式。(权限生效要24小时)

文档:https://developers.google.com/android-publisher/getting_started

配置好后,会下载下来一个json文件,格式如下:

google play 结算服务接入流程_第2张图片

Google 订阅信息验证:

参数说明:

 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;
      

Google实时开发者通知:

有两种类型,拉取和推送(提供一个api)

消息格式:

{
  "message": {
    "attributes": {
      "key": "value"
    },
    "data": "eyAidmVyc2lvbiI6IHN0cmluZywgInBhY2thZ2VOYW1lIjogc3RyaW5nLCAiZXZlbnRUaW1lTWlsbGlzIjogbG9uZywgIm9uZVRpbWVQcm9kdWN0Tm90aWZpY2F0aW9uIjogT25lVGltZVByb2R1Y3ROb3RpZmljYXRpb24sICJzdWJzY3JpcHRpb25Ob3RpZmljYXRpb24iOiBTdWJzY3JpcHRpb25Ob3RpZmljYXRpb24sICJ0ZXN0Tm90aWZpY2F0aW9uIjogVGVzdE5vdGlmaWNhdGlvbiB9",
    "messageId": "136969346945"
  },
  "subscription": "projects/myproject/subscriptions/mysubscription"
}

message里面的data是需要的数据,是base64加密的,解密后可以得到购买的用户令牌,后端可以请求google的api,进行订单的其他操作 

你可能感兴趣的:(google,play)