Android一點 谷歌訂閱功能開發

最近再弄谷歌訂閱功能,但是網上資料比較少,經過幾天的查閱資料,終於調通了,這裏記錄一下~

當然你得翻牆纔可以進行谷歌儲值~

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 進行操作,但是這個也是需要進行賬號授權,而我們商品的購買也是需要賬號授權的,這裏可能會存在賬號授權的衝突。我這裏是使用另外一種方式,就是 推送通知的方式。下面按文檔說明新建一個主題,這樣需要注意的是需要添加

添加服務帳號 [email protected],然後授予其 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就是購買的令牌了

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 - 訂閱已過期。

拿到購買令牌就可以再服務器端進行訂單的驗證了,訂閱驗證 

這裏每次對比expiryTimeMillis的有效時間即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章