最近在对接微信H5支付时,通过返回的mweb_url字段链接进行支付时,一直提示“商家参数格式有误,请联系商家解决”,找了些相关文档,一直没解决,直到看到了官方文档的开发指引才发现其中猫腻,通过文档说明:
看说明有以下两种情况会导致该错误:
- 当前调起H5支付的referer为空导致,一般是因为直接访问页面调起H5支付,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空
- 如果是APP里调起H5支付,需要在webview中手动设置referer,如(
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 www.baidu.com )
因为我是直接拿到链接后复制到手机浏览器唤起,所以按照文档应该是Referer为空导致的,后面加上就好了。
那么我们通过cURL 发起一个 HTTP 请求,设置请求的头部信息、超时时间、User-Agen,并获取服务器返回的响应内容,最后将响应内容作为函数的返回值。主要是服务器端模拟客户端行为向其他服务发起 HTTP请求。PHP代码实现如下:
/**
* @param $url
* @param $referer
* @return string|null
*/
public function getUrl($url, $referer): ?string
{
$headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg,text/html,application/xhtml+xml';
$headers[] = 'Connection: Keep-Alive';
$headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';
$useragent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36)';
$process = curl_init($url);
curl_setopt($process, CURLOPT_HTTPHEADER, $headers);
curl_setopt($process, CURLOPT_HEADER, 0);
curl_setopt($process, CURLOPT_USERAGENT, $useragent);
curl_setopt($process, CURLOPT_REFERER, $referer);
curl_setopt($process, CURLOPT_TIMEOUT, 30);
curl_setopt($process, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1);
$return = curl_exec($process);
curl_close($process);
return $return;
}
拿到支付链接后通过getUrl方法实现附带Referer,直接重定向打开即可支付,该情况适用于无法在商户平台->产品中心->开发配置添加或修改授权域名时,直接填写已配置的域名。