从零开始的微信支付 Native 支付接入教程,包含完整的订单管理、支付、退款、回调处理等功能。适合独立开发者快速上手微信支付开发。
./wechatpay-native-demo
├── README.md
├── cert
├── config
│ └── config.go
├── go.mod
├── go.sum
├── handler
│ ├── notify.go
│ └── payment.go
├── main.go
├── service
│ ├── order_store.go
│ └── wechatpay.go
└── templates
├── index.html
├── orders.html
├── pay.html
└── success.html
- Native 支付 - PC 网站扫码支付,微信扫一扫完成付款
- 订单管理 - 创建订单、查询订单、关闭订单
- 退款功能 - 全额/部分退款,退款状态查询
- 回调处理 - 支付回调、退款回调,自动更新订单状态
- 公钥模式 - 支持微信支付公钥模式(2024年后新商户)
- 内存存储 - 无需数据库,开箱即用
- 响应式页面 - 支持 PC 和移动端查看
- Go 1.21+
- 微信商户号(已开通 Native 支付)
- 商户 API 证书 + 微信支付公钥
登录 微信支付商户平台:
| 配置项 | 获取路径 | 说明 |
|---|---|---|
| 商户号 (MCHID) | 账户中心 → 商户信息 → 商户号 | 10位数字 |
| APIv3 密钥 | 账户中心 → 安全中心 → API 安全 → 设置 APIv3 密钥 | 32位随机字符串 |
| 商户证书序列号 | 账户中心 → 安全中心 → API 安全 → 查看证书 | 32位十六进制 |
| 商户证书私钥 | 账户中心 → 安全中心 → API 安全 → 下载证书 | apiclient_key.pem |
| 微信支付公钥 ID | 账户中心 → 安全中心 → 微信支付公钥 → 查看公钥 ID | 格式:PUB_KEY_ID_xxx |
| 微信支付公钥 | 账户中心 → 安全中心 → 微信支付公钥 → 下载公钥 | pub_key.pem |
证书 vs 公钥的区别:
- 商户证书(私钥):用于对请求签名,证明你是商户
- 微信支付公钥:用于验证微信响应的签名,证明是微信官方返回
# 克隆项目
git clone https://github.com/axiaoxin-com/wechatpay-native-demo.git
cd wechatpay-native-demo
# 创建证书目录
mkdir -p cert
# 放置证书文件
cp /path/to/apiclient_key.pem cert/ # 商户私钥(签名用)
cp /path/to/pub_key.pem cert/ # 微信公钥(验签用)
# 配置环境变量
cp .env.example .env
# 编辑 .env 文件,填入你的商户配置
# 运行
go mod tidy
go run .
# 访问 http://localhost:8080
编辑 .env 文件:
# 微信支付配置(必填)
WXPAY_APPID=wx1234567890abcdef # 公众号/小程序/移动应用 AppID
WXPAY_MCHID=1234567890 # 商户号
WXPAY_APIV3_KEY=YourAPIv3KeyHere # APIv3 密钥(32位)
# 商户证书(用于请求签名)
WXPAY_CERT_SERIAL_NO=1234567890ABCDEF # 商户证书序列号
WXPAY_PRIVATE_KEY_PATH=./cert/apiclient_key.pem # 商户私钥路径
# 微信支付公钥(用于验证响应签名,2024年后新商户)
WXPAY_PUBLIC_KEY_ID=PUB_KEY_ID_xxx # 微信支付公钥 ID
WXPAY_PUBLIC_KEY_PATH=./cert/pub_key.pem # 微信支付公钥路径
# 支付回调地址(必须是外网可访问的 HTTPS 地址)
WXPAY_NOTIFY_URL=https://yourdomain.com/api/notify
# 服务器配置
PORT=8080
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | / |
商品首页 |
| GET | /orders.html |
订单管理页面 |
| GET | /pay?order_id=xxx |
支付页面(展示二维码) |
| POST | /api/order |
创建订单 |
| GET | /api/orders |
订单列表 |
| GET | /api/order/:id |
查询订单 |
| POST | /api/order/:id/close |
关闭未支付订单 |
| POST | /api/order/:id/refund |
申请退款 |
| POST | /api/notify |
微信支付回调(支付/退款) |
1. 创建订单 → 2. 生成二维码 → 3. 用户扫码支付 → 4. 微信回调通知 → 5. 更新订单状态
1. 申请退款 → 2. 微信处理 → 3. 退款回调通知 → 4. 更新订单状态为已退款
Q: 为什么需要同时配置商户证书和微信支付公钥?
商户证书(私钥)用于对请求签名,微信支付公钥用于验证响应签名。两者作用不同:
- 你发送请求 → 用商户私钥签名 → 微信用商户公钥验签
- 微信发送回调 → 用微信私钥签名 → 你用微信公钥验签
Q: 为什么收不到回调通知?
- 检查
WXPAY_NOTIFY_URL是否为外网可访问的 HTTPS 地址 - 检查服务器防火墙是否放行微信支付回调 IP
- 查看日志确认是否收到请求
- 确保申请退款时传入了
notify_url参数
Q: 生产环境需要注意什么?
- 必须使用 HTTPS
- 替换内存存储为数据库(MySQL/PostgreSQL 等)
- 添加请求限流、防重放攻击等安全措施
- 妥善保管证书文件,不要提交到代码仓库
- 后端: Go + Gin + wechatpay-go
- 前端: HTML5 + Vanilla JS + QRCode.js
- 支付: 微信支付 Native 支付 APIv3
本项目基于微信支付官方文档和 wechatpay-go SDK 开发,仅供学习交流使用。
如果这个项目对你有帮助,欢迎 Star ⭐