谷歌支付驗證
后端對谷歌支付進行驗證的時候遇到些問題润樱,為了方便以后查閱袋马,記錄整個過程
1 說明
- 本文講述后端使用谷歌
api
驗證支付的過程 - 流程: 前端支付完畢之后會獲取
token
痊土,將token
發(fā)送至后端,后端將此token
發(fā)向google
進行查詢,如果是正常有效的token
已球,谷歌會返回對應訂單的詳細信息,驗證通過后再通知前端進行消費(也可以前端先消費再通知后端驗證發(fā)貨)
2 前期準備
- 本節(jié)的官方參考文章: https://developers.google.com/android-publisher/authorization
2-1 創(chuàng)建 api 項目
- 進入https://console.developers.google.com/cloud-resource-manager, 點擊
創(chuàng)建項目
填寫項目名稱后,項目就創(chuàng)建完成了
創(chuàng)建完成之后智亮,需要啟用所需要的
api服務
忆某,點擊啟用API和服務
搜索
Google Play Android Developer API
,我們將使用這個 API 服務來查詢訂單阔蛉,點擊啟用它點擊創(chuàng)建憑據
實際上是跳轉到
test-api
這個項目的憑據創(chuàng)建了弃舒,點擊信息中心
,可以看到API
列表中出現(xiàn)了Google Play Android Developer API
状原,還有請求次數聋呢,錯誤,錯誤率等信息
2-2 創(chuàng)建 OAuth 客戶端 ID
接下來準備創(chuàng)建
OAuth客戶端ID
颠区,點擊憑據
先填寫
OAuth同意屏幕
削锰,應用名稱那一行可以隨便填寫,反正是給自己看的毕莱,填完應用名稱
之后器贩,還需要填已授權的網域
,然后點擊最下方的保存
按鈕已授權的網域
最好填寫要發(fā)起請求的后臺所用的域名朋截,假設我的后臺為sdk.keylala.cn
磨澡,則此處填寫keylala.cn
準備創(chuàng)建
OAuth客戶端ID
填寫的內容 _ 應用類型選擇: 網頁應用 _ 名稱:隨意填寫了 _ 已獲授權的 JavaScript 來源:
https://keylala.cn
_ 已獲授權的重定向 URI:https://keylala.cn
,這個隨便质和,比如寫成https://keylala.cn/callback
稳摄,不一定需要這個接口真實存在的,但一定要記著這個URI
饲宿,后文中我們稱之為redirectURI
點擊
創(chuàng)建
按鈕厦酬,獲得客戶端 ID 和客戶端密鑰,下文中分別稱為clientId
和clientSecret
2-3 獲取 code
- 請將下方
url
中的redirect_uri
和client_id
填寫上2-2
中獲取的參數
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=...
&client_id=...
- 放到瀏覽器上(此時不要關閉之前的頁面, 此瀏覽器需要登錄谷歌開發(fā)者賬號瘫想,且不能點退出)仗阅,另起一個頁面標簽,復制上去国夜,點擊允許
- 這時候會跳轉到
redirect_uri
開頭的地址减噪,如果redirect_uri
是胡亂填的,這里會出現(xiàn)一個404
頁面或者無法訪問的提示车吹,不過沒關系筹裕,請將地址欄中的地址復制下來,把code=4/xxxxx
的值取出來窄驹,這里就獲得了code
的值朝卒。 -
code
的值類似這樣的一長串:4/eWdxD7b-YSQ5CNNb-c2iI83KQx19.wp6198ti5Zc7dJ3UXOl0T3aRLxQmbwI
2-4 獲取 refresh_token
發(fā)送
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
工具發(fā)送請求這樣就獲取了
refresh_token
,下文中稱refreshToken
乐埠,這個token
是一個長久有效的token
抗斤,可以保存起來
3 項目關聯(lián)
在
2
中我們創(chuàng)建了一個API
服務囚企,名為:test-api
,以及獲取了這個api
的一系列參數我們可以創(chuàng)建很多個 api瑞眼,給不同 api 啟用不同的谷歌 api
這里我們要將我們的游戲應用與我們所需要的
API
服務關聯(lián)起來登錄
Google Play Console
, 鏈接: https://play.google.com/apps/publish龙宏,登錄之后點擊設置
按鈕點擊
API權限
之后,能在右側發(fā)現(xiàn)我們前面創(chuàng)建的test-api
這個項目伤疙,點擊關聯(lián)
烦衣,這樣我們就可以用test-api
中谷歌提供的接口Google Play Android Developer API
來查詢這個賬號下所有應用的訂單信息了
4 參數保存
- 要驗證訂單我們需要以下參數,這些參數可以保存在后臺中
- clientId: OAuth 客戶端 ID
- clientSecret: OAuth 客戶端密鑰
- redirectURI: 自己填寫的重定向地址
- code
- refreshToken
5 驗證
訂單來源分兩種掩浙,一種是商品花吟,一種是訂閱,不同來源的訂單調用的
api
是不同的商品訂單查詢接口: https://developers.google.com/android-publisher/api-ref/purchases/products/get
訂閱訂單查詢接口: https://developers.google.com/android-publisher/api-ref/purchases/subscriptions/get
這里使用
商品訂單查詢接口
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", // 開發(fā)者透傳參數 "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:項目沒有關聯(lián)拭抬,或者關聯(lián)到錯誤的
API
項目上了部默,請看3 項目關聯(lián)
產生的原因 2:谷歌服務的 BUG,這時候只要在該應用的商店內造虎,隨意增加一個內購或者訂閱傅蹂,再看看是不是這個問題就消失了。新增的內購或者訂閱可以刪除的算凿。