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

前言: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 認證服務器:

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

相關文章
相關標籤/搜索