Android H5微信、支付宝支付调起原生支付

514 阅读3分钟

在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要接入支付宝的手机网站支付功能。