Golang之微信【获取接口调用凭据】开发

{app.params.name}}{app.params.name}}{app.params.name}}

开始前先看下文档

接口是GET请求,请求的接口地址是https://api.weixin.qq.com/cgi-bin/token 

参数如下

返回的参数如下

根据以上的文档我们需要建立一个结构体

// TokenResponse 接收返回的参数 
type TokenResponse struct {
    AccessToken string `json:"access_token"`
    ExpiresIn   int    `json:"expires_in"`
    CurrentTime int64  `json:"current_time"` // 这个是逻辑需要,可以不加
}

这个TokenResponse就够用了,在golang中如何请求一个接口

url := "https://api.weixin.qq.com/cgi-bin/token"
client := &http.Client{}
params := utils.H{
    "grant_type": "client_credential",
    "appid":      config.AppID,
    "secret":     config.AppSecret,
}

req, err := http.NewRequest("GET", url, nil)

q := req.URL.Query()
for key, value := range params {
    q.Add(key, value.(string))
}
req.URL.RawQuery = q.Encode()

resp, err := client.Do(req)
if err != nil {
    log.InfoLogger.H(tag, utils.H{
        "error": err.Error(), "url": url})
    return
}

defer func(Body io.ReadCloser) {
    err := Body.Close()
    if err != nil {
        log.ErrorLogger.H(tag, gin.H{"error": err})
    }
}(resp.Body)

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.InfoLogger.H(tag, utils.H{
        "error": err.Error(), "url": url})
    return
}

以上代码,拿到body我们就获得了响应数据,如何把body的数据与结构体TokenResponse做数据交换

var res TokenResponse
err = json.Unmarshal(body, &res)

if err != nil {
    log.ErrorLogger.H(tag, gin.H{"error": err})
    return
}

以上的代码逻辑,就可以body的数据存到res中,之后就可以使用了,这块的底层逻辑大家喜欢的话可以自行查阅文档

log.InfoLogger.H(tag, utils.H{
    "access_token": res.AccessToken,
    "expires_in":   res.ExpiresIn})

以上的逻辑看起来非常简单,其实主要是有几点
一是对文档的分析,确定好需要的数据结构
二是掌握http库的使用

以上只是部分代码 完整代码如下

import (
	"xxx/config"
	"xxx/connections/redis"
	"xxx/modules/log"
	"xxx/modules/server"
	"xxx/modules/utils"
	"encoding/json"
	"github.com/gin-gonic/gin"
	"io"
	"io/ioutil"
	"net/http"
	"time"
)

type TokenResponse struct {
	AccessToken string `json:"access_token"`
	ExpiresIn   int    `json:"expires_in"`
	CurrentTime int64  `json:"current_time"`
}

func FetchAccessToken(c *server.Context) {
	tag := "FetchAccessToken"

	val, _ := redis.Get(tokenCacheKey(config.AppID))

	if val != "" {
		var res TokenResponse
		jsonErr := json.Unmarshal([]byte(val), &res)

		if jsonErr != nil {
			log.ErrorLogger.H(tag, gin.H{"error": jsonErr})
			return
		}

		log.InfoLogger.H(tag, utils.H{
			"cache_data": res})

		c.Success(res)
		return
	}

	url := "https://api.weixin.qq.com/cgi-bin/token"
	client := &http.Client{}
	params := utils.H{
		"grant_type": "client_credential",
		"appid":      config.AppID,
		"secret":     config.AppSecret,
	}

	req, err := http.NewRequest("GET", url, nil)

	q := req.URL.Query()
	for key, value := range params {
		q.Add(key, value.(string))
	}
	req.URL.RawQuery = q.Encode()

	resp, err := client.Do(req)
	if err != nil {
		log.InfoLogger.H(tag, utils.H{
			"error": err.Error(), "url": url})
		return
	}

	defer func(Body io.ReadCloser) {
		err := Body.Close()
		if err != nil {
			log.ErrorLogger.H(tag, gin.H{"error": err})
		}
	}(resp.Body)

	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.InfoLogger.H(tag, utils.H{
			"error": err.Error(), "url": url})
		return
	}

	var res TokenResponse
	err = json.Unmarshal(body, &res)

	log.InfoLogger.H(tag, utils.H{
		"body":   body,
		"res":    res,
		"params": params,
		"query":  req.URL.String()})

	if err != nil {
		log.ErrorLogger.H(tag, gin.H{"error": err})
		return
	}

	log.InfoLogger.H(tag, utils.H{
		"access_token": res.AccessToken,
		"expires_in":   res.ExpiresIn})

	res.CurrentTime = time.Now().Unix()

	redis.Set(
		tokenCacheKey(config.AppID),
		utils.JsonEncode(res),
		time.Duration(res.ExpiresIn)*time.Second)

	c.Success(res)
	return
}
func tokenCacheKey(appId string) string {
	return "wx:" + appId + ":access_token"
}

这里我整合了redis,将拿到的数据放到了redis中

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/163



版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/163