Android 谷歌结算库订阅功能接入

702次阅读
没有评论

最近再弄谷歌订阅功能,但是网上资料比较少,经过几天的查阅资料,终于调通了,这里记录一下~

当然你得翻墙才可以进行谷歌储值~

1、先过一下android订阅的文档,添加订阅功能添加实时开发者通知

2、看一下订阅的购买,其实和消费的商品的购买还是有一些差别的,文档上提到确认购买的方式不一样

您可以使用以下某种方法确认购买交易:

  • 对于消耗型商品,请使用客户端 API 中的 consumeAsync()
  • 对于非消耗型商品,请使用客户端 API 中的 acknowledgePurchase()
  • 还可以使用服务器 API 中新增的 acknowledge() 方法。

3、正常的购买流程是 去谷歌查询商品-拉起购买-消费商品,现在订阅的处理流程也是一样,只是消费的方法不一样了。

4、先看一下android这边的处理,看一下查询订阅商品

SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
           params.setType(BillingClient.SkuType.SUBS).setSkusList(skuList);

           this.billingClient.querySkuDetailsAsync(params.build(), mSkuDetailsResponseListener);

这里的类型是 SkuType.SUBS

5、获取商品后拉起购买界面

flowParams = BillingFlowParams.newBuilder()
                            .setSkuDetails(mSkuDetails)
                            .setAccountId(MD5.getMD5(user.getUserid()))
                            .setDeveloperId("xxx")
                            .build();
                    mBillingClient.launchBillingFlow(activity, flowParams);

setSkuDetails为查询回来的商品信息

6、再购买回调回来之后这里就不是走消费了,这里是进行确认购买

mBillingClient.acknowledgePurchase

AcknowledgePurchaseParams acknowledgePurchaseParams=AcknowledgePurchaseParams.newBuilder()
                  .setPurchaseToken(purchase.getPurchaseToken())
                  .setDeveloperPayload(JSON.toJSONString(mapUser))
                  .build();
 
          this.mBillingClient.acknowledgePurchase(acknowledgePurchaseParams,acknowledgePurchaseResponseListener);

setDeveloperPayload可以附带用户信息,这里服务端验证的时候可以返回该信息

7、我们打开google play console,找到你的应用,添加订阅商品

Android

然后再应用的开发工具 > 服务和 API 页面添加实时开发者通知

Android

设置好商品,这个时候我们就可以拉起购买了

Android

8、下面我们按照官网的文档进行配置,转到 Cloud Pub/Sub 找到订阅,这里先建立你的主题,再建立订阅,谷歌推荐使用的是Cloud SDK 进行操作,但是这个也是需要进行账号授权,而我们商品的购买也是需要账号授权的,这里可能会存在账号授权的冲突。我这里是使用另外一种方式,就是 推送通知的方式。下面按文档说明新建一个主题,这样需要注意的是需要添加

添加服务帐号 google-play-developer-notifications@system.gserviceaccount.com,然后授予其 Pub/Sub 发布商的角色。AndroidAndroid

Android

这里使用推送通知,需要我们设置一个回调url,必须是https的,而且还需要进行网域验证Android

进去官网文档查看这个推送通知的信息

Android

这个就是谷歌返回的数据格式,这个一个json数据,所以再我们的接口部分是接收这个json数据的

@RequestMapping("subs")
  @ResponseBody
  private String hello(HttpServletRequest request, HttpServletResponse response) {
 
    BufferedReader br;
    try {
      br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream(), "utf-8"));
      StringBuffer sb = new StringBuffer("");
      String temp;
      while ((temp = br.readLine()) != null) { 
        sb.append(temp);
      }
      br.close();
      String params = sb.toString();
      System.out.println("订阅通知返回数据:"+params);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } 
    
 
 
    return "success";
  }

拿回数据,我们主要看message.data 字段,这里是base64,需要进行解码,数据如下

{
  "version": "1.0",
  "packageName": "com.xxx.xxx",
  "eventTimeMillis": "1584599417527",
  "subscriptionNotification": {
    "version": "1.0",
    "notificationType": 4,
    "purchaseToken": "keabnnlchgojgoachoomdhnk.AO-J1OzrDU_Z47_lCAog3-xpViHTFzmzghAkYRZ4YaZjDxO7jTe3Qm9oCzSaT1RDwxjznRiAJ3iYacVJKoo0yjrgpkOEX14jnokh_mk",
    "subscriptionId": "hskd_subs01"
  }
}

purchaseToken就是购买的令牌了

notificationType为订阅通知的类型

通知的类型。它可以具有以下值:
 
(1) SUBSCRIPTION_RECOVERED - 从帐号保留状态恢复了订阅。
(2) SUBSCRIPTION_RENEWED - 续订了处于活动状态的订阅。
(3) SUBSCRIPTION_CANCELED - 自愿或非自愿地取消了订阅。如果是自愿取消,在用户取消时发送。
(4) SUBSCRIPTION_PURCHASED - 购买了新的订阅。
(5) SUBSCRIPTION_ON_HOLD - 订阅已进入帐号保留状态(如已启用)。
(6) SUBSCRIPTION_IN_GRACE_PERIOD - 订阅已进入宽限期(如已启用)。
(7) SUBSCRIPTION_RESTARTED - 用户已通过“Play”>“帐号”>“订阅”重新激活其订阅(需要选择使用订阅恢复功能)。
(8) SUBSCRIPTION_PRICE_CHANGE_CONFIRMED - 用户已成功确认订阅价格变动。
(9) SUBSCRIPTION_DEFERRED - 订阅的续订时间点已延期。
(10) SUBSCRIPTION_PAUSED - 订阅已暂停。
(11) SUBSCRIPTION_PAUSE_SCHEDULE_CHANGED - 订阅暂停计划已更改。
(12) SUBSCRIPTION_REVOKED - 用户在有效时间结束前已撤消订阅。
(13) SUBSCRIPTION_EXPIRED - 订阅已过期。

拿到购买令牌就可以再服务器端进行订单的验证了,订阅验证

Android

这里每次对比expiryTimeMillis的有效时间即可

 

 

 

迷鹿, lostfawn
版权声明:本站原创文章,由迷鹿, lostfawn2021-02-07发表,共计3216字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...
召唤伊斯特瓦尔