这是一个基于微信公众号实现登录验证的 Go 语言示例项目,用户可以通过关注微信公众号获取验证码,然后使用验证码完成登录认证。
. ├── main.go # 程序入口 ├── config/ # 配置管理 │ └── config.go # 环境变量加载和配置 ├── db/ # SQLite 数据库文件目录 ├── handle/ # 业务处理层 │ └── handle.go # 登录、微信消息处理等 ├── middleware/ # 中间件 │ └── middleware.go # JWT 认证、CORS 等中间件 ├── pkg/ # 核心包 │ ├── database/ # 数据库连接 │ ├── jwt/ # JWT Token 生成和解析 │ └── models/ # 数据模型 ├── static/ # 静态资源 │ └── index.html # 前端页面 ├── util/ # 工具函数 │ └── util.go # 签名验证、随机字符串生成等 ├── .env # 环境变量配置文件 ├── go.mod # Go 模块依赖 └── go.sum # 依赖校验文件
go mod download
复制并编辑 .env 文件:
# 微信公众号后台的 Token(需与微信公众平台配置一致) TOKEN=your_wechat_token # 服务相关配置 SERVER_PORT=8080 GIN_MODE=debug # GIN_MODE=release # JWT 相关配置 SECRET=your_jwt_secret_key JWT_EXPIRE_HOURS=24 # 数据库相关配置 DB_NAME=user
http://your-domain.com/wx.env 中的 TOKEN 一致)
go run main.go
服务将在 http://localhost:8080 启动。
打开浏览器访问:http://localhost:8080

http://localhost:8080
A3Bf9K)GET /wx
微信服务器首次接入时的签名验证。
Query 参数:
signature: 微信加密签名timestamp: 时间戳nonce: 随机数echostr: 随机字符串POST /wx
接收微信服务器推送的消息
Request Body (XML):
<xml>
<ToUserName><![CDATA[公众号]]></ToUserName>
<FromUserName><![CDATA[用户OpenID]]></FromUserName>
<CreateTime>1234567890</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[验证码]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
Response (XML):
<xml>
<ToUserName><![CDATA[用户OpenID]]></ToUserName>
<FromUserName><![CDATA[公众号]]></FromUserName>
<CreateTime>1234567890</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[A3Bf9K]]></Content>
</xml>
POST /login
使用验证码登录。
Request Body:
{
"code": "A3Bf9K"
}
Response:
{
"code": 200,
"message": "登录成功",
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
GET /user/profile
获取当前登录用户的信息(需要认证)。
Headers:
Authorization: Bearer {token}
Response:
{
"code": 200,
"message": "获取用户详情成功",
"data": {
"user": {
"id": 1,
"username": "oABC123xyz...",
"code": "A3Bf9K",
"created_at": "2025-11-24T14:41:40.037873121+08:00",
"updated_at": "2025-11-24T14:41:40.037873121+08:00"
}
}
}
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | uint | 主键,自增 ID |
| username | string | 用户名(微信 OpenID) |
| code | string | 登录验证码(6位随机字符串) |
| created_at | time.Time | 创建时间 |
| updated_at | time.Time | 更新时间 |
math/rand 生成 6 位随机字符串,包含大小写字母和数字.env 中配置由于微信公众号需要外网访问,本地开发时可以使用内网穿透工具:
示例(使用 ngrok):
# 启动本地服务
go run main.go
# 另开一个终端,启动内网穿透
ngrok http 8080
然后将 ngrok 生成的外网地址配置到微信公众平台。
程序运行时会输出详细日志:
[GIN-debug] GET /wx --> cnb.cool/gebangfeng/mp-auth/handle.WXCheckSignature [GIN-debug] POST /wx --> cnb.cool/gebangfeng/mp-auth/handle.WXMsgReceive [GIN-debug] POST /login --> cnb.cool/gebangfeng/mp-auth/handle.Login [GIN-debug] GET /user/profile --> cnb.cool/gebangfeng/mp-auth/handle.Getprofile 微信公众号接入校验成功!
.env 中的 TOKEN 是否与微信公众平台配置一致handle.go:97 行关键词匹配逻辑(必须完全匹配"验证码")Authorization: Bearer {token}.env 中的 SECRET 配置GIN_MODE=release
推荐使用 Nginx 作为反向代理:
server { listen 80; server_name your-domain.com; location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
微信公众平台强烈建议使用 HTTPS,可以使用 Let's Encrypt 免费证书。
使用 systemd、supervisor 或 PM2 等工具确保服务持续运行。
MIT License
gebangfeng
欢迎提交 Issue 和 Pull Request!
注意: 本项目仅供学习参考,生产环境使用请根据实际情况进行安全加固和优化。