logo
0
0
Login

微信公众号登录 Demo

这是一个基于微信公众号实现登录验证的 Go 语言示例项目,用户可以通过关注微信公众号获取验证码,然后使用验证码完成登录认证。

功能特性

  • 微信公众号接入验证(Signature 校验)
  • 接收并处理微信公众号消息
  • 自动生成并回复 6 位随机验证码
  • 基于验证码的登录认证系统
  • JWT Token 认证机制
  • 用户信息管理
  • 前端页面(登录 + 个人中心)

技术栈

  • 后端框架: Gin Web Framework
  • 数据库: SQLite + GORM
  • 认证方式: JWT (JSON Web Token)
  • 配置管理: godotenv
  • Go 版本: 1.24.5

项目结构

. ├── 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 # 依赖校验文件

快速开始

1. 环境要求

  • Go 1.24+
  • 微信公众号(需要在微信公众平台配置服务器)

2. 安装依赖

go mod download

3. 配置环境变量

复制并编辑 .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

4. 配置微信公众号

  1. 登录 微信公众平台
  2. 进入「开发」-「基本配置」-「服务器配置」
  3. 配置服务器地址:http://your-domain.com/wx
  4. 配置 Token(需与 .env 中的 TOKEN 一致)
  5. 选择消息加解密方式(建议选择明文模式)
  6. 提交配置,等待验证通过

5. 运行项目

go run main.go

服务将在 http://localhost:8080 启动。

6. 访问前端页面

打开浏览器访问:http://localhost:8080

使用流程

用户登录流程

  1. 用户访问登录页面 http://localhost:8080
  2. 扫码关注配置的微信公众号
  3. 在公众号对话框中发送关键词:验证码
  4. 公众号自动回复 6 位随机验证码(如:A3Bf9K
  5. 用户在登录页面输入验证码
  6. 点击「立即登录」完成认证
  7. 登录成功后自动跳转到个人中心页面

技术实现流程

API 接口

1. 微信公众号接入验证

GET /wx

微信服务器首次接入时的签名验证。

Query 参数:

  • signature: 微信加密签名
  • timestamp: 时间戳
  • nonce: 随机数
  • echostr: 随机字符串

2. 微信消息接收

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>

3. 用户登录

POST /login

使用验证码登录。

Request Body:

{ "code": "A3Bf9K" }

Response:

{ "code": 200, "message": "登录成功", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } }

4. 获取用户信息

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" } } }

数据库设计

User 表

字段名类型说明
iduint主键,自增 ID
usernamestring用户名(微信 OpenID)
codestring登录验证码(6位随机字符串)
created_attime.Time创建时间
updated_attime.Time更新时间

安全说明

  1. 验证码生成: 使用 math/rand 生成 6 位随机字符串,包含大小写字母和数字
  2. JWT 认证: 使用 HS256 算法签名,Token 有效期可在 .env 中配置
  3. 签名验证: 微信公众号接入时进行 SHA1 签名验证,防止非法请求
  4. 中间件保护: 敏感接口通过 JWT 中间件进行认证校验

开发调试

本地开发建议

由于微信公众号需要外网访问,本地开发时可以使用内网穿透工具:

示例(使用 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 微信公众号接入校验成功!

常见问题

1. 微信公众号接入验证失败?

  • 检查 .env 中的 TOKEN 是否与微信公众平台配置一致
  • 确保服务器地址可以被微信服务器访问
  • 查看日志确认签名验证逻辑是否正确

2. 发送"验证码"没有回复?

  • 确认公众号消息推送配置已启用
  • 检查服务器日志是否收到消息推送
  • 确认 handle.go:97 行关键词匹配逻辑(必须完全匹配"验证码")

3. 登录时提示"验证码错误"?

  • 验证码有效期为永久(除非被新验证码覆盖)
  • 检查输入的验证码是否正确(区分大小写)
  • 确认数据库中是否存在该验证码记录

4. Token 认证失败?

  • 检查请求头是否正确携带:Authorization: Bearer {token}
  • 确认 Token 是否过期(默认 24 小时)
  • 检查 .env 中的 SECRET 配置

生产环境部署

1. 修改运行模式

GIN_MODE=release

2. 使用反向代理

推荐使用 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; } }

3. 使用 HTTPS

微信公众平台强烈建议使用 HTTPS,可以使用 Let's Encrypt 免费证书。

4. 进程守护

使用 systemd、supervisor 或 PM2 等工具确保服务持续运行。

许可证

MIT License

作者

gebangfeng

贡献

欢迎提交 Issue 和 Pull Request!

联系方式


注意: 本项目仅供学习参考,生产环境使用请根据实际情况进行安全加固和优化。