访问google pay的接口,国内需要翻墙
1获取code
需要在浏览器登录谷歌账号,填写redirect_uri和client_id(在谷歌后台里面获取),然后在浏览器中访问https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/androidpublisher&response_type=code&access_type=offline&redirect_uri=…&client_id=…
然后跳转到redirect_uri地址,redirect_uri乱写可能会出现404,不用在意,直接在上方地址栏复制code,code类似于一长串4/uQH…g6Z3M
2获取refresh_token
发送POST请求到https://accounts.google.com/o/oauth2/token
grant_type=authorization_code
code //上面获取的code
client_id //客服端id,在谷歌后台获取
client_secret //客服端秘钥,在谷歌后台获取,没有秘钥可不用client_secret参数
redirect_uri //谷歌后台配置,填写的重定向地址
注意:refresh_token是一个长久有效的,每个code只会生成一次refresh_token,需要及时保存
3.获取token
grant_type : refresh_token
client_id //在谷歌后台获取
client_secret //没有秘钥可不用这个参数
refresh_toke //上方2获取refresh_token
4验证订单
获取token,查询订单,代码如下:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
)
var(
PackageName=""//包名
GrantType="refresh_token"
ClientId=""//客户端id
ClientSecret=""//客户端秘钥
RefreshToken=""//RefreshToken,上面第二步获取的
)
type TokenInfo struct {
AccessToken string `json:"access_token"`
ExpiresIn int `json:"expires_in"`
Scope string `json:"scope"`
TokenType string `json:"token_type"`
}
type OrderInfo struct {
Kind string `json:"kind"`
PurchaseTimeMillis string `json:"purchaseTimeMillis"` // 支付时间, 毫秒
PurchaseState int `json:"purchaseState"`// 是否付费: 0 已支付, 1 取消
ConsumptionState int `json:"consumptionState"`// 是否被消费: 0 未消费, 1 已消费
DeveloperPayload string `json:"developerPayload"`// 开发者透传参数
OrderId string `json:"orderId"`// 谷歌订单号
AcknowledgementState int `json:"acknowledgementState"`// 支付类型: 0 测试, 1 真实
}
func main() {
info:=PostRefreshToken()//获取token
productId:=""//商品 ID,即内购 ID,客户端传递过来当前购买的产品
token:=""//充值的时候,前端支付获取的token值
GetOrder(productId,token,info.AccessToken)//查询订单
}
//获取token凭证
func PostRefreshToken() *TokenInfo{
resp, err := http.PostForm("https://accounts.google.com/o/oauth2/token", url.Values{"grant_type": {GrantType},
"client_id": {ClientId}, "client_secret":{ClientSecret},"refresh_token": {RefreshToken}})
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("PostToken body err:",err)
}
fmt.Println("token:",string(body))
info:=new(TokenInfo)
error := json.Unmarshal(body, &info)
if err != nil {
fmt.Println("PostToken Unmarshal err:",error)
}
fmt.Println("token info:",info)
return info
}
//获取订单信息
func GetOrder(productId,token,accessToken string) *OrderInfo{
client := &http.Client{}
resp, err := client.Get("https://www.googleapis.com/androidpublisher/v3/applications/"+
PackageName+"/purchases/products/"+productId+"/tokens/"+token+"?access_token="+accessToken+"")
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("GetOrder body err:",err)
}
fmt.Println("GetOrder:",string(body))
info:=new(OrderInfo)
error := json.Unmarshal(body, &info)
if err != nil {
fmt.Println("GetOrder Unmarshal err:",error)
}
fmt.Println("GetOrder info:",info)
return info
}
5错误
开发中遇到的问题:
401:token授权到期
403:有两个原因 ,当时测试我遇到了第一个问题,改了之后,第二天又报错了,确定项目绝对是关联上的,然后发现是第二个问题导致的。
1:项目没有关联,或者关联到错误的API项目上了。
2:谷歌服务的 BUG,在该应用的商店内,随意增加一个内购或者订阅,再看看是不是这个问题就消失了。新增的内购或者订阅可以删除的。
来源:CSDN
作者:weixin_38849917
链接:https://blog.csdn.net/weixin_38849917/article/details/104029629