微信公众号内h5支付实际应使用jsapi支付,因仅jsapi可在微信内置浏览器调起支付收银台;需服务号认证、开通权限、配置js安全域名;后端用thinkphp统一下单获取prepay_id并签名;前端通过oauth2.0获取openid后调用choosewxpay;最终以微信异步通知为准校验支付结果。

在微信公众号内做H5支付,实际要用的是 JSAPI支付(不是H5支付),因为只有JSAPI才能在微信内置浏览器中调起支付收银台。H5支付适用于非微信浏览器(如手机自带浏览器打开网页),而公众号/小程序内必须用JSAPI。下面讲清关键步骤和常见踩坑点。
一、确认开通权限与配置域名
JSAPI支付需满足以下前提:
- 公众号类型为服务号,且已认证
- 在【微信支付商户平台】开通“JSAPI支付”权限
- 在【公众号后台 → 公众号设置 → 功能设置】中,正确填写JS接口安全域名(注意:仅支持http/https,不带路径,如
pay.example.com,不能写https://pay.example.com/pay) - 确保该域名已备案、能被微信服务器访问(用于回调通知)
二、ThinkPHP后端统一下单(获取prepay_id)
核心是调用微信统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder),生成 prepay_id。推荐使用官方SDK或封装好的HTTP请求。
关键参数说明:
-
appid:公众号的AppID(不是商户号) -
mch_id:微信支付商户号 -
nonce_str:随机字符串(建议用uniqid()+mt_rand()生成) -
body:商品描述 -
out_trade_no:商户订单号(建议用date('ymd').uniqid()等保证唯一) -
total_fee:金额,单位为分(如1元传100) -
spbill_create_ip:用户真实IP(ThinkPHP可用request()->ip()获取) -
notify_url:支付结果异步通知地址(必须是外网可访问的HTTPS或备案过的HTTP) -
trade_type:固定填JSAPI -
openid:当前公众号用户(需先通过OAuth2.0静默授权获取,不能用JS SDK的wx.getUserInfo)
下单成功后,从返回的XML中解析出 prepay_id,再按微信要求生成签名字段,组装成JS调用所需参数:
{
"appId": "wx123...",
"timeStamp": "171xxxxxx",
"nonceStr": "abc123...",
"package": "prepay_id=wx123...",
"signType": "MD5",
"paySign": "xxx"
}
三、前端JS调起支付(注意OpenID来源)
后端返回上述签名参数后,前端调用 wechat-js-sdk 的 chooseWXPay:
- 确保已通过
config接口注入权限验证配置(需后端提供jsapi_ticket和签名) - 调用
wechat.chooseWXPay(options),传入上一步返回的参数 - 特别注意:
openid必须来自公众号OAuth2.0授权获取(https://open.weixin.qq.com/connect/oauth2/authorize?...),不能用用户未关注时的临时openid,也不能用unionid替代
常见错误:提示“支付参数错误”或“支付验证失败”,90%是因为 appid、openid、prepay_id 不匹配,或域名未配置/不一致。
四、处理支付结果与回调
前端 chooseWXPay 只返回用户操作结果(成功/取消/失败),不保证支付真实完成。最终状态必须以微信服务器的 异步通知(notify_url)为准:
- 收到POST请求后,先校验签名(用商户密钥对XML原文验签)
- 检查
return_code和result_code是否都为SUCCESS - 校验
out_trade_no是否合法、是否重复处理(建议加数据库锁或幂等判断) - 更新订单状态为“已支付”,并返回
<xml><return_code>SUCCESS</return_code></xml>(必须是纯XML,无空格、无BOM)
ThinkPHP中建议将notify逻辑单独设为无需CSRF、无需登录的接口,并关闭中间件(如VerifyToken、Auth等)。
不复杂但容易忽略:JSAPI支付本质是“公众号+微信支付+用户openid”三方绑定行为,每一步的ID和域名都必须严格一致。调试时多看微信支付文档的“常见问题”章节,比查报错代码更高效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











