跟着上一篇的微信文章,上一章没有H5的支付。在这周工做种,主要是对H5支付功能进行代码编写,这篇文章算是一次总结,也让新手遇到个人问题,能够有个解决方案。html
H5支付和JSAPI支付差很少,可是是在其余浏览器进入到微信端。微信团队为了作这个用户校验,要求添加一个字段spbill_create_ip终端IP,必须传正确的用户端IP,支持ipv四、ipv6格式。这个IP地址,安装微信团队的思路来讲,就是前端获取就能够了,但舔狗最好仍是一无全部,发现除开在QQ浏览器上,我是能够正确使用,可是换了其余浏览器以后,就出现各类问题。前端
在订单成功发送以后,会返回mweb_url支付跳转连接,前端经过这个链接就能够跳转到微信,而且进行支付:window.location.href=mweb_url;git
这样都好理解,然而。若是不在QQ浏览器上使用的时候,就跳转不了?这什么操做?github
原来,这行代码。实际上是再次作请求。获取到行行String字符串,也能够理解为是HTML。也就是说,实际上是在前端添加HTML代码,这里面的内容再次跳转到微信端。web
理清一下这个思路:后端
①mweb_url 字段是用来再次作请求,而且作校验浏览器
②获取到的HTML数据,是真正的跳转连接bash
在HTML中,有这几行代码(稍后会提供)服务器
url="weixin://wap/payprepayid%327097225 &package=977**** &noncestr=15****8 &sign=6882******ea";
top.location.href=url;复制代码
你会发现,这个连接的几个参数就是用来作支付校验的。在经过top.location.href进入到微信端,若是你去看JD的H5支付,也会发现这行代码。JD也是绕够了这个IP微信
准确的说,是绕过前端的IP,最重的方法是为了得到准确的跳转连接。在后端获取,因此咱们使用的是后端的地址,而不是前端的地址。并在后端正确获取到。
但前端仍是须要传一个数据,来替代IP,就是当前的的地址。在前端跳转到微信的时候,会作URL校验,判断是不是本页面作的支付请求。虽然不知道这个有什么用,仍是须要传的。
方法总结:
①终端IP地址由后端提供
②须要前端传URL地址
获取到准确的跳转地址
/**
url 微信返回的mweb_urlrefererUrl 前端URL地址*/
public String getWeiUrl(String url,String refererUrl) throws Exception {
Map<String, String> header = new HashMap<>();
header.put("Accept-Language", "zh-CN,zh;q=0.9");
header.put("Accept-Encoding", "gzip, deflate, br");
header.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
header.put("Referer", refererUrl);
header.put("Host", "wx.tenpay.com");
header.put("Upgrade-Insecure-Requests", "1");
header.put("Cache-Control", "no-cache");
header.put("Pragma", "no-cache");
String s = HttpUtils.get(url, null, header);
logger.info("HTML ->"+s+" ->"); //能够在这里看数据
String temp=s.substring(s.indexOf("weixin://") , s.length() - 1);
return temp.substring(0, temp.indexOf("\""));
复制代码
spbill_create_ip 是传的后端的地址,代码等下更新到GitHub上面。
使用:
String total_fee = "1";
//合成表单
PayHouse payHouse = new PayHouse.Builder(new MyConfig())
.setAttach("")
.setBody("")
.setOutTradeNo(UUID.randomUUID().toString().replaceAll("-", ""))
.setTotalFee(total_fee)
.setTradeType(WxPayTradeType.H5PAT)
.setPayAPIType(PayAPIType.UNIFIEDORDER)
.setProductId("")
.setSpbillCreateIp("服务器的地址")
.setRefererUrl("前端的URL地址")
.build();
Map<String, String> implement = payHouse.implement();
System.out.println(implement);复制代码
打印
{mweb_url=weixin://wap/pay?prepayid%3Dwx1112*****4&package=6****2&noncestr=****54&sign=d803*****cc8f5}
前端使用
top.location.href=mweb_url复制代码
下面是结果