1. 程式人生 > >谷歌支付驗證 403錯誤

谷歌支付驗證 403錯誤

1 說明

  • 本文講述後端使用谷歌api驗證支付的過程
  • 流程: 前端支付完畢之後會獲取token,將token傳送至後端,後端將此token發向google進行查詢,如果是正常有效的token,谷歌會返回對應訂單的詳細資訊,驗證通過後再通知前端進行消費(也可以前端先消費再通知後端驗證發貨)

2 前期準備

2-1 建立api專案

  • 填寫專案名稱後,專案就建立完成了
    1
  • 建立完成之後,需要啟用所需要的api服務,點選啟用API和服務
    2
  • 搜尋Google Play Android Developer API,我們將使用這個API服務來查詢訂單,點選啟用它
    3
  • 點選建立憑據
    4
  • 實際上是跳轉到test-api
    這個專案的憑據建立了,點選資訊中心,可以看到API列表中出現了Google Play Android Developer API,還有請求次數,錯誤,錯誤率等資訊
    5
    6

2-2 建立OAuth客戶端ID

  • 接下來準備建立OAuth客戶端ID,點選憑據
  • 先填寫OAuth同意螢幕,應用名稱那一行可以隨便填寫,反正是給自己看的,填完應用名稱之後,還需要填已授權的網域,然後點選最下方的儲存按鈕
  • 已授權的網域最好填寫要發起請求的後臺所用的域名,假設我的後臺為sdk.keylala.cn,則此處填寫keylala.cn
    7
  • 準備建立OAuth客戶端ID
    8
  • 填寫的內容
    • 應用型別選擇: 網頁應用
    • 名稱:隨意填寫了
    • 已獲授權的 JavaScript 來源: https://keylala.cn
    • 已獲授權的重定向 URI: https://keylala.cn,這個隨便,比如寫成https://keylala.cn/callback,不一定需要這個介面真實存在的,但一定要記著這個URI,後文中我們稱之為redirectURI
      在這裡插入圖片描述
  • 點選建立按鈕,獲得客戶端ID和客戶端金鑰,下文中分別稱為clientIdclientSecret
    10

2-3 獲取 code

  • 請將下方url中的redirect_uriclient_id填寫上2-2中獲取的引數
  • 放到瀏覽器上(此時不要關閉之前的頁面, 此瀏覽器需要登入谷歌開發者賬號,且不能點退出),另起一個頁面標籤,複製上去,點選允許
  • 這時候會跳轉到redirect_uri開頭的地址,如果redirect_uri是胡亂填的,這裡會出現一個404頁面或者無法訪問的提示,不過沒關係,請將位址列中的地址複製下來,把code=4/xxxxx的值取出來,這裡就獲得了code的值。
  • code的值類似這樣的一長串: 4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI
    11

2-4 獲取 refresh_token

  • 傳送POST請求到https://accounts.google.com/o/oauth2/token
  • 引數:
    • grant_type=authorization_code
    • code={2-3獲得的code值}
    • client_id={2-2獲得的clientId}
    • client_secret={2-2獲得的clientSecret}
    • redirect_uri={2-2填寫的redirectURI}
  • 這裡使用Postman工具傳送請求
    在這裡插入圖片描述
  • 這樣就獲取了refresh_token,下文中稱refreshToken,這個token是一個長久有效的token,可以儲存起來

3 專案關聯

  • 2中我們建立了一個API服務,名為: test-api,以及獲取了這個api的一系列引數
  • 我們可以建立很多個api,給不同api啟用不同的谷歌api
  • 這裡我們要將我們的遊戲應用與我們所需要的API服務關聯起來
  • 點選API許可權之後,能在右側發現我們前面建立的test-api這個專案,點選關聯,這樣我們就可以用test-api中谷歌提供的介面Google Play Android Developer API來查詢這個賬號下所有應用的訂單資訊了
    在這裡插入圖片描述

4 引數儲存

  • 要驗證訂單我們需要以下引數,這些引數可以儲存在後臺中
    • clientId: OAuth 客戶端ID
    • clientSecret: OAuth 客戶端金鑰
    • redirectURI: 自己填寫的重定向地址
    • code
    • refreshToken

5 驗證

5-1 獲取 access_token

  • 通過前面獲取的refreshToken來獲得access_token

  • 程式碼中使用POST方式呼叫https://accounts.google.com/o/oauth2/token

  • 引數:

    • grant_type : refresh_token
    • client_id
    • client_secret
    • refresh_token
  • 返回值:

    {
        "access_token" : "ya29.AHES3ZQ_MbZCwac9TBWIbjW5ixxxxxxxxx2",
        "token_type" : "Bearer",
        "expires_in" : 3600,
    }
    

5-2 查詢訂單資訊

  • 使用GET方法呼叫以下介面:
    https://www.googleapis.com/androidpublisher/v3/applications/packageName/purchases/products/productId/tokens/token?access_token=access_token

  • packageName: 該應用的包名, 比如com.test.xxx

  • productId: 商品ID,即內購ID

  • token: 充值的時候,前端獲取的token

  • access_token: 在5-1中獲取的

  • 如果訂單是有效的,會返回如下內容:

    {
        "kind": "androidpublisher#productPurchase",
        "purchaseTimeMillis": "1539054135375",  // 支付時間, 毫秒
        "purchaseState": 0, // 是否付費: 0 已支付, 1 取消
        "consumptionState": 0, // 是否被消費: 0 未消費, 1 已消費
        "developerPayload": "xxxxx", // 開發者透傳引數
        "orderId": "GPA.3337-xxxx-xxxx-xxxx", // 谷歌訂單號
        "purchaseType": 0 // 支付型別:  0 測試, 1 真實
    }
    
  • 如果訂單是無效的,會返回以下內容:

    {
        "error": {
         "errors": [
          {
           "domain": "global",
           "reason": "invalid",
           "message": "Invalid Value"
          }
         ],
         "code": 400,
         "message": "Invalid Value"
        }
    }
    

5-3 403錯誤

  • 在測試過程中,遇到了403錯誤,報錯如下

    {
    	"error": {
    		"errors": [{
    			"domain": "androidpublisher",
    			"reason": "projectNotLinked",
    			"message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
    		}],
    		"code": 403,
    		"message": "The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console."
    	}
    }
    
  • 產生的原因1:專案沒有關聯,或者關聯到錯誤的API專案上了,請看3 專案關聯

  • 產生的原因2:谷歌服務的BUG,這時候只要在該應用的商店內,隨意增加一個內購或者訂閱,再看看是不是這個問題就消失了。新增的內購或者訂閱可以刪除的。