做微信h5支付的统一下单接口开发,虽然已经生成了mweb_url支付链接,但是访问时出现错误提示:‘商家参数格式有误,请联系商家解决’,但是检查h5支付提交的参数,都没有错误。
而且iOS端调用和Android端一样的,但是iOS运行正常,仔细查看微信支付文档发现:
如果是APP里调起H5支付,需要在webview中手动设置referer,如(
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 http://www.baidu.com ))
这里可能很多android开发会疑虑“商户申请H5时提交的授权域名”,这个通常是申请人申请的,和跳转到本公司的域名通常是同一个,不知道的话就问下申请的同事即可。
本人最终在webview中修改为:
public boolean shouldOverrideUrlLoading(WebView view, String url) {
mWebUrl = url;
Log.i("chen", "shouldOverrideUrlLoading+ url: " + url);
try {
if (url.startsWith("weixin://wap/pay?") // 微信
|| url.startsWith("alipays://") // 支付宝
|| url.startsWith("mailto://") // 邮件
|| url.startsWith("tel:")// 电话
|| url.startsWith("dianping://")// 大众点评
// 其他自定义的scheme
) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
} else if (url.startsWith("https://wx.tenpay.com")) {
//H5微信支付要用,不然说"商家参数格式有误"
Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Referer", "http://www.baidu.com");
view.loadUrl(url, extraHeaders);
return true;
}
} catch (Exception e) { // 防止crash
// (如果手机上没有安装处理某个scheme开头的url的APP,
// 会导致crash)
return true;// 没有安装该app时,返回true,表示拦截自定义链接,但不跳转,避免弹出上面的错误页面
}
view.loadUrl(url);
return true;
}
});
有同学反馈问题说是按照这个demo写的,但是还是报 商家参数格式错误,我看了下他的代码,在WebViewClient中覆写了这个方法
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.loadUrl(url);
super.onPageStarted(view, url, favicon);
}
把这段去掉就正常了。原因大概是onpagestart方法是最开始调用的,导致shouldoverride方法没有被调用。
2019年5月15日,再次接入app调用h5微信支付的方式时,Android7.0以上手机在webview中会调用shouldOverrideUrlLoading,无法在此方法中加
//H5微信支付要用,不然说"商家参数格式有误"
Map<String, String> extraHeaders = new HashMap<String, String>();
extraHeaders.put("Referer", "http://www.baidu.com");
view.loadUrl(url, extraHeaders);
可以采用另一种方法,在loadUrl默认界面的地方进行判断和设置这个extraHeaders。
最后附上微信文档链接:
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4