Android使用微信H5支付

有一種奇特的需求叫做,在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) {
                // 如下方案可在非微信內部WebViewH5頁面中調出微信支付
                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方法沒有被調用

============================================

附上微信的官方文檔地址,一些錯誤可以在這裏面找到原因 點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章