谷歌支付驗證 403錯誤
阿新 • • 發佈:2019-02-17
1 說明
- 本文講述後端使用谷歌
api
驗證支付的過程 - 流程: 前端支付完畢之後會獲取
token
,將token
傳送至後端,後端將此token
發向google
進行查詢,如果是正常有效的token
,谷歌會返回對應訂單的詳細資訊,驗證通過後再通知前端進行消費(也可以前端先消費再通知後端驗證發貨)
2 前期準備
2-1 建立api專案
- 填寫專案名稱後,專案就建立完成了
- 建立完成之後,需要啟用所需要的
api服務
,點選啟用API和服務
- 搜尋
Google Play Android Developer API
,我們將使用這個API服務來查詢訂單,點選啟用它
- 點選建立憑據
- 實際上是跳轉到
test-api
資訊中心
,可以看到API
列表中出現了Google Play Android Developer API
,還有請求次數,錯誤,錯誤率等資訊
2-2 建立OAuth客戶端ID
- 接下來準備建立
OAuth客戶端ID
,點選憑據
- 先填寫
OAuth同意螢幕
,應用名稱那一行可以隨便填寫,反正是給自己看的,填完應用名稱
之後,還需要填已授權的網域
,然後點選最下方的儲存
按鈕 已授權的網域
最好填寫要發起請求的後臺所用的域名,假設我的後臺為sdk.keylala.cn
,則此處填寫keylala.cn
- 準備建立
OAuth客戶端ID
- 填寫的內容
- 應用型別選擇: 網頁應用
- 名稱:隨意填寫了
- 已獲授權的 JavaScript 來源:
https://keylala.cn
- 已獲授權的重定向 URI:
https://keylala.cn
,這個隨便,比如寫成https://keylala.cn/callback
,不一定需要這個介面真實存在的,但一定要記著這個URI
,後文中我們稱之為redirectURI
- 點選
建立
按鈕,獲得客戶端ID和客戶端金鑰,下文中分別稱為clientId
和clientSecret
2-3 獲取 code
- 請將下方
url
中的redirect_uri
和client_id
填寫上2-2
中獲取的引數
- 放到瀏覽器上(此時不要關閉之前的頁面, 此瀏覽器需要登入谷歌開發者賬號,且不能點退出),另起一個頁面標籤,複製上去,點選允許
- 這時候會跳轉到
redirect_uri
開頭的地址,如果redirect_uri
是胡亂填的,這裡會出現一個404
頁面或者無法訪問的提示,不過沒關係,請將位址列中的地址複製下來,把code=4/xxxxx
的值取出來,這裡就獲得了code
的值。 code
的值類似這樣的一長串:4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI
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,這時候只要在該應用的商店內,隨意增加一個內購或者訂閱,再看看是不是這個問題就消失了。新增的內購或者訂閱可以刪除的。