Go语言实现微信公众平台消息接收与响应
本文将展示如何利用Go语言构建微信公众平台的后端接口,重点讲解如何完成服务器Token验证以及如何通过接收XML格式的POST请求来解析用户消息并返回相应的响应内容。
准备条件
在开始代码编写之前,请确保已准备好以下基础环境:
Go开发环境(建议版本 1.10+)- 一个可被公网访问的服务器或内网穿透工具(用于调试微信服务器回调)
- 微信公众平台的“开发者中心”中配置的
Token
核心代码结构
实现微信公众平台对接主要涉及两个核心部分:URL验证(获取 access_token 前的配置阶段)和业务消息处理(关注后的日常交互)。完整的演示代码如下:
/*
*@go语言实现公众平台
*/
package main
import (
"crypto/sha1"
"encoding/xml"
"fmt"
"io"
"log"
"net/http"
"sort"
"strings"
"time"
)
type Request struct {
ToUserName string
FromUserName string
CreateTime time.Duration
MsgType string
Content string
MsgId int
}
type Response struct {
ToUserName string `xml:"xml>ToUserName"`
FromUserName string `xml:"xml>FromUserName"`
CreateTime string `xml:"xml>CreateTime"`
MsgType string `xml:"xml>MsgType"`
Content string `xml:"xml>Content"`
MsgId int `xml:"xml>MsgId"`
}
func str2sha1(data string) string {
t := sha1.New()
io.WriteString(t, data)
return fmt.Sprintf("%x", t.Sum(nil))
}
func action(w http.ResponseWriter, r *http.Request) {
postedMsg, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Fatal(err)
}
r.Body.Close()
v := Request{}
xml.Unmarshal(postedMsg, &v)
if v.MsgType == "text" {
v := Request{v.ToUserName, v.FromUserName, v.CreateTime, v.MsgType, v.Content, v.MsgId}
output, err := xml.MarshalIndent(v, " ", " ")
if err != nil {
fmt.Printf("error:%v\n", err)
}
fmt.Fprintf(w, string(output))
} else if v.MsgType == "event" {
Content := `"欢迎关注
我的微信"`
v := Request{v.ToUserName, v.FromUserName, v.CreateTime, v.MsgType, Content, v.MsgId}
output, err := xml.MarshalIndent(v, " ", " ")
if err != nil {
fmt.Printf("error:%v\n", err)
}
fmt.Fprintf(w, string(output))
}
}
func checkSignature(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
var token string = "你的token"
var signature string = strings.Join(r.Form["signature"], "")
var timestamp string = strings.Join(r.Form["timestamp"], "")
var nonce string = strings.Join(r.Form["nonce"], "")
var echostr string = strings.Join(r.Form["echostr"], "")
tmps := []string{token, timestamp, nonce}
sort.Strings(tmps)
tmpStr := tmps[0] + tmps[1] + tmps[2]
tmp := str2sha1(tmpStr)
if tmp == signature {
fmt.Fprintf(w, echostr)
}
}
func main() {
http.HandleFunc("/check", checkSignature)
http.HandleFunc("/", action)
http.ListenAndServe(":8080", nil)
}
操作步骤说明
第一步:配置服务器URL验证 (checkSignature)
目的:确保发送到该接口的请求确实来自微信服务器,这是启用开发者模式的前提。
操作与原理:
- 当在微信公众平台后台填入服务器地址时,微信会发起一次 GET 请求。
- 代码中定义了路由
/check,对应checkSignature函数。 - 该函数提取 URL 参数中的
signature、timestamp、nonce。 - 将
token(需替换为您在后台设置的自定义Token)、timestamp、nonce三个字符串按字典序排序并拼接。 - 对拼接后的字符串进行 SHA1 哈希运算,若结果与
signature一致,则输出echostr,验证成功。
第二步:处理用户消息 (action)
目的:接收用户在公众号发出的信息,并进行简单的逻辑判断与回复。
入口:根路径 /,对应 action 函数,该函数主要处理 POST 请求。
详细动作:
- 读取请求体:使用
ioutil.ReadAll(r.Body)获取原始 XML 数据。 - 反序列化:利用
xml.Unmarshal将 XML 数据映射到Request结构体中。 - 业务逻辑分支:
- 若
MsgType == "text":示例代码直接回显了收到的请求结构(实际项目中通常在此处添加智能回复逻辑)。 - 若
MsgType == "event":通常用于处理“关注”等事件,示例中固定返回了一段欢迎语。
- 若
- 序列化响应:构造
Response结构体(注意代码中复用Request结构体构造返回值,这在 Go 的 XML Tag 定义兼容情况下可行,但需注意字段对应关系),并通过xml.MarshalIndent格式化为 XML 字符串返回给客户端。
第三步:启动服务
运行 main 函数,程序将监听本地 :8080 端口。在测试环境中,请确保防火墙放行该端口,或使用 ngrok 等工具暴露公网地址供微信服务器调用。
注意事项与排错
- Token 一致性:务必确保代码中
token变量的值与微信公众平台后台设置的 Token 完全一致,否则无法通过签名验证。 - 依赖检查:代码使用了标准库
crypto/sha1和encoding/xml,无需安装第三方包即可运行。 - XML 标签:注意 Response 结构体中的
xml:"xml>..."标签写法,这用于生成标准的微信 XML 响应头。request结构体缺少EventKey等 Event 特有字段,若需处理复杂事件(如扫码带参数),需扩展结构体。
以上就是使用Go语言实现微信公众平台消息接收与响应的详细内容,更多关于Go语言开发、后端架构优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













