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

5 篇文章 0 订阅

很多人对接微信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)<br />\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时提交的授权域名",
                    "<script>window.location.href=\"" + targetUrl + "\";</script>",
                    "textml", "utf-8", null);
 } else {
      Map<String, String> 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<NameValuePair> params=new ArrayList<NameValuePair>();
            //建立一个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就统一了

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 `com.github.wechatpay-apiv3` 库处理微信 H5 支付Java 代码示例: ```java import com.github.wechatpay.apiv3.WxPayApiV3; import com.github.wechatpay.apiv3.WxPayApiV3Config; import com.github.wechatpay.apiv3.model.notify.WxPayOrderNotifyResult; import com.github.wechatpay.apiv3.model.notify.WxPayOrderNotifyResult.NotifyResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class WeChatH5NotifyHandler { private static final String WECHAT_API_CERT_SERIAL_NUMBER = "YOUR_WECHAT_API_CERT_SERIAL_NUMBER"; private static final String WECHAT_API_CERTIFICATE_PATH = "path/to/your/wechat/api/certificate.pem"; public void handleNotify(HttpServletRequest request, HttpServletResponse response) throws IOException { try { // 创建微信支付 API 配置 WxPayApiV3Config config = new WxPayApiV3Config.Builder() .appId("your_app_id") .merchantId("your_merchant_id") .privateKeySerialNumber(WECHAT_API_CERT_SERIAL_NUMBER) .privateKeyPath(WECHAT_API_CERTIFICATE_PATH) .build(); // 创建微信支付 API 实例 WxPayApiV3 wxPayApiV3 = new WxPayApiV3(config); // 解析异步通知数据 WxPayOrderNotifyResult notifyResult = wxPayApiV3.parseOrderNotifyResult(request); // 验证签名 if (wxPayApiV3.verifySignature(notifyResult)) { // 签名验证成功 // 处理支付成功的逻辑 // ... // 返回成功响应给微信服务器 response.setStatus(HttpServletResponse.SC_OK); response.getWriter().write("SUCCESS"); } else { // 签名验证失败,返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().write("FAIL"); } } catch (Exception e) { e.printStackTrace(); // 返回失败响应给微信服务器 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); response.getWriter().write("FAIL"); } } } ``` 在上述代码中,我们创建了一个名为 `WeChatH5NotifyHandler` 的类,其中的 `handleNotify` 方法用于处理微信 H5 支付的异步通知。该方法接收 `HttpServletRequest` 和 `HttpServletResponse` 对象作为参数,从求中获取异步通知的数据,并进行相应的处理逻辑。 在 `handleNotify` 方法中,我们首先创建了一个 `WxPayApiV3Config` 对象,用于配置微信支付 API 的相关参数。其中,我们需要提供应用 ID(`appId`)、商户号(`merchantId`)、微信支付 API 证书的序列号(`privateKeySerialNumber`)以及证书的路径(`privateKeyPath`)。您需要将这些参数替换为您自己的值。 然后,我们使用 `WxPayApiV3` 实例来解析异步通知数据,并验证签名。如果签名验证成功,则表示支付成功,可以进行相应的处理逻辑,并返回成功响应给微信服务器。如果签名验证失败,则返回失败响应给微信服务器。 注意,以上示例代码仅供参考,具体的实现可能因应用的需求而有所不同。您需要根据实际情况进行修改和完善。另外,在真实的项目中,确保您已正确配置和保护微信支付 API 证书的私钥。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值