概要
在配置微信公众号相关接口,方便后续业务接口配合微信公众号使用时,需要先通过微信公众号的接口校验,本文将探讨如何使用golang gin框架开发接口,然后在微信公众平台上配置该接口并通过校验
整体架构流程
微信公众平台会向所配置的url发送get请求,并校验请求返回的数据来判定是否校验通过。这里所配置的url接口,就是我们服务端所需要进行开发的。大致的处理步骤如下:
- 第一步:配置接口
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey- URL:在服务端上所开发的接口地址
- Token:开发者自己定义即可,服务端接口处也会用到
- EncodingAESKey:随机生成
- 第二步:微信公众平台发送get请求
微信公众平台向所配置url发送get请求,在服务端需要参数进行加密匹配(技术细节中详细讲解),请求参数包括:- signature:微信加密签名
- timestamp:时间戳
- nonce:随机数
- echostr:随机字符串
- 第三步:绑定成功
技术细节-服务端处理
接口参数
微信公众平台发送get请求,附上4个param:signature、timestamp、nonce、echostr
还有一个开发者自定义的token,也要求保存在服务端中(后续进行sha加密匹配会使用到)
接口处理逻辑
- 将timestamp、nonce、token三个参数按照字典序进行排序,将排序后的三个参数拼接成字符串
- 将拼接后的字符串输入sha加密算法进行加密,得到密文
- 将密文与signature进行比较,如相同,则匹配成功,证明该则消息来自微信公众平台
- 匹配成功则原样返回echostr
详细代码(golang实现)
package api
import (
"crypto/sha1"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"sort"
)
/**
* @Author: liangyuliang
* @Description:
* @File: WexinHandler
* @Version: 1.0.0
* @Date: 2023/5/8 20:57
*/
type CheckSignatureRequest struct {
Signature string `form:"signature"`
Timestamp string `form:"timestamp"`
Nonce string `form:"nonce"`
Echostr string `form:"echostr"`
}
/**
* checkSignature
* @Description: 用于微信公众号校验服务器
* @receiver server
* @param ctx
*/
func (server *Server) checkSignature(ctx *gin.Context) {
//从配置文件中读取token
//config, _ := utils.LoadConfig()
wechatToken := "liangyuliang"
var param CheckSignatureRequest
if err := ctx.ShouldBindQuery(¶m); err != nil {
errorResponse400(ctx, err)
}
// 对timestamp、nonce、echostr三个参数进行字典序排序
slice := sort.StringSlice{param.Timestamp, param.Nonce, wechatToken}
sort.Strings(slice)
// 将字符串数组拼接成字符串
str := ""
for _, value := range slice {
str += value
}
//fmt.Printf("Signature: %v\n", param.Signature)
//fmt.Printf("Timestamp: %v\n", param.Timestamp)
//fmt.Printf("Nonce: %v\n", param.Nonce)
//fmt.Printf("Echostr: %v\n", param.Echostr)
//fmt.Printf("Str: %v\n", str)
h := sha1.New()
h.Write([]byte(str))
hashcode := fmt.Sprintf("%x", h.Sum(nil))
//fmt.Printf("hashcode: %v\n", hashcode)
if hashcode != param.Signature {
// 校验不通过
//fmt.Printf("signature is not equal!Expected: %s, actually: %s\n", param.Signature, hashcode)
errorResponse500(ctx, errors.New(fmt.Sprintf("signature is not equal!Expected: %s, actually: %s\n", param.Signature, hashcode)))
}
ctx.Writer.Write([]byte(param.Echostr))
}
小结
以上是微信公众平台配置接口进行校验的过程,编写完的api接口是需要部署在有公网ip的服务器上,微信公众平台才可以发送get请求进行访问的。另:微信公众平台对ngrok内网穿刺的域名进行屏蔽了,所以在本地运行服务并使用ngrok内网穿刺的方案,微信公众平台是无法访问的!!!!