最近我其中一個項目需要接入微信支付,實現(xiàn)方式是在WebView里利用Url拉起微信支付頁面,但是實際操作的時候卻發(fā)現(xiàn)始終無法拉起支付頁面,最后排查了一段時間,發(fā)現(xiàn)原來是因為一個很簡單的問題出錯了,于是解決問題以后特意想把這個問題記錄下來分享,也便于以后自己解決同類問題。
在這里插入圖片描述
代碼如上,每次微信支付走到https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=************,這個開頭的url時,就停住了,根本不會跳到weixin://wap/pay?開頭的url中,然后再調用startActivity打開微信客戶端支付。當時我百思不得其解,到底那里出錯了呢,為什么吊不起微信支付,后來我看了一下自己之前的項目,發(fā)現(xiàn)我原先的項目是這樣的:
在這里插入圖片描述
可以看到,這里return 返回的是false,問題出在這里。這時我又在想,為什么會這樣?
查閱資料以后我發(fā)現(xiàn)shouldOverrideUrlLoading的返回值的意義為:
- 若設置 WebViewClient 且該方法返回 true ,則說明由應用的代碼處理該 url,WebView 不處理,也就是程序員自己做處理。
- 若設置 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url,即用 WebView 加載該 url。
- 若沒有設置 WebViewClient 則由系統(tǒng)(Activity Manager)處理該 url,通常是使用瀏覽器打開或彈出瀏覽器選擇對話框。
那么這種情況下,返回值應該改為 false或者super .shouldOverrideUrlLoading(view, url); ,因為微信支付調用https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb這個開頭的url后,會重定向到weixin://wap/pay開頭的url,然后調用微信客戶端支付,如果用true,則WebView不會自動重定向到weixin://wap/pay開頭的url,需要程序員自行處理,這種情況下自然是無法吊起支付的。