前言:
本文利用 python 作為后端服務器, 且接入的 Google Cloud Pub/Sub 服務作為實時開發者通知, 未記錄具體支付流程的代碼,只記錄了再開發過程中較為耗時,個人認為比較麻煩的坑。
- Google 訂閱問題總結:
- Google 認證服務器;
- Google 訂閱信息驗證;
- Google 續訂:
- Google 接入實時開發者通知;
- Google 續訂測試;
- Google 升級測試;
- Google Play 賬戶與 APP賬戶唯一綁定;
簡述訂閱流程與續訂流程:
訂閱流程:
用戶從 Google Play 下載安裝 APP, 通過APP的支付接口調用 Google Play 的支付界面, 成功后,App 獲取到 Google 返回的攜帶 Token, productId, 與本APP的用戶信息, 發送到后端, 進行驗證, 驗證成功后 發放/開通 相應權限;
續訂流程:
Google 會自動續訂, 不進過APP支付, 若續訂成功, 會發送通知到安全服務器; 續訂失敗, 或者其他暫停, 取消, 等等操作, 也會發送通知到安全服務器; 在這里, 我只進行了續訂以及恢復續訂的監聽, 我認為只需要知道他續訂成功的狀態即可; 其他操作一律視為續訂失敗, 不對該用戶的過期時間進行順延。 正常過期, 收回權限/商品;
Google 認證服務器:
測試時需要Google 驗證服務器來作為安全服務器;
官方文檔接入地址: https://developer.android.com/google/play/developer-api
選擇 OAuth 2.0 https://developers.google.com/identity/protocols/OAuth2ServiceAccount
Google 訂閱信息驗證:
官網數據驗證地址: 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 }
Google 接入實時開發者通知:
啟用實時開發者通知后,只要現有訂閱項目有更新,您就會直接從 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”)。
Google Play 賬戶與 APP賬戶唯一綁定:
pass
Google 續訂暫停訂閱等測試需要注意的點:
- 續訂測試
1. 訂閱到期后, 自動成功續期;
- 暫停測試
1. 訂閱暫停后, 當前續費結束后, 取消訪問權限;
2. 暫停期結束后, 自動續費成功;
3. 暫停期間, 主動從Google Play恢復訂閱成功;
4. 暫停期間, 主動從App訂閱 恢復訂閱成功;
5. 恢復訂閱后, 自動續訂成功;
- 升級測試
1. 低級訂閱升級高級訂閱時, 低級訂閱應該取消權限