IAP 訂閱后端踩坑總結之 Google 篇


前言:

  本文利用 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 接入實時開發者通知: 

參考文檔: https://developer.android.com/google/play/billing/realtime_developer_notifications.html#scale_notification_processing

啟用實時開發者通知后,只要現有訂閱項目有更新,您就會直接從 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.1 轉到 API 和服務憑據 (APIs & Services Credentials) Console 頁面。https://console.cloud.google.com/apis/credentials?_ga=2.15358897.-641556672.1562576238

      - 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. 低級訂閱升級高級訂閱時, 低級訂閱應該取消權限

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM