一、准备工作(账号 & 资料)
1. 注册并认证微信商户号
• 进入「微信支付商户平台」:商户号开通入口(需企业或个体户主体)
• 完成企业信息、法人信息、开户行信息等认证
• 拿到这些关键信息:
• 商户号:mchid
• 商户名称
• 绑定的微信支付商户平台登录账号
2. 获取微信支付相关参数
在 微信支付商户平台 → 账户中心 / API安全 / 开发配置 里,确认/配置:
• 商户号 MCH_ID:例如 1600000123
• 商户API密钥(API V3 key):
• 32 位字符串,例如:184084C29E9283529AA713A278FCB1FC
• 商户证书 & 私钥(API证书):
• 下载 apiclient_cert.pem
• 下载 apiclient_key.pem
• AppID / 公众号/小程序信息(如果你要 JSAPI 支付):
• 公众号 / 小程序:WECHAT_APP_ID
• 对应的 AppSecret(后端调用部分接口可能需要)
3. 配置支付回调域名
• 在商户平台中配置「支付通知 URL 所在域名」必须是 https。
• 你的后台需要有公网可访问的 HTTPS 地址(如 https://pay.xxx.com)。
⸻
二、设计整体流程(后端为主)
以 PC 网站下单 → 微信扫码支付(Native) 为例:
1. 用户在你的网站选择商品 → 点击「去支付」
2. 前端调用你自己的后端 API:POST /api/pay/create-order
3. 后端生成业务订单(写入数据库),然后调用微信支付「统一下单」接口,拿到 code_url
4. 后端把 code_url 返回给前端
5. 前端把 code_url 生成二维码,用户用微信扫码支付
6. 支付完成后:
• 微信服务器回调你配置的 notify_url
• 后端验证签名 → 修改订单状态为「已支付」→ 做发货/开通服务等操作
7. 前端轮询或 WebSocket 等方式查询订单状态,看到「支付成功」。
⸻
三、后端对接微信支付(以 API V3 Native 为例)
下面用伪代码/流程讲,具体代码可以之后按语言实现(Python/FastAPI、Java、PHP 都可以)。
- 统一下单(Native 场景)
• 接口:POST https://api.mch.weixin.qq.com/v3/pay/transactions/native
• 请求头:
• 使用 V3 签名(Authorization),需要:
• 商户号 mchid
• 商户证书序列号 serial_no
• 私钥 apiclient_key.pem
• 请求体的 SHA256 摘要
• 请求体示例(JSON):
{
"mchid": "1600000123",
"appid": "wx1234567890abcdef",
"description": "商品描述-测试订单",
"out_trade_no": "YOUR_ORDER_NO_123456",
"notify_url": "https://yourdomain.com/api/pay/wechat/notify",
"amount": {
"total": 100,
"currency": "CNY"
}
}
• 返回示例(精简):
{
"code_url": "weixin://wxpay/bizpayurl?pr=xxx"
}
你的后端逻辑:
1. 校验用户请求参数(商品ID、金额等)
2. 在你自己的数据库里创建一条订单记录(状态:待支付)
3. 调用微信「统一下单接口」,记录微信返回的 prepay_id/code_url 等信息
4. 如果成功,把 code_url 返回给前端
- 支付结果通知(异步回调)
• 回调 URL:你在统一下单时填的 notify_url(例如 https://yourdomain.com/api/pay/wechat/notify)
• 微信发送 POST 请求(application/json),内容是 加密的资源资源体(resource 字段)
• 你的后端需要:- 取出 HTTP 头中的签名 Wechatpay-Signature、时间戳 Wechatpay-Timestamp、随机串 Wechatpay-Nonce
- 用 API v3 密钥和商户证书公钥做签名验签
- 验证通过后,用 API V3 key 解密 resource.ciphertext 得到明文支付结果
- 根据明文内容里的:
• out_trade_no(你的订单号)
• trade_state(SUCCESS 等)
• amount(金额)
更新你数据库里的订单状态:
• 若 trade_state == SUCCESS → 标记为已支付、记录支付时间和流水号 transaction_id - 返回给微信一个固定格式的 JSON:
{
"code": "SUCCESS",
"message": "成功"
}
如果你返回错误码或者超时,微信会重试通知。
⚠️ 核心点:所有订单状态以「你本地数据库的记录」为准,微信通知只是触发状态更新的信号。
⸻
四、前端如何调用(以 PC 扫码支付为例)
1. 用户在商品详情页点击「立即支付」
2. 前端调用你的接口,例如:
fetch('/api/pay/create-order', {
method: 'POST',
body: JSON.stringify({
product_id: 123,
pay_channel: 'wechat_native'
})
}).then(res => res.json())
.then(data => {
// data.code_url
// 使用二维码组件生成二维码
})
3. 利用二维码库(如 qrcode.js 或前端框架对应插件)把 code_url 生成二维码让用户扫
4. 同时前端启动一个轮询:
setInterval(async () => {
const res = await fetch(`/api/pay/query-order-status?order_no=${orderNo}`);
const data = await res.json();
if (data.status === 'PAID') {
// 展示支付成功页面
clearInterval(timer);
}
}, 3000);
⸻
五、如果是「公众号/小程序内网页」→ JSAPI 支付
网站在微信内打开(比如 H5 通过公众号菜单/推文打开),可以用 JSAPI 支付,用户体验更好。
流程区别在于两点:
1. 统一下单接口换成 JSAPI 场景:
• URL:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi
• 请求体多一个 payer.openid 字段:
{
"mchid": "1600000123",
"appid": "wx1234567890abcdef",
"description": "商品描述-测试订单",
"out_trade_no": "YOUR_ORDER_NO_123456",
"notify_url": "https://yourdomain.com/api/pay/wechat/notify",
"amount": {
"total": 100,
"currency": "CNY"
},
"payer": {
"openid": "用户在该公众号下的openid"
}
}
2. 后端拿到 prepay_id 后,还要给前端一组 paySign 参数,前端调用 WeixinJSBridge 或 wx.chooseWXPay 发起支付。
• 这些参数包括:timeStamp、nonceStr、package=prepay_id=***、signType、paySign。
⸻
六、开发环境、测试 & 上线流程
1. 沙箱 / 小额真实支付测试
• 微信支付提供了「模拟支付」和低金额测试方式,建议先用小金额真实测试。
• 确认:
• 统一下单正常
• 回调通知能正常验签、解密、更新订单
2. 错误日志与风控
• 所有微信接口错误都要记录日志:
• 请求参数
• 微信返回状态码、错误码
• 对于异常订单(比如金额不一致、签名失败),一定不要直接标记支付成功,先人工排查。
3. 安全注意事项
• WECHAT_API_KEY、证书私钥等敏感信息放在环境变量或安全配置文件,不要写死在代码里,也不要提交到 Git。
• 回调接口一定要验签 + 解密,不能只看 out_trade_no 就认定是成功。
• 所有金额以分为单位,且校验你本地订单金额与微信通知金额一致。
⸻
七、你可以这样落地到当前项目
你之前已经在搞「支付中心 / FastAPI」:
• 建议做一个 统一支付中心服务,对外只暴露你自己的接口:
• POST /api/pay/create 创建订单
• GET /api/pay/status 查询订单
• POST /api/pay/wechat/notify 微信回调
• 将来再加:
• /api/pay/alipay/notify 支付宝回调
• 其他业务系统(商城、会员系统、课程系统等)只和「支付中心」交互,而不用再各自接一次微信/支付宝。
1万+

被折叠的 条评论
为什么被折叠?



