支付宝H5支付无需前端SDK,直接用<form>提交服务端返回的HTML表单;微信H5支付必须先完成jweixin-1.x.x.js的config签名配置,否则wx.chooseWXPay静默失败。

支付宝 H5 支付不需要前端 SDK,直接用 <form> 提交就能唤起收银台;微信 JS-SDK 则必须引入 jweixin-1.x.x.js 并完成签名配置,否则 wx.chooseWXPay 会静默失败。
支付宝 H5 支付:用 form 表单提交,别写 fetch
很多人误以为要调用支付宝 JS 接口,其实官方明确不提供前端 SDK。服务端返回的是一个包含 alipay_trade_page_pay 参数的 HTML 表单字符串,你只需要把它插入页面并自动 submit:
- 服务端返回的响应体是纯 HTML 片段,不是 JSON,不要用
fetch().then(res => res.json())解析 - 表单
action是支付宝网关地址(如https://openapi.alipay.com/gateway.do),method 必须为POST - 所有参数(
app_id、biz_content、sign等)都已由服务端签名完成,前端只负责透传,不能修改或重签 - 如果页面已有其他 form,注意避免 ID 冲突或 submit 被拦截;建议用
document.createElement('form')动态创建并 submit
微信 H5 支付:jweixin 必须在支付前完成 config
jweixin-1.x.x.js 的 config 调用不是可选步骤,而是硬性前置条件。没成功 config,后续任何 wx API 都不会触发回调,且无报错提示。
- config 所需的
jsapi_ticket和nonceStr、timestamp、url必须和服务端签名时完全一致,尤其是url要和当前页面完整 URL(含 hash 前)严格匹配 - 微信要求
url不带参数?错——它要求是「当前浏览器地址栏显示的完整 URL」,包括 query 和 hash(但不含 fragment 后的 # 部分) - config 失败时,
ready和error回调都不会触发,只能靠debug: true开启调试模式看控制台输出 - 支付调用必须在
ready回调内执行,否则可能因 JS-SDK 初始化未完成而卡住
异步通知验签:千万别在前端做
无论是支付宝还是微信,notify_url 收到的异步通知都必须由服务端验证签名,前端 JavaScript 没有私钥、无法安全验签,也不该接触支付结果判定逻辑。
立即学习“前端免费学习笔记(深入)”;
- 前端收到同步跳转(如支付宝的
return_url或微信的redirect_uri)只能展示“请稍后查看订单状态”,不能直接标记支付成功 - 同步跳转参数(如
out_trade_no、trade_status)可被用户篡改,不具备可信度 - 真正确认支付成功的唯一依据,是服务端收到并验签通过的异步通知,或主动调用
alipay.trade.query/pay/orderquery查询结果 - 前端轮询订单状态时,接口应只返回订单当前状态字段(如
status: "paid"),不暴露原始通知数据
沙箱环境调试:域名和证书最容易卡住
支付宝沙箱不校验域名白名单,但微信沙箱仍强制要求 H5 域名已在商户平台配置,且必须备案。本地开发时这两个点最常导致“唤不起支付”。
- 支付宝沙箱:确保服务端用的是沙箱
gateway地址(https://openapi.alipaydev.com/gateway.do),且应用公钥/私钥对使用沙箱生成的版本 - 微信沙箱:H5 域名必须和商户平台「产品中心 → H5 支付 → 开发配置」中填写的完全一致,包括协议(
https://)、端口(如有)、路径前缀 - 微信要求域名备案,但沙箱环境下允许使用未备案域名测试——前提是该域名已添加到商户平台,且服务器能被微信服务器访问(即公网可达)
- HTTPS 证书问题:微信要求必须是有效证书(不能是自签名或过期),支付宝沙箱则接受任意证书
真正难的不是调用接口,而是让服务端返回的参数刚好满足客户端唤起条件——少一个字段、时间戳差几秒、URL 多了个斜杠,都会导致收银台打不开,且错误信息全藏在支付宝/微信客户端内部,前端几乎看不到原因。



















