有一種奇特的需求叫做,在app上使用h5支付。這個實際上是有優勢的,比如有多個app要做微信支付,只要h5做一套就可以全部通用。網上搜了一圈,講的有很多,但是都不太細緻,有些坑沒有說。下面是我的實現:
public class WebViewTestActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view_test); WebView webView = ((WebView) findViewById(R.id.webviewtest)); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); settings.setDefaultTextEncodingName("UTF-8"); webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webView.setWebChromeClient(new WebChromeClient()); WebViewClient webViewClient = new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 如下方案可在非微信內部WebView的H5頁面中調出微信支付 if (url.startsWith("weixin://wap/pay?")) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); startActivity(intent); return true; } else { Map<String, String> extraHeaders = new HashMap<String, String>(); extraHeaders.put("Referer", "http://wxpay.wxutil.com"); view.loadUrl(url, extraHeaders); } return true; } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重寫此方法可以讓webview處理https請求 handler.proceed(); } }; webView.setWebViewClient(webViewClient); webView.loadUrl("http://wxpay.wxutil.com/mch/pay/h5.v2.php"); } }
出現的錯誤無外乎就是微信官網列出的那幾種,可以看這個鏈接 https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4 。比如我在原生系統上最開始報的錯誤就是:商家參數格式有誤,請聯繫商家解決,這個實際上官方給出瞭解決方案:
2. 如果是APP裏調起H5支付,需要在webview中手動設置referer,如
(Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商戶申請H5時提交的授權域名");//例如 http://www.baidu.com ))
當時就不太理解這個玩意應該加在哪兒。後來試過幾次以後才明白這個是給webview用的。知識點沒有什麼,就是寫出來做個備忘,萬一哪天用到了不用再去翻別人的坑了。h5支付的審覈還是比較嚴格的,以前只有京東什麼的合作伙伴才能拿到資格,今年開始放開一點了,但是小公司估計也申請不下來。
有問題或者交流可以加羣 697552626
============================================
有同學反饋問題說是按照這個demo寫的,但是還是報 商家參數格式錯誤,我看了下他的代碼,在WebViewClient中覆寫了這個方法
[code=java]
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.loadUrl(url);
super.onPageStarted(view, url, favicon);
}
[/code]
把這段去掉就正常了。原因大概是onpagestart方法是最開始調用的,導致shouldoverride方法沒有被調用
============================================
附上微信的官方文檔地址,一些錯誤可以在這裏面找到原因 點擊打開鏈接