欢迎来到缘购网

商家参数格式有误 - 微信H5支付完美解决方案

0 0

岁月如歌

岁月如歌 楼主 2021-11-17 13:35:09

一、业务场景发生

最近在跟一些合作公司作业务对接,在对方的APP中接入我们的H5支付,包括微信和支付宝。

那就开搞,进展顺利,貌似一切都在掌握之中,给到对方一个链接即可调起支付。形如:

https://www.batsing.com/api/h5pay?appid=1234567001&userid=10&money=0.01&paytype=weixin

通过QQ或者浏览器打开即可付款发货,丝滑完美。

然而。。。接入到他们APP中却报错了,赶紧去微信开发文档看看

pic_router.png

微信官方给的方案很简单,让APP开发的去修改webview,但这,合理吗?

对于自家做APP的是可以。但对于像我们这种做第三方的,这显然不是一个优秀的解决途径,那怎么办呢?

二、 问题本质

出现这个问题的本质是什么呢?是APP中页面跳转到MWEB_URL的请求中没有带上Referer。

(APP中的webview把一些http请求头给吃掉了,referer不会像普通浏览器那样自动识别转发出去)

既然前端的解决方案不友好,那就换成后端来解决,强大的curl可以模拟一切http请求。

三、Hack跟踪微信H5支付过程

在微信下单接口解析xml得到 MWEB_URL,然后对照着微信开发文档,经过一番参数调试,伪造了请求IP和referer,请求IP要与调用下单接口时传递的客户端IP一致,referer要与微信商户后台上填写的授权域名一致。

然后捕捉到了正常的微信支付页面代码。


这是curl发送模拟请求的代码

<?php

$mweb_url = 'https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096';

$headers = [

    "CLIENT-IP:" . $_SERVER['REMOTE_ADDR'],

    "X-FORWARDED-FOR:" . $_SERVER['REMOTE_ADDR'],

];

$result = Common_Http::curl_get_content($mweb_url, [

    'CURLOPT_HTTPHEADER' => $headers,

    'CURLOPT_REFERER' => 'https://www.batsing.com'

]);

echo'<pre>';print_r(htmlspecialchars($result));echo'</pre>';


打印出来得到的内容如下,我们只看 window.onload 部分就可以了。

一开始还以为一直被判断“网络环境未能通过安全验证”,然后才发现那段是被注释掉的,被虚晃了一枪。

关键部分,页面里有两段一样的 weixin://wap/pay? 开头的网址,很明显这个网址就是要拉起手机里的微信应用发起支付的。

其他的js代码逻辑也很简单,先从顶层跳转到weixin:// 即是拉起支付,然后5秒钟后跳转到重定向地址(若无重定向地址则返回上一页)。

我们尝试用手机直接访问这个 weixin:// 网址,确实可以拉起手机支付,支付也可以顺利完成到账。

那可以确定,IP地址和referer校验只是在 https://wx.tenpay.com/ 这里有做,到了 weixin://wap/pay 这一步他就不再校验这些设备信息了。

四、制作新的H5支付页面

最后,我们参照微信H5支付页面,拼出一个类似的H5界面,实现跳转支付以及5秒后跳转到支付完成页;

这样就可以实现在webview中也能顺利发起微信H5支付,并实现同样的跳转逻辑了。




请登陆后回贴

  • 会员中心
  • 浏览记录
  • 我的订单
  • 我的收藏
  • 在线客服

    点击这里给我发消息

    官方微信

    仅处理投诉、举报及平台使用问题;
    商品问题请咨询商家客服!

  • 意见反馈
  • 返回顶部
浏览记录