博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信支付-H5支付绕过ip地址
阅读量:6600 次
发布时间:2019-06-24

本文共 2561 字,大约阅读时间需要 8 分钟。

跟着上一篇的微信文章,上一章没有H5的支付。在这周工作种,主要是对H5支付功能进行代码编写,这篇文章算是一次总结,也让新手遇到我的问题,可以有个解决方案。

微信H5支付的特殊要求:

H5支付和JSAPI支付差不多,但是是在其他浏览器进入到微信端。微信团队为了做这个用户校验,要求添加一个字段spbill_create_ip终端IP,必须传正确的用户端IP,支持ipv4、ipv6格式。这个IP地址,安装微信团队的思路来说,就是前端获取就可以了,但舔狗最好还是一无所有,发现除开在QQ浏览器上,我是可以正确使用,但是换了其他浏览器之后,就出现各种问题。

坑的解说

在订单成功发送之后,会返回mweb_url支付跳转链接,前端通过这个连接就可以跳转到微信,并且进行支付:window.location.href=mweb_url;

这样都好理解,然而。如果不在QQ浏览器上使用的时候,就跳转不了?这什么操作?

原来,这行代码。其实是再次做请求。获取到行行String字符串,也可以理解为是HTML。也就是说,其实是在前端添加HTML代码,这里面的内容再次跳转到微信端。

理清一下这个思路:

①mweb_url 字段是用来再次做请求,并且做校验

②获取到的HTML数据,是真正的跳转链接

在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,最重的方法是为了获得准确的跳转链接。在后端获取,所以我们使用的是后端的地址,而不是前端的地址。并在后端正确获取到。

但前端还是需要传一个数据,来替代IP,就是当前的的地址。在前端跳转到微信的时候,会做URL校验,判断是否是本页面做的支付请求。虽然不知道这个有什么用,还是需要传的。

方法总结:

①终端IP地址由后端提供

②需要前端传URL地址

代码准备:

获取到准确的跳转地址

/**url 微信返回的mweb_urlrefererUrl 前端URL地址*/public String getWeiUrl(String url,String refererUrl) throws Exception {    Map
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
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复制代码

下面是结果

转载于:https://juejin.im/post/5cd638066fb9a032233545f6

你可能感兴趣的文章
五险一金,你清楚吗?
查看>>
Ip核_fifo
查看>>
基础 JavaScript 实例
查看>>
自定义pageControl
查看>>
repquota命令--Linux命令应用大词典729个命令解读
查看>>
我的友情链接
查看>>
设置vs解决方案跟随右边cpp
查看>>
Linux下Web服务器应用之源码构建LAMP环境
查看>>
Linux Administration
查看>>
如何使版面富有节奏感
查看>>
rabbitmq 管理及常用命令
查看>>
iphone导航控制器的开发与使用
查看>>
debian python library re-install
查看>>
如何用转义来给JS添加的input元素设置单引号
查看>>
php 从hbase 获取数据
查看>>
J2E——网络编程练习
查看>>
VirtualBox移植
查看>>
HTTP要被抛弃? 亚洲诚信携手宝塔开启HTTPS加密快速通道
查看>>
Chrome: 完全移除对WoSign和StartCom证书的信任
查看>>
RecyclerView侧滑删除功能
查看>>