Android H5調起原生微信或支付寶支付


Android H5調起原生微信或支付寶支付

WebView調用原生微信或支付寶回調:其原理就是在shouldOverrideUrlLoading(final WebView view, String url)方法中進行攔截處理。

由於支付寶的取消支付之后跳轉的頁面顯示不太友好,所以集成支付寶SDK-手機網站支付轉APP支付,說明文檔參照https://docs.open.alipay.com/204/105695/。按照說明集成aliPaySdk。

初始化WebView:

private void initWebView(){
    WebViewUtil.webSettingsApply(mWebView.getSettings());
    mWebView.setWebViewClient(new MyWebViewClient());
    mWebView.setWebChromeClient(new WebChromeClient(){
        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            if(!TextUtils.isEmpty(title) && mTitle != null) {
                mTitle.setText(title);
            }
        }
    });
    mWebView.loadUrl(mUrl);
}

覆寫url加載:

 private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(final WebView view, String url) {
        // 微信支付處理
        if (url.startsWith("weixin://wap/pay?")){
            try {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setData(Uri.parse(url));
                H5PayActivity.this.startActivity(intent);
                return true;
            }catch (Exception e){ //異常處理
                view.goBack(); // 因為會出現有一個weixin空白頁面;根據需求自己處理
                UIUtil.showToastShort("系統檢測未安裝微信,請先安裝微信或者用支付寶支付");
                return true;
            }
        }

        // 支付寶支付處理
        final PayTask task = new PayTask(H5PayActivity.this); //支持原生APP調用
        //webView處理必須在同一個線程上
        boolean isIntercepted = task.payInterceptorWithUrl(url, truenew H5PayCallback() {
            @Override
            public void onPayResult(final H5PayResultModel result) {
                // 支付結果返回
                final String url = result.getReturnUrl();
                if (!TextUtils.isEmpty(url)) {
                    H5PayActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            view.loadUrl(url);
                        }
                    });
                }
                // 5000支付失敗 6001重復請求 6002中途取消
                if ("5000".equals(result.getResultCode()) || "6001".equals(result.getResultCode()) ||
                        "6002".equals(result.getResultCode())){
                    Logg.e("errorCode", result.getResultCode());
                    H5PayActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            view.goBack();
                        }
                    });
                }
            }
        });


        /**
         * 判斷是否成功攔截
         * 若成功攔截,則無需繼續加載該URL;否則繼續加載
         */

        if (!isIntercepted) {
            if (!(url.startsWith("http") || url.startsWith("https")) || StringUtil.isEmpty(url)) {
                return true;
            }
            view.loadUrl(url);
        }
        return true;
    }
}

通用的WebView設置

public final class WebViewUtil {

    /**
     * 應用WebView的設置
     * <ul>
     * <li>webSettings.setDomStorageEnabled(true);//設置DOM Storage緩存</li>
     * <li>webSettings.setDatabaseEnabled(true);//設置可使用數據庫</li>
     * <li>webSettings.setJavaScriptEnabled(true);//支持js腳本</li>
     * <li>webSettings.setUseWideViewPort(true);//將圖片調整到適合webview的大小</li>
     * <li>webSettings.setSupportZoom(false);//支持縮放</li>
     * <li>webSettings.setBuiltInZoomControls(false);//支持縮放</li>
     * <li>webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持內容從新布局</li>
     * <li>webSettings.setSupportMultipleWindows(false);//多窗口</li>
     * <li>webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//關閉webview中緩存</li>
     * <li>webSettings.setAllowFileAccess(true);//設置可以訪問文件</li>
     * <li>webSettings.setNeedInitialFocus(true);//當webview調用requestFocus時為webview設置節點</li>
     * <li>webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口</li>
     * <li>webSettings.setLoadsImagesAutomatically(true);//支持自動加載圖片</li>
     * <li>webSettings.setGeolocationEnabled(true);//啟用地理定位</li>
     * <li>webSettings.setAllowFileAccessFromFileURLs(true);//使用允許訪問文件的urls</li>
     * <li>webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允許訪問文件的urls</li>
     * </ul>
     */

    @SuppressLint("SetJavaScriptEnabled")
    public static void webSettingsApply(WebSettings webSettings) {
        webSettings.setDomStorageEnabled(true);//設置DOM Storage緩存
        webSettings.setDatabaseEnabled(true);//設置可使用數據庫
        webSettings.setJavaScriptEnabled(true);//支持js腳本
        webSettings.setUseWideViewPort(true);//將圖片調整到適合webview的大小
        webSettings.setSupportZoom(false);//支持縮放
        webSettings.setBuiltInZoomControls(false);//支持縮放
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//支持內容從新布局
        webSettings.setSupportMultipleWindows(false);//多窗口
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);//關閉webview中緩存
        webSettings.setAllowFileAccess(true);//設置可以訪問文件
        webSettings.setNeedInitialFocus(true);//當webview調用requestFocus時為webview設置節點
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);//支持通過JS打開新窗口
        webSettings.setLoadsImagesAutomatically(true);//支持自動加載圖片N
        webSettings.setGeolocationEnabled(true);//啟用地理定位

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            webSettings.setAllowFileAccessFromFileURLs(true);//使用允許訪問文件的urls
            webSettings.setAllowUniversalAccessFromFileURLs(true);//使用允許訪問文件的urls
        }

        if(Build.VERSION.SDK_INT >= 19) {
            if(Configs.DEBUG){
                WebView.setWebContentsDebuggingEnabled(true);
            }
        }
        // webSettings.setRenderPriority(WebSettings.RenderPriority.NORMAL);//設置渲染優先級 will be Deprecated
    }

    /**
     * webView 銷毀webView避免內存泄漏
     */

    public static  void destory(WebView webView){
        if(webView != null){
            webView.stopLoading();
            webView.getSettings().setJavaScriptEnabled(false);
            webView.clearHistory();
            webView.removeAllViews();
            webView.destroy();
        }
    }
}


免責聲明!

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



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