go语言google pay支付验证订单

依然范特西╮ 提交于 2020-01-26 01:54:03

访问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,在该应用的商店内,随意增加一个内购或者订阅,再看看是不是这个问题就消失了。新增的内购或者订阅可以删除的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!