商家参数格式有误,请联系商家解决
在做微信H5支付的时候难免会遇到这个问题,一般最常见的问题是请求头没有设置referer这个参数或referer参数域名与微信那边设置的安全域名不一致导致的。在这里只讲前者的解决方法,后者自行咨询微信那边处理。
下面提供Android、快应用、uni-app等开发的解决办法。
第一步 明确问题所在:
第一种方法就是在请求后端支付接口返回的http协议的接口时,前端手动设置请求头referer该参数。如果该接口通过按钮或js事件触发的话一般会自动带上referer这个参数。那么前端如何伪造这个Referer参数呢,我们接着往下看。
首先说一下安卓的解决方法,请移步到https://blog.csdn.net/fuzhongbin/article/details/77162010,这个帖子讲的还是比较详细的,看完后基本能解决安卓上webView的微信H5支付的问题。
下面我再说一下原理,其实微信那边是需要验证Referer这个参数的,而我们之间把链接复制到浏览器上打开却会出现这个页面。
看到这个页面后相信你已经在浏览器上疯狂的搜索了,文档也不看,啥也不管,我就上百度、Bing、Google、CSDN、博客园等到处搜索,但很荣幸你能看到我这篇帖子,基本上看完可以解决你所遇到的问题。
第二步 如何解决:
首先我们先上微信官方文档定位到该问题所在位置。
首先微信就说了可能是你Referer为空导致的,在这里很多小伙伴们就要问了啥是Referer值呢?Referer值在哪呢?相信看到这里有些小伙伴已经明白了,有些还是一头雾水。我来找怎么解决这个问题,你来跟我扯这么多干哈呢,都看到这里也不说正事。那我们下面就直接上才艺。
第三步 啥是Regerer:
打开浏览器的F12开发者模式。
可以很明显的看到了Request Headers中有个Referer参数。上个官方的Demo自行调试。——> https://wxpay.wxutil.com/mch/pay/h5.v2.php
第四步 解决问题
我由于是在uniapp开发快应用的时候遇到的这个问题,其实在其他地方也可行。由于uniapp发起请求无法伪造请求头referer这个参数,我就用后端做一次url转发解决了,下面以PHP实现为例,其它的编程语言自行百度搜索接口转发。
第五步 代码实现以PHP为例
/** * url转发接口,可用于快应用微信H5支付 * @Route("/transpondUrl") * @param Request $request * @return Response */ public function transpondUrlAction(Request $request){ $url = $request->get("url"); // 获取接口传入需要转发的url注意需要用url编码。由于基于Symfony框架实现$request可以直接获取url参数,原生可用$_GET['url']代替 $userAgent = $request->headers->get("user-agent"); if (empty($url) or $url == "") return new Response("参数不完整。"); if (empty($userAgent)) $userAgent = $this->getAgent(); $ch = curl_init(); if (preg_match("/^https:\\/\\/.+/",$url)) { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); } $cip = $request->getClientIp(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $userAgent); @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 60); curl_setopt ($ch, CURLOPT_AUTOREFERER, 1); // curl_setopt ($ch, CURLOPT_COOKIEJAR, './cookie.txt'); // cookie日志 // 微信Wap支付需要伪造请求头Referer该参数,该参数需设置与微信支付配置都安全域名一致 curl_setopt ($ch, CURLOPT_REFERER, "{设置与微信H5支付的安全域名}"); curl_setopt($ch, CURLOPT_HTTPHEADER, ["CLIENT-IP:$cip"]);// 这里需要设置客户端的Ip地址,用于伪造请求IP地址 curl_setopt ($ch, CURLOPT_HEADER,1);//显示返回的HEAD区域的内容 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 10); $result = curl_exec($ch); curl_close($ch); return new Response($result);// 返回响应内容 } public function getAgent() { $agentarry = [ "iPhone11" => "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.18 NetType/WIFI Language/en", "华为P9全网通" => "Mozilla/5.0 (Linux; Android 7.0; EVA-AL00 Build/HUAWEIEVA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/zh_CN", "小米5X" => "Mozilla/5.0 (Linux; U; Android 7.1.2; zh-cn; MI 5X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.2.2", "一加手机3" => "Mozilla/5.0 (Linux; Android 7.1.1; ONEPLUS A3000 Build/NMF26F; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/WIFI Language/zh_CN", "努比亚Z11" => "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-cn; NX531J Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 Chrome/37.0.0.0 MQQBrowser/6.8 Mobile Safari/537.36", "小米5s" => "Mozilla/5.0 (Linux; Android 6.0.1; MI 5s Build/MXB48T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/WIFI WebP/0.3.0 Pixel/1080", "华为nova" => "Mozilla/5.0 (Linux; Android 7.0; HUAWEI CAZ-AL10 Build/HUAWEICAZ-AL10; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.1.0_692_YYB_D QQ/7.1.0.3175 NetType/WIFI WebP/0.3.0 Pixel/1080", "联想ZUK Z2 Pro" => "Mozilla/5.0 (Linux; Android 7.0; ZUK Z2121 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 V1_AND_SQ_7.2.0_730_YYB_D QQ/7.2.0.3270 NetType/4G WebP/0.3.0 Pixel/1080", "魅蓝note 3" => "Mozilla/5.0 (Linux; Android 5.1; m3 note Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1)", "三星GALAXY S8+" => "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9550 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36", "魅族MX6 " => "Mozilla/5.0 (Linux; Android 6.0; MX6 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.49 Mobile MQQBrowser/6.2 TBS/043508 Safari/537.36 MicroMessenger/6.5.13.1100 NetType/4G Language/zh_CN", "vivo Xplay5A" => "Mozilla/5.0 (Linux; Android 5.1.1; vivo Xplay5A Build/LMY47V; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/48.0.2564.116 Mobile Safari/537.36 T7/9.3 baiduboxapp/9.3.0.10 (Baidu; P1 5.1.1)", "三星GALAXY C7" => "Mozilla/5.0 (Linux; U; Android 6.0.1; zh-CN; SM-C7000 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.6.2.948 Mobile Safari/537.36", "三星GALAXY S8" => "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; SM-G9500 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36", "荣耀8青春版" => "Mozilla/5.0 (Linux; U; Android 7.0; zh-CN; PRA-AL00 Build/HONORPRA-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36", "UCOpenwave" => "Openwave/ UCWEB7.0.2.37/28/999", "UC Opera" => "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999", "小米4S" => "Mozilla/5.0 (Linux; U; Android 5.1.1; zh-cn; MI 4S Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/53.0.2785.146 Mobile Safari/537.36 XiaoMi/MiuiBrowser/9.1.3", "OPPO R12" => "Mozilla/5.0 (Linux; U; Android 7.1.1; zh-CN; OPPO R11 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.7.0.953 Mobile Safari/537.36", "iPhone2" => "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MicroMessenger/6.5.7 NetType/WIFI Language/zh_CN", ]; return $agentarry[array_rand($agentarry,1)]; }
第六部 前端调用转发接口
前端只需要通过请求或者在webview中调用这个接口把微信返回的url js用urlEncodeComponent(url)【注:url编码方法,以js为例】编码一下,再填入转发接口即可。
该参数需设置与微信支付配置都安全域名一致