SDK中提供了若干接口,H5转Native支付只用到其中一部分,本文未提到的接口无需关注。
如何实现H5转Native支付?
步骤一: 在接入方App中拦截H5的URL;
步骤二: 调用SDK提供的“获取订单信息接口(fetchOrderInfoFromH5PayUrl)”对拦截的URL进行处理:
接口原型
1 2 3 4 5 6 | /** * 获取H5native支付的信息 * @param h5PayUrl * @return */ public synchronized String fetchOrderInfoFromH5PayUrl(String h5PayUrl) |
接口功能
从拦截的URL中获取支付请求相关信息,封装成新的订单信息字符串作为返回值。如果该URL不是有效的支付宝支付URL,则返回空字符串。
参数说明
参数名称 | 类型 | 说明 |
---|---|---|
h5PayUrl | String | H5支付的请求URL |
返回值说明
返回值类型 | 说明 |
---|---|
String | 1.如果是有效的支付宝支付URL,则返回非空字符串(订单信息字符串) 2.如果是无效的支付宝支付URL,则返回空字符串 |
调用本接口对拦截的URL进行处理,如果返回值为空字符串则不拦截该URL;如果返回值为非空字符串,则调用SDK提供的支付接口进行支付,使用示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Override public boolean shouldOverrideUrlLoading( final WebView view, String url) { final PayTask task = new PayTask(H5PayDemoActivity. this ); //处理订单信息 final String ex = task.fetchOrderInfoFromH5PayUrl(url); if (!TextUtils.isEmpty(ex)) { //调用支付接口进行支付 } else { view.loadUrl(url); } return true ; } } |
接口原型
1 2 3 4 5 6 7 | /** * H5支付 * @param h5PayInfo 订单信息 * @param isShowPayLoading 是否显示loading图标 * @return */ public synchronized H5PayResultModel h5Pay(String h5PayInfo, boolean isShowPayLoading) |
接口功能
完成订单支付并返回支付结果。
参数说明
参数名称 | 类型 | 说明 |
---|---|---|
h5PayInfo | String | 调用fetchOrderInfoFromH5PayUrl接口返回的订单信息字符串 |
isShowPayLoading | boolean | 是否显示loading界面 |
返回值说明
返回值类型为H5PayResultModel类,包含下述2个成员变量:
参数名称 | 类型 | 说明 |
---|---|---|
resultCode | String | 返回码,标识支付状态,含义如下: 9000——订单支付成功 8000——正在处理中 4000——订单支付失败 5000——重复请求 6001——用户中途取消 6002——网络连接出错 |
returnUrl | String | 支付结束后应当跳转的url地址 |
调用本接口进行支付。如果返回的resultCode为9000,接入方可以提示用户支付成功;返回结果不是9000的情况,无需做任何处理。如果returnUrl不为空,建议接入方跳转到该returnUrl。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public boolean shouldOverrideUrlLoading( final WebView view, String url) { final PayTask task = new PayTask(H5PayDemoActivity. this ); //处理订单信息 final String ex = task.fetchOrderInfoFromH5PayUrl(url); if (!TextUtils.isEmpty(ex)) { //调用支付接口进行支付 new Thread( new Runnable() { public void run() { H5PayResultModel result = task.h5Pay(ex, true ); //处理返回结果 if (!TextUtils.isEmpty(result.getReturnUrl())) { view.loadUrl(result.getReturnUrl()); } } }).start(); } else { view.loadUrl(url); } return true ; } |