项目涉及到微信H5支付,记录一下,省的再用的时候跑去翻别人的
H5支付 : 手机web页面唤醒微信客户端进行支付
申请 : 以前需要联系微信客服申请,现在可以在微信商户平台里开通
H5支付开发步骤:
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
常见问题:
1 回调页面判定问题
正常情况下,正常流程用户支付完成后会返回至发起支付的页面 ,如下图,我们在微信客户端支付成功后,系统会自动切换到浏览器的该页面(不会刷新页面)
官方文档里建议引导用户手动确认支付结果,即下图中的弹窗,那么在 什么时刻去弹出这个引导框 呢,
我做了一下测试,从微信支付完成 到 切换回 浏览器支付前页面这一过程,并没有一个明确的事件可以让我们用来界定 切换 回来,使用 js 里的 beforeunload、unload、或者监听 窗口的 hidden 属性 都或多或少的存在兼容性问题,我测试了几种效果,最终选择 点击确认支付 按钮后使用setTimeout(,2000) 来弹出该引导框
2 商家参数格式有误问题
开发文档里标注是由于 当前调起H5支付的referer为空导致,什么时候会造成referer为空呢?
$_SERVER['HTTP_REFERER'] 完全来源于浏览器。并不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,$_SERVER['HTTP_REFERER'] 不总是真实正确的。
$_SERVER['HTTP_REFERER'] 会无效:
1、直接输入网址访问该网页。
2、Javascript 打开的网址。
3、Javascript 重定向(window.location)网址。
4、使用 meta refresh 重定向的网址。
5、使用 PHP header 重定向的网址。
6、flash 中的链接。
7、浏览器未加设置或被用户修改。
所以一般来说,只有通过 超链接 <a href="">href</a>以及 POST 或 GET 表单访问的页面,$_SERVER['HTTP_REFERER'] 才有效。
另外还有一个问题需要注意 ,要在支付页面打开 唤醒微信客户端链接,尽量避免中间穿插跳转,一些手机厂商自带的浏览器会对 referer 的判定不一样,由于背景原因,我在这里入坑一次
3 网络环境未能通过安全验证,请稍后再试
商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致
例如:(无代理情况下)
我在局域网中开发,手机使用charles代理访问微信统一下单接口,此时 后台php获取到的 clientIP为
192.168.32.100 ,为局域网IP,但是微信服务器验证我的IP时,却使用的是我的外网IP 与 局域网IP做对比,所以开发时需要先 固定spbill_create_ip为公网 ipv4 地址,然后访问统一下单接口。
网友评论