非內置瀏覽器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  擴展版代碼
擴展版代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM