微信H5支付必须后端调用v3接口下单获取mweb_url跳转,前端不可直接调chooseWXPay;需配置H5权限、HTTPS redirect_url白名单,并以notify_url异步通知为准校验支付结果。

微信 H5 支付必须走后端下单,前端不能直接调 chooseWXPay
前端 JS 里写 chooseWXPay 在普通 H5 页面里根本不会执行——它只在公众号内、且用户已关注、页面域名已配置在「JS 接口安全域名」中时才可能生效。绝大多数所谓「H5 页面接入微信支付」的失败,都卡在这一步。别试了,chooseWXPay 不是给纯 H5 用的。
真正能跑通的方案只有一种:后端调 /v3/pay/transactions/h5(普通商户)或 /v3/pay/partner/transactions/h5(服务商),拿到 mweb_url 或 h5_url,前端用 window.location.href 跳转过去。微信客户端会自动唤起收银台。
- 跳转前必须确保当前域名已在商户平台开通「H5 支付」权限(单独申请,不是默认开通)
-
out_trade_no必须全局唯一,6–32 字符,仅含数字、字母、_-|* -
total_amount单位是「分」,不是元;传990表示 9.90 元,传9.9或"9.90"会返回invalid total_fee - 不要手动拼
redirect_url参数,而是作为下单请求 body 的redirect_url字段由后端传给微信(否则跳转后可能丢失)
后端签名和参数必须严格按 v3 接口规范,别套用老版 v2 文档
现在主流都用微信支付 v3 API,所有字段、签名方式、时间格式都和旧版不同。用 v2 的 unifiedorder 拼参方式去调 v3 接口,100% 报错,比如 invalid trade_type 就是因为传了 JSAPI 而不是 MWEB。
v3 下单必须带 Authorization 请求头,用商户私钥对请求路径 + 时间戳 + 随机字符串 + 请求体做 SHA256 with RSA 签名,不是简单拼接 MD5。
立即学习“前端免费学习笔记(深入)”;
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
trade_type必须是MWEB(不是JSAPI或NATIVE) -
time_expire必须是 RFC3339 格式,例如"2026-04-16T18:30:00+08:00",不能是时间戳或 YYYY-MM-DD HH:MM:SS -
description不能空,长度 ≤127 字符,会出现在用户微信账单里,要真实可读 - 请求域名必须用
https://api.mch.weixin.qq.com(主)或https://api2.mch.weixin.qq.com(备),不能用 v2 的api.mch.weixin.qq.com无版本号路径
H5 支付跳转后无法返回?检查 redirect_url 的协议、域名、路径是否全匹配
微信支付完成或取消后,会 302 跳回你指定的 redirect_url。但这个地址必须满足三个硬性条件,缺一不可:
- 协议必须是
https(HTTP 直接被拒) - 域名必须和你在商户平台「H5 支付」里配置的完全一致(包括 www 和非 www)
- 路径部分可以带参数,但整个 URL 必须提前注册在商户平台白名单中(不是只填域名,要填完整路径如
https://pay.example.com/callback)
常见现象是跳转后卡在微信收银台「完成」页不动,或者跳回首页而非预期页面——基本就是 redirect_url 校验失败,微信静默丢弃了重定向。
支付结果不能信前端回调,必须依赖后端异步通知 + 主动查单
前端跳转回来的页面(即 redirect_url)只是个提示入口,不能用来判断是否支付成功。用户可能中途关掉页面、网络中断、甚至伪造跳转 URL。微信的 return_url 是同步响应,不保证送达;只有 notify_url 是微信服务器主动 POST 的异步通知,且带完整签名,才是唯一可信依据。
稳妥做法是三步走:
- 用户跳转回
redirect_url后,页面显示「处理中」,同时前端轮询自己后端的订单查询接口(/order/status?out_trade_no=xxx) - 后端收到微信
notify_url后,先验签(用平台证书解密 + 校验resource.algorithm),再更新订单状态 - 轮询接口返回「已支付」才展示成功页;超时未返回则引导用户点「查看订单」手动查单
最容易被忽略的是:微信异步通知可能延迟数秒甚至重试多次,而前端轮询间隔如果太短(如 500ms),会给后端造成无效压力;太长(如 5s)又影响体验。建议首 3 次 1s 间隔,之后逐步退避到 3s。


















