前言:html
本文利用 python 做爲後端服務器, 且接入的 Google Cloud Pub/Sub 服務做爲實時開發者通知, 未記錄具體支付流程的代碼,只記錄了再開發過程當中較爲耗時,我的認爲比較麻煩的坑。python
- Google 訂閱問題總結:android
- Google 認證服務器;web
- Google 訂閱信息驗證;後端
- Google 續訂:api
- Google 接入實時開發者通知;安全
- Google 續訂測試;服務器
- Google 升級測試;app
- Google Play 帳戶與 APP帳戶惟一綁定;ide
訂閱流程:
用戶從 Google Play 下載安裝 APP, 經過APP的支付接口調用 Google Play 的支付界面, 成功後,App 獲取到 Google 返回的攜帶 Token, productId, 與本APP的用戶信息, 發送到後端, 進行驗證, 驗證成功後 發放/開通 相應權限;
續訂流程:
Google 會自動續訂, 不進過APP支付, 若續訂成功, 會發送通知到安全服務器; 續訂失敗, 或者其餘暫停, 取消, 等等操做, 也會發送通知到安全服務器; 在這裏, 我只進行了續訂以及恢復續訂的監聽, 我認爲只須要知道他續訂成功的狀態便可; 其餘操做一概視爲續訂失敗, 不對該用戶的過時時間進行順延。 正常過時, 收回權限/商品;
測試時須要Google 驗證服務器來做爲安全服務器;
官方文檔接入地址: https://developer.android.com/google/play/developer-api
選擇 OAuth 2.0 https://developers.google.com/identity/protocols/OAuth2ServiceAccount
官網數據驗證地址: https://developers.google.com/android-publisher/api-ref/purchases/subscriptions
校驗數據的請求地址:
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 購買訂閱時提供給用戶設備的令牌。
驗證後的訂單數據 demo:
{ "kind": "androidpublisher#subscriptionPurchase", "startTimeMillis": long, "expiryTimeMillis": long, "autoResumeTimeMillis": long, "autoRenewing": boolean, "priceCurrencyCode": string, "priceAmountMicros": long, "introductoryPriceInfo": { "introductoryPriceCurrencyCode": string, "introductoryPriceAmountMicros": long, "introductoryPricePeriod": string, "introductoryPriceCycles": integer }, "countryCode": string, "developerPayload": string, "paymentState": integer, "cancelReason": integer, "userCancellationTimeMillis": long, "cancelSurveyResult": { "cancelSurveyReason": integer, "userInputCancelReason": string }, "orderId": string, "linkedPurchaseToken": string, "purchaseType": integer, "priceChange": { "newPrice": { "priceMicros": string, "currency": string }, "state": integer }, "profileName": string, "emailAddress": string, "givenName": string, "familyName": string, "profileId": string, "acknowledgementState": integer }
啓用實時開發者通知後,只要現有訂閱項目有更新,您就會直接從 Cloud Pub/Sub 收到購買令牌。
實時開發者通知並不提供與訂閱項目狀態有關的完整信息,例如用戶目前是否有權訪問訂閱內容。收到令牌後,您應該始終使用購買令牌查詢 Google Play Developer API,以獲取完整信息,並根據用戶當前的權限狀態更新後端。
通知類型將來可能會發生變化。您應該可以處理沒法識別的通知類型,而且您應該始終依賴 Google Play Developer API 來處理關鍵業務邏輯。
開啓實時開發者通知後, 訂閱全部類型的操做都會通知到你的服務器上, 很好用。
開啓的步驟以下:
- 1. 前往 Google Cloud Platform (GCP) 建立 Pub/Sub 項目:
進入 GCP 的控制檯如圖點擊 建立主題
- 2. 在建立的主題中, 添加服務帳號到發佈商的權限中;
- 3. 前往 Google Play 管理中心開啓實時開發者通知:
- 3.1 打開 Google Play 管理中心。
- 3.2 選擇您的 Android 應用。
- 3.3 依次轉到開發工具 > 服務和 API 頁面
- 3.4 ... 看圖
- 4. 在主題中建立訂閱, 選擇 push 類型的訂閱進行建立, 建立前須要驗證網域全部權; 若果未驗證成功, 則在建立訂閱的時候 Google 會報 400 的錯誤;
- 4.1 使用 Search Console 完成網站驗證流程。請務必註冊網址的 https://
版本。 這裏我選擇的是 HTML 驗證; 當這裏驗證成功後不要急於去建立訂閱, 請先完成下面的步驟;
- 4.2 授予網域對訂閱所屬的 GCP 項目的訪問權限
- 4.2.2 請選擇您的項目
- 4.2.3 選擇網域驗證標籤頁
- 4.2.4 選擇添加網域
- 4.2.5 輸入相應網域,而後選擇添加網域
- 4.2.6 建立訂閱
- 4.3 能夠選擇任意一個被驗證過了的網域配置爲 端點;
本文未選擇 pull 類型的訂閱;
屬性名稱 值 說明 version string 此通知的版本。最初,此值將爲「1.0」。此版本與其餘版本字段不一樣。 notificationType int 通知的類型。它能夠具備如下值: (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 - 訂閱的續訂時間點已延期。 (12) SUBSCRIPTION_REVOKED - 用戶在有效時間結束前已撤消訂閱。 (13) SUBSCRIPTION_EXPIRED - 訂閱已過時。
purchaseToken string 購買訂閱時向用戶設備提供的令牌。 subscriptionId string 所購買訂閱的 ID(例如「monthly001」)。
pass
- 續訂測試
1. 訂閱到期後, 自動成功續期;
- 暫停測試
1. 訂閱暫停後, 當前續費結束後, 取消訪問權限;
2. 暫停期結束後, 自動續費成功;
3. 暫停期間, 主動從Google Play恢復訂閱成功;
4. 暫停期間, 主動從App訂閱 恢復訂閱成功;
5. 恢復訂閱後, 自動續訂成功;
- 升級測試
1. 低級訂閱升級高級訂閱時, 低級訂閱應該取消權限