微信支付中遇到过哪些坑?

微信内

基于jssdk的调用

1
2
3
4
5
6
7
8
9
10
11
// 需要引入SDK
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

基于getBrandWCPayRequest的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 不需要引入SDK
const wxPay = (data, resolve, reject) => {
function onBridgeReady () {
window.WeixinJSBridge.invoke(
'getBrandWCPayRequest', data.payInfo,
function (res) {
if (res.err_msg === 'get_brand_wcpay_request:ok') {
resolve({res, data})
return
}
if (res.err_msg === 'get_brand_wcpay_request:cancel' || res.err_msg === 'get_brand_wcpay_request:fail') {
reject({res, data})
}
}
)
}
// 如果是微信支付
if (typeof window.WeixinJSBridge === 'undefined') {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false)
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady)
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady)
}
} else {
onBridgeReady()
}
}
export default data => {
return new Promise((resolve, reject) => {
wxPay(data, resolve, reject)
})
}
  • 公众号后台添加支付目录
    目录以/结尾,微信支付会以最后一个为当前目录调起支付
    如果配置的域名为:www.abc.com/
    则只能在 www.abc.com/aa,www.abc.com/bb, …下进行支付
    而不能在www.abc.com/aa/下支付
  • 添加业务域名(否则会弹出,防欺骗盗号,请勿输入密码)

微信外

网络环境未能通过安全验证,请稍后再试

商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致的

  • 造成此问题的原因:
    1、绑定host引起
    2、来回切换线上和测试环境,以及本地环境导致的
  • 解决办法:
    1
    2
    3
    4
    5
    # nginx 配置
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-Port $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

商家参数格式有误,请联系商家解决

调起H5支付的referer为空或者和支付域名不一致导致的

  • 造成此问题的原因:
    1、直接访问本地服务调支付,缺少referer
    2、绑定的服务域名和支付域名不一致
  • 解决办法:
    将服务通过反向代理到支付域名,设置支付目录到域名

商家存在未配置的参数,请联系商家解决

1、当前调起H5支付的域名(微信侧从referer中获取)与申请H5支付时提交的授权域名不一致,如需添加或修改授权域名,请联系我们的商务同事操作
2、如果设置了回跳地址redirect_url,请确认设置的回跳地址的域名与申请H5支付时提交的授权域名是否一致

  • 造成此问题的原因:
    1、redirect_url的referer,也就是上一个问题说到的,需要与支付域名保持一致的referer
    2、redirect_url的encode,只能encode一次,如果产生两次仍会报错此问题
    3、redirect_url的参数如果是连接,如果在支付回调地址中带有url类参数,不能有具体的链接信息
    4、联系微信商务,配置mweb(h5支付域名)
  • 解决办法:
    1、referer在支付内保持一致
    2、由于有些浏览器自动encode,无论redirect_url中是否encode,都先decode之后再进行encode传递给微信支付
    3、拦截地址参数中存在的/,在服务中进行转换

h5无法确定支付状态

  • 用户点击“取消支付“或支付完成后点“完成”按钮。因为无法保证页面回跳时,支付流程已结束
  • 用户在调起h5支付后,触发一个自定义回调,让用户在回到此页面时,手动触发获取支付状态,进而判断成功与否

未解决的问题

  • 如果用户手机中装有两个浏览器,支付成功或取消支付后,微信会自动调起默认浏览器,但用户可能是从第三方浏览器中发起支付
    这样造成的问题,无法触发上一个问题的自定义回调