前言:之前都是做的原生支付,最近有接入h5支付的需求,没办法,既然有这个需求那就研究一波呗。
文档介绍:
1、支付宝H5支付:https://docs.open.alipay.com/399/106844/
文件下载好后解压 然后找到 H5PayDemoActivity.java这个类里面就是支付宝的H5支付。
下面贴出,WebViewClient 主要核心代码。
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(final WebView view, String url) {
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
}
/**
* 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
*/
final PayTask task = new PayTask(H5PayDemoActivity.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)){
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.loadUrl(url);
}
});
}
}
});
/**
* 判断是否成功拦截
* 若成功拦截,则无需继续加载该URL;否则继续加载
*/
if(!isIntercepted)
view.loadUrl(url);
return true;
}
}
到此支付宝H5支付算基本完成了,具体需要可以参考支付宝的demo。
2、微信H5支付:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1
微信H5支付需要申请授权的,不过一般很小公司很难申请下来,建议还是改用原生支付。
下面贴出,WebViewClient 主要核心代码。
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<>();
extraHeaders.put("Referer", "商户申请H5时提交的授权域名");
view.loadUrl(url, extraHeaders);
return true;
}
如果没有设置下面的Referer 会报“商家参数格式有误”的
到此微信H5支付算基本完成了。
集成支付宝H5和微信H5支付时遇到的坑:
1、调用微信H5支付,出现白屏。
我是先做的支付宝的H5支付,配置好WebViewClient 主要核心代码,一次就测试成功了,但是在调微信H5支付的时候,出现白屏的情况,这个很让我头疼,后来我单独把微信H5支付切出,程序竟然能调起来,那么问题来了,说明支付宝的程序对微信的有影响,然后就重新看支付宝官方提供的代码,发现了问题所在,见下图:
支付宝官方提供的demo里竟然拦截了除“http”和“https”以外的其他链接。( 不知道是不是故意的 ( ̄3 ̄)a )
处理办法:
if (!(url.startsWith("http") || url.startsWith("https"))) {
if (!url.startsWith("weixin://wap/pay?")) {
return true;
}
}
2、调用微信H5支付,支付成功后或取消支付的时候出现白屏。
可以通过一种模拟返回的操作来实现:就是执行webview的goBack方法
到此,支付宝H5支付和微信H5支付都成功了,再此记录一下,防止以后再次接入掉坑里去了。