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() {
@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 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 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();
}
});
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() {
@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) {