微信H5支付提示“商家存在未配置的参数,请联系商家解决“的问题----java

很多人对接微信H5支付的时候有时候会提示一个“商家存在未配置的参数,请联系商家解决”的问题,明明按照文档上面的对接已经对接起来了,而且mweb_url参数也回来了,但是调起微信却报这个错误
这个问题一般是因为域名与微信商户平台配置的域名不一致导致的,解决的办法也很简单
1、登陆微信商户平台,查看自己配置的域名有没有问题(要备案且用https访问),不过一般能添加上去都是没有问题的
2、检查网站提交支付的域名与微信商户平台的域名是否一致,如果不一致,一个是可以把域名添加到微信商户平台上面,第二个是网站域名换成和微信商户平台的域名一致
3、上面的两个很多人都知道排查,也很容易排查出来,第三个特别要注意的是头部参数Referer(具体做什么的自行百度),这个的域名如果不一致也会导致出现这个问题,而且这个是隐形的,容易忽略,这个做聚合支付是最容易出现的,明明mweb_url已经回来了,就是调起出问题,很多人喜欢用redirect去直接调起,这样很容易导致下面提交上来的地址直接传给微信了,如果这个时候两个域名不一致就会出现这个问题了,这个问题的解决办法有两种
一 : 前端到页面的时候直接跳转到,正确的域名下面在请求支付。
二 : 是伪造referer(这种方法不建议)

//伪造referer
ASP:
 
dim http
set http=server.createobject("MSXML2.XMLHTTP") '//MSXML2.serverXMLHTTP也可以
Http.open "GET",url,false
Http.setRequestHeader "Referer","http://www.05809.cn/"
Http.send()
 
PHP(前提是装了curl):
 
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.05809.cn/xxx.asp");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.05809.cn/");
curl_exec ($ch);
curl_close ($ch);
 
PHP(不装curl用sock)
 
$server = 'www.dc9.cn';
$host = 'www.dc9.cn';
$target = '/xxx.asp';
$referer = 'http://www.dc9.cn/'; // Referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)
\n"; } else { $out = "GET $target HTTP/1.1\r\n"; $out .= "Host: $host\r\n"; $out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEG\r\n"; $out .= "Referer: $referer\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } VB.NET/C#.NET Dim oXMLHttp As MSXML2.XMLHTTP30 = New MSXML2.XMLHTTP30() 或者 MSXML2.XMLHTTP30 oXMLHttp = new MSXML2.XMLHTTP30(); oXMLHttp.open(.... oXMLHttp.setRequestHeader(... oXMLHttp.send(.. //js var url = "http://www.yourtarget.com"; var param = "name=david&age=30"; var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); obj.Open("POST", url, false); obj.Option(4) = 13056; obj.Option(6) = false; //false可以不自动跳转,截取服务端返回的302状态。 obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); obj.setRequestHeader("Referer", "http://www.baidu.com"); obj.Send(param); WScript.Echo(obj.responseText); //app app 解决if (("4.4.3".equals(android.os.Build.VERSION.RELEASE)) || ("4.4.4".equals(android.os.Build.VERSION.RELEASE))) { //兼容这两个版本设置referer无效的问题 view.loadDataWithBaseURL("商户申请H5时提交的授权域名", "", "textml", "utf-8", null); } else { Map extraHeaders = new HashMap<>(); extraHeaders.put("Referer", "商户申请H5时提交的授权域名"); view.loadUrl(targetUrl, extraHeaders); } //java /** * 用httpClient 模拟修改referer属性,仅供用于WEB安全防范示例。 * * @author auth */ public class EasyModifyHeader { public static void main(String[] args) throws Exception { CloseableHttpClient httpclient = HttpClients.createDefault(); try { String url = "http://www.wuranyubao.cn/wryb_rdcity.php"; HttpPost httpPost = new HttpPost(url); //设置防外链头信息 httpPost.setHeader("origin", "http://www.wuranyubao.cn"); httpPost.setHeader("referer", "http://www.wuranyubao.cn/wryb_prev.php?movie=no"); //建立HttpPost对象 List params=new ArrayList(); //建立一个NameValuePair数组,用于存储欲传送的参数 params.add(new BasicNameValuePair("rdcity","Shandong,Jinan,20151121")); httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); CloseableHttpResponse response = httpclient.execute(httpPost); try { HttpEntity entity = response.getEntity(); //打印目标网站输出内容 System.out.println(EntityUtils.toString(entity)); EntityUtils.consume(entity); } finally { response.close(); } } finally { httpclient.close(); } } }

模拟点击提交,这个时候Referer就统一了

微信支付是有些坑,但是只要耐心去解决,还是很容易的

你可能感兴趣的:(java,支付,java,https,javascript)