微信公众号验证服务器地址的有效性的golang版本代码实现演示
接入微信公众平台开发,填写服务器配置是必须的步骤,也是第一步
下面用Golang实现验证的环节
这里使用的是gin框架,免去了自己做服务底层的麻烦
首先看下,我们要写的接口具体接收哪些参数
从文档的上可以总结出,微信会发送四个参数
- echostr
- nonce
- signature
- timestamp
要注意这里是使用GET请求的
echostr := c.Request.URL.Query().Get("echostr")
nonce := c.Request.URL.Query().Get("nonce")
signature := c.Request.URL.Query().Get("signature")
timestamp := c.Request.URL.Query().Get("timestamp")
看下加密/校验流程:
1)将token、timestamp、nonce三个参数进行字典序排序
tmpSlice := []string{
token,
timestamp,
nonce,
}
sort.Strings(tmpSlice)
2)将三个参数字符串拼接成一个字符串进行sha1加密
tmpStr := strings.Join(tmpSlice, "")
h := sha1.New()
_, err := io.WriteString(h, tmpStr)
if err != nil {
return
}
sign := hex.EncodeToString(h.Sum(nil))
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信, 并且返回 echostr
if sign == signature {
c.Data(200, "text/html; charset=utf-8", []byte(echostr))
return
}
完整的代码如下
import (
"crypto/sha1"
"xxx/config"
"xxx/modules/log"
"xxx/modules/server"
"xxx/modules/utils"
"encoding/hex"
"io"
"sort"
"strings"
)
func Check(c *server.Context) {
log.InfoLogger.H("Check", utils.H{
"query": c.Request.URL.Query(),
})
echostr := c.Request.URL.Query().Get("echostr")
nonce := c.Request.URL.Query().Get("nonce")
signature := c.Request.URL.Query().Get("signature")
timestamp := c.Request.URL.Query().Get("timestamp")
token := config.Token
tmpSlice := []string{
token,
timestamp,
nonce,
}
sort.Strings(tmpSlice)
tmpStr := strings.Join(tmpSlice, "")
h := sha1.New()
_, err := io.WriteString(h, tmpStr)
if err != nil {
return
}
sign := hex.EncodeToString(h.Sum(nil))
if sign == signature {
log.InfoLogger.H("Check", utils.H{
"status": "ok",
})
c.Data(200, "text/html; charset=utf-8", []byte(echostr))
return
}
c.Data(200, "text/html; charset=utf-8", []byte("fail"))
return
}
版权声明
由 durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。