Go语言实现微信公众平台消息接收与响应

小岛来信
小岛来信
发布时间:2026-10-14| 5人浏览过
原创

本文将展示如何利用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)

目的:确保发送到该接口的请求确实来自微信服务器,这是启用开发者模式的前提。

操作与原理:

  1. 当在微信公众平台后台填入服务器地址时,微信会发起一次 GET 请求。
  2. 代码中定义了路由 /check,对应 checkSignature 函数。
  3. 该函数提取 URL 参数中的 signature、timestamp、nonce。
  4. 将 token(需替换为您在后台设置的自定义Token)、timestamp、nonce 三个字符串按字典序排序并拼接。
  5. 对拼接后的字符串进行 SHA1 哈希运算,若结果与 signature 一致,则输出 echostr,验证成功。

第二步:处理用户消息 (action)

目的:接收用户在公众号发出的信息,并进行简单的逻辑判断与回复。

入口:根路径 /,对应 action 函数,该函数主要处理 POST 请求。

详细动作:

  1. 读取请求体:使用 ioutil.ReadAll(r.Body) 获取原始 XML 数据。
  2. 反序列化:利用 xml.Unmarshal 将 XML 数据映射到 Request 结构体中。
  3. 业务逻辑分支:
    • 若 MsgType == "text":示例代码直接回显了收到的请求结构(实际项目中通常在此处添加智能回复逻辑)。
    • 若 MsgType == "event":通常用于处理“关注”等事件,示例中固定返回了一段欢迎语。
  4. 序列化响应:构造 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语言开发、后端架构优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。