非内置浏览器WebView 调起H5支付,提示商家参数格式有误

微信H5 支付开发官方文档参考资料: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 

 

0. 场景描述:在APP 中使用webView 显示第三方H5, H5中涉及到微信支付流程,无法正常支付,提示 “商家参数格式有误,请联系商家解决”。

 

1. 线索分析:参照微信H5 支付开发官方文档,提及 “如果是APP里调起H5支付,需要在webview中手动设置referer”,具体内容如下,或者参考官方文档:PS@官方文档 -- 致谢

1. 1 解决策略:按照官方文档描述,添加referer 之后,发现仍然提示此错误:

1         Map<String,String> extraHeaders = new HashMap<String, String>();
2         extraHeaders.put("Referer", "");
3         mWebView.loadUrl(mUrl, extraHeaders);
1.1 尝试代码

 

2. 线索分析:经过询问H5 前端技术人员,反馈referer 需要实时设置更新, 每个页面都要获取上一个界面的referer,然后传递给下一个页面,而不是一层不变。PS@H5前端技术 -- 致谢

2.1 解决策略:通过线索分析,得知两个重要线索 ->

  Num 1:referer 需要实时设置更新 -> 需要在WebViewClient -> shouldOverrideUrlLoading() 中实时设置referer, 而不是只在最外层设置referer;

  Num 2:每个页面都要获取上一个界面的referer,然后传递给下一个页面 -> 获取上一个界面referer并传递给下一个页面;

2.2 碰到的小问题*#110*#  :WebView 中并没有获取referer 的相关方法,referer 是个什么鬼东东,一脸茫然??????????

  猜测:根据单词意思,是否是指上一个界面的网址,即页面来源?

  尝试:将授权域名作为初始referer ,然后每次保存上一个页面的url 作为下一个页面的referer 

  

 1 mWebView.setWebViewClient(new WebViewClient() {
 2             String referer = "商户申请H5时提交的授权域名";
 3 
 4             //覆盖shouldOverrideUrlLoading 方法
 5             @Override
 6             public boolean shouldOverrideUrlLoading(WebView view, String url) {
 7                 Map<String,String> extraHeaders = new HashMap<String, String>();
 8                 extraHeaders.put("Referer", referer);
 9                 view.loadUrl(url, extraHeaders);
10                 referer = url;
11                 return true;//不调用系统的浏览器打开网页
12             }
13         });
最终代码

 

3. 运行代码-》调试-》问题解决。

 

 

我们不生产代码, 我们只做大自然的搬运工,转载请说明源地址:http://www.cnblogs.com/lizhilin2016/p/9001452.html

附录:

 1 mWebView.setWebViewClient(new WebViewClient() {
 2             String referer = "商户申请H5时提交的授权域名";
 3 
 4             //覆盖shouldOverrideUrlLoading 方法
 5             @Override
 6             public boolean shouldOverrideUrlLoading(WebView view, String url) {
 7                 LogUtils.e(TAG, "url = " + url);
 8                 if (!url.startsWith("http")) {
 9                     if (url.startsWith("协议") && !hasInstalledApp) { // 特殊app,根据协议判断客户端是否存在
10                         return true;
11                     }
12                     try {
13                         Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
14                         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
15                         startActivity(intent);
16                         if (url.startsWith("协议")){ // 根据实际逻辑,外呼app成功之后,看是否需要关闭界面
17                             finish();
18                         }
19                         return true;
20                     } catch (Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
21                         return false;
22                     }
23                 }
24                 Map<String,String> extraHeaders = new HashMap<String, String>();
25                 extraHeaders.put("Referer", referer);
26                 view.loadUrl(url, extraHeaders);
27                 referer = url;
28                 return true;//不调用系统的浏览器打开网页
29             }
30         });
31         mWebView.setWebChromeClient(new WebChromeClient());
32         mWebView.loadUrl(mUrl);
33     }
34 
35 扩展版代码
36 
37  扩展版代码
扩展版代码

 

转载于:https://www.cnblogs.com/lizhilin2016/p/9001452.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android中,WebView是用于显示网页内容的组件,而且它还具有加载HTML页面的功能。通常情况下,WebView会将网页内容在应用内部显示,但是我们也可以通过设置WebView的方式,使其在外部浏览器中打开网页。 要在外部浏览器中打开网页,我们可以通过重写WebViewWebViewClient类中的shouldOverrideUrlLoading方法来实现。该方法会在WebView加载URL之前被调用,并返回一个boolean值,该值表示是否由WebView处理URL。 代码示例如下: webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 使用外部浏览器打开网页 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); return true; // 返回true表示由外部浏览器处理URL } }); 在上述代码中,我们首先创建了一个WebViewClient对象,并重写了其中的shouldOverrideUrlLoading方法。在该方法中,我们创建了一个Intent对象,使用ACTION_VIEW action,将URL转换为Uri,并通过该Intent启动外部浏览器来打开网页。然后我们返回true,表示由外部浏览器处理URL。 最后,我们将创建的WebViewClient对象设置给WebView,这样在加载网页时,WebView会先调用shouldOverrideUrlLoading方法来判断是否在外部浏览器中打开。若返回true,则会在外部浏览器中打开网页;若返回false,则会在WebView中显示网页内容。 通过上述方法,我们可以实现在Android中使用WebView加载H5页面时,使用外部浏览器打开网页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值