在Android内嵌H5的页面中,如何使用微信、支付宝的原生支付功能,这类支付的核心是通过URL Scheme 唤起第三方支付 APP,并在支付完成后处理回调结果。
H5微信支付:
H5页面通过后端获取支付参数,生成支付连接,WebView 拦截该链接后,通过原生代码唤起微信app进行支付而无需引入微信支付sdk。实际操作如下:
WebView通过设置setWebViewClient()方法,在shouldOverrideUrlLoading(WebView view, WebResourceRequest request)中设置微信支付链接的拦截,通过拦截request.getUrl()每次加载的链接判断是否是“weixin://wap/pay?”协议,如果是则跳转微信app,具体实现如下:
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
if (url.startsWith("weixin://wap/pay?")) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
}
这样就可以跳起微信app支付,支付成功或者支付取消后回到当前页面在次刷新页面状态,H5查询支付状态显示。这样就可以完成H5页面在原生App里面实现支付功能。
微信支付文档: pay.weixin.qq.com/doc/v2/merc…
H5支付宝支付:
H5请求后台获取支付宝的支付链接,然后通过支付宝支付SDK的方法调起支付宝进行支付。支付宝手机网站支付和Native支付获取后台的支付链接是一样的,如果没有接入支付宝sdk则会直接走网页支付,只有接入了支付宝sdk才会调起支付宝app进行支付。具体实现如下:
先导入支付宝sdk
api 'com.alipay.sdk:alipaysdk-android:+@aar',
使用APP 支付最新版本 15.4.0 新增拦截+支付二合一接口(payInterceptorWithUrl),该接口将原来的获取 H5 支付订单信息接口和支付接口进行了合并。该接口首先是个拦截器,拦截支付宝 H5 支付 URL;其次是个支付方式转化器,将手机网站支付方式转化为APP支付方式。示例代码:
/**
* 支付宝H5支付URL拦截器,完成拦截及支付方式转化
*
* @param h5PayUrl 待过滤拦截的 URL
* @param isShowPayLoading 是否出现loading
* @param callback 异步回调接口
*
* @return true:表示URL为支付宝支付URL,URL已经被拦截并支付转化;false:表示URL非支付宝支付URL;
*
*/
public synchronized boolean payInterceptorWithUrl(final String h5PayUrl, final boolean isShowPayLoading, final H5PayCallback callback)
在WebView的shouldOverrideUrlLoading这个方法中一直拦截请求payInterceptorWithUrl,当返回true时证明调用支付宝App成功,支付结束后 SDK 将回调 H5PayCallback,并将支付结果 H5PayResultModel 作为参数传入该 Callback。H5PayResultModel 中主要包含两个字段,resultCode返回码,标识支付状态,含义如下:
9000——订单支付成功
8000——正在处理中
4000——订单支付失败
5000——重复请求
6001——用户中途取消
6002——网络连接出错
和returnUrl支付结束后应当跳转的 URL 地址,当拿到这个,我们可以通过WebView跳转到指定商品支付后的链接。这样就完成了在app中的H5调用原生支付宝app支付。
支付宝支付文档: opendocs.alipay.com/mini/00dn79…
总结:原生app中H5要调起微信支付的关键在于,H5要接入微信H5支付,而不是JSAPI支付,微信可以不用接入微信支付sdk,通过微信weixin://wap/pay?协议就可以唤醒微信app。而支付宝支付需要在app中集成支付宝sdk,调用sdk中的方法来启动支付宝,并且H5要接入支付宝的手机网站支付功能。