微信支付宝H5支付二合一

1:支付宝根据官方文档导入最新jar包、mainXml文件中加入支付宝的Activity、混淆文件等等按照官方配置配置即可。

2:注意点(坑)
(1):如果 WebView需要支持JS之间交互,请把JS代码放在以下代码中,不然会存在调不起来支付三方的H5页面

@Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);

        if (Build.VERSION.SDK_INT >= 19) {
            webView.evaluateJavascript(getJSStr(), new ValueCallback<String>() {
                @Override public void onReceiveValue(String value) {//js与native交互的回调函数
                }
            });
        }
    }

    /**
     * 加载JS字符串
     * @return
     */
    private String getJSStr(){
        String jsStr = "";
        try {
            InputStream in = mContext.getAssets().open(BridgeWebView.toLoadJs);
            byte buff[] = new byte[1024];
            ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
            do {
                int numRead = in.read(buff);
                if (numRead <= 0) {
                    break;
                }
                fromFile.write(buff, 0, numRead);
            } while (true);
            jsStr = fromFile.toString();
            in.close();
            fromFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return jsStr;
    }
  • 拦截支付宝、微信等Url并跳转
@Override
            public boolean shouldOverrideUrlLoading(final WebView view, String url) {
                if (url.startsWith("weixin://wap/pay?")) {

                    try {
                        //如果return false  就会先提示找不到页面,然后跳转微信
                        Intent intent = new Intent();
                        intent.setAction(Intent.ACTION_VIEW);
                        intent.setData(Uri.parse(url));
                        startActivity(intent);
                        return true;

                    }catch (Exception e){

                    }

                }else if (url.contains("alipay")){
                    if (!(url.startsWith("http") || url.startsWith("https"))) {
                        return true;
                    }

                    /**
                     * 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
                     */
                    final PayTask task = new PayTask(RechargeH5Activity.this);
                    boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
                        @Override
                        public void onPayResult(final H5PayResultModel result) {
                            // 支付结果返回
                            final String url = result.getReturnUrl();
                            if (!TextUtils.isEmpty(url)) {
                                RechargeH5Activity.this.runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        view.loadUrl(url);
                                    }
                                });
                            }
                        }
                    });

                    /**
                     * 判断是否成功拦截
                     * 若成功拦截,则无需继续加载该URL;否则继续加载
                     */
                    if (!isIntercepted) {
                        view.loadUrl(url);
                    }
                    return true;
                } else{

                    //H5微信支付要用,不然说"商家参数格式有误"
                    final Map<String, String> headerMap = new HashMap<>();
                    //初始化url
                    String urlPath = initWebUrl();
                    headerMap.put("Referer",urlPath);
                    view.loadUrl(url,headerMap);
                }
                return super.shouldOverrideUrlLoading(view,url);
            }

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                //此方法是为了处理在5.0以上Htts的问题,必须加上
                handler.proceed();
            }
        });
  • 注意重写Client,对Url进行编码
package com.vpgame.eric.ui.wigdets.jsbridge;

import android.content.Context;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.webkit.SslErrorHandler;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.vpgame.eric.ui.activity.mine.social.RechargeH5Activity;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;

/**
 * Created by bruce on 10/28/15.
 */
public class BridgePayWebViewClient extends WebViewClient {
    private BridgeWebView webView;

    private Context mContext;

    public BridgePayWebViewClient(BridgeWebView webView, Context context) {
        this.webView = webView;
        this.mContext = context;
    }

    @Override
    public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
        sslErrorHandler.proceed();
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        try {
            url = URLDecoder.decode(url, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) { // 如果是返回数据
            webView.handlerReturnData(url);
            return true;
        } else if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) { //
            webView.flushMessageQueue();
            return true;
        } else {
            return super.shouldOverrideUrlLoading(view, url);
        }

    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);

        if (Build.VERSION.SDK_INT >= 19) {
            webView.evaluateJavascript(getJSStr(), new ValueCallback<String>() {
                @Override public void onReceiveValue(String value) {//js与native交互的回调函数
                }
            });
        }
    }

    /**
     * 加载JS字符串
     * @return
     */
    private String getJSStr(){
        String jsStr = "";
        try {
            InputStream in = mContext.getAssets().open(BridgeWebView.toLoadJs);
            byte buff[] = new byte[1024];
            ByteArrayOutputStream fromFile = new ByteArrayOutputStream();
            do {
                int numRead = in.read(buff);
                if (numRead <= 0) {
                    break;
                }
                fromFile.write(buff, 0, numRead);
            } while (true);
            jsStr = fromFile.toString();
            in.close();
            fromFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return jsStr;
    }


    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);

        if (webView.getStartupMessage() != null) {
            for (Message m : webView.getStartupMessage()) {
                webView.dispatchMessage(m);
            }
            webView.setStartupMessage(null);
        }
    }

    @Override
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        super.onReceivedError(view, errorCode, description, failingUrl);
    }
}
  • 继承使用
        mWebView.setWebViewClient(new BridgePayWebViewClient(mWebView,RechargeH5Activity.this) {

猜你喜欢

转载自blog.csdn.net/JafarOne/article/details/81871622
今日推荐