微信支付宝H5支付二合一

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

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

@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);if (Build.VERSION.SDK_INT >= 19) {webView.evaluateJavascript(getJSStr(), new ValueCallback() {@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并跳转
@Overridepublic 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() {@Overridepublic void onPayResult(final H5PayResultModel result) {// 支付结果返回final String url = result.getReturnUrl();if (!TextUtils.isEmpty(url)) {RechargeH5Activity.this.runOnUiThread(new Runnable() {@Overridepublic void run() {view.loadUrl(url);}});}}});/*** 判断是否成功拦截* 若成功拦截,则无需继续加载该URL;否则继续加载*/if (!isIntercepted) {view.loadUrl(url);}return true;} else{//H5微信支付要用,不然说"商家参数格式有误"final Map headerMap = new HashMap<>();//初始化urlString urlPath = initWebUrl();headerMap.put("Referer",urlPath);view.loadUrl(url,headerMap);}return super.shouldOverrideUrlLoading(view,url);}@Overridepublic 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;}@Overridepublic void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {sslErrorHandler.proceed();}@Overridepublic 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);}}@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);if (Build.VERSION.SDK_INT >= 19) {webView.evaluateJavascript(getJSStr(), new ValueCallback() {@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;}@Overridepublic 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);}}@Overridepublic void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {super.onReceivedError(view, errorCode, description, failingUrl);}
}
  • 继承使用
        mWebView.setWebViewClient(new BridgePayWebViewClient(mWebView,RechargeH5Activity.this) {


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部