最近再弄谷歌订阅功能,但是网上资料比较少,经过几天的查阅资料,终于调通了,这里记录一下~
当然你得翻墙才可以进行谷歌储值~
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,找到你的应用,添加订阅商品
然后再应用的开发工具 > 服务和 API 页面添加实时开发者通知
设置好商品,这个时候我们就可以拉起购买了
8、下面我们按照官网的文档进行配置,转到 Cloud Pub/Sub 找到订阅,这里先建立你的主题,再建立订阅,谷歌推荐使用的是Cloud SDK 进行操作,但是这个也是需要进行账号授权,而我们商品的购买也是需要账号授权的,这里可能会存在账号授权的冲突。我这里是使用另外一种方式,就是 推送通知的方式。下面按文档说明新建一个主题,这样需要注意的是需要添加
添加服务帐号 google-play-developer-notifications@system.gserviceaccount.com
,然后授予其 Pub/Sub 发布商的角色。
这里使用推送通知,需要我们设置一个回调url,必须是https的,而且还需要进行网域验证
这个就是谷歌返回的数据格式,这个一个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就是购买的令牌了
通知的类型。它可以具有以下值:
(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 - 订阅已过期。
拿到购买令牌就可以再服务器端进行订单的验证了,订阅验证
这里每次对比expiryTimeMillis的有效时间即可