一、背景介绍:
业务需求需要,故加入支付宝支付功能。
二、如何实现。
1、关于APP调用支付宝支付的大致流程:
商家APP调用支付宝提供的SDK,SDK再调用支付宝APP内的支付模块。如果用户已经安装支付宝APP,商家APP会跳转到支付宝中完成支付,支付完后跳回到商家APP内,最后展示支付结果。如果用户没有安装支付宝APP,商家APP会调起支付宝网页支付收银台,用户登录支付宝账户,支付完后展示支付结果。
2、关于商家APP、商家后台、支付宝APP、支付宝支付后台四者的关系:
3、完整的系统交互流程:
4、实现细节。
(1)在蚂蚁金服开放平台创建应用,获取应用唯一标识(APPID)。
(2)集成支付宝Android SDK。导入alipaySdk-20180601.jar,Gradle添加依赖。
(3)在AndroidManifest.xml中声明权限:
android.permission.INTERNET android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE android.permission.READ_PHONE_STATE
android.permission.WRITE_EXTERNAL_STORAGE
(4)Java后端集成支付宝服务端SDK。
(5)APP端调用支付接口。
注意:调用支付接口必须在工作线程中。
这里主要用到了PayTask类。PayTask类主要为商户提供订单支付、查询功能及获取当前开发包版本号。
核心代码如下:
final String orderInfo = (String) msg.obj; //订单信息
Runnable payRunnable = new Runnable() {
@Override
public void run() {
//PayTask对象主要为商户提供订单支付、查询功能,及获取当前开发包版本号。
PayTask alipay = new PayTask(OrderManagementActivity.this);
//var1:app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。从服务端获取。
//var2:用户在商户app内部点击付款,是否需要一个loading做为在钱包唤起之前的过渡,这个值设置为true,将会在调用pay接口的时候直接唤起一个loading,直到唤起H5支付页面或者唤起外部的钱包付款页面loading才消失。
//(建议将该值设置为true,优化点击付款到支付唤起支付页面的过渡过程。)
Map<String, String> result = alipay.payV2(orderInfo, true);
Message msg = Message.obtain();
msg.what = ALIPAYSDK_PAY_FLAG;
msg.obj = result;
alipayHandler.sendMessage(msg);
}
};
Thread payThread = new Thread(payRunnable);
payThread.start();
支付结果的获取:支付宝SDK对商户的请求支付数据处理完成后,会将结果同步返回给商户APP端。
这里需要注意:支付结果有同步通知和异步通知。有些时候会出现商户APP在支付宝付款阶段被关闭导致无法正确收到同步结果,此时支付结果可以完全依赖服务端的异步通知。
由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。商户可以将同步结果仅仅作为一个支付结束的通知,实际支付是否成功,完全依赖服务端的异步通知。
(6)沙箱联调。
沙箱环境是蚂蚁金服开放平台提供给开发者调试接口的环境。因为需要在签约、上线后,才能在生产环境中调用接口,所以我们可以先在沙箱环境中进行调试。
注意:使用沙箱环境,必须在支付接口调用前,调用如下方法:
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
并且,在生产环境必须将如上代码注释。
如果不使用以上方法,默认使用生产环境。
在沙箱环境中联调,可以先在蚂蚁金服开放平台下载沙箱版支付宝APP。
使用沙箱联调还需要先去蚂蚁金服开放平台沙箱环境中获取沙箱环境对应的APPID、支付宝网关、应用公钥、支付宝公钥,并且使用这些参数在我们集成了支付宝服务端SDK的Java后端进行配置。
(7)使用支付宝提供的RSA签名验签工具生成生产环境中所需的应用公钥、应用私钥,并上传蚂蚁金服开放平台,得到支付宝公钥。
(8)将我们集成了支付宝服务端SDK的Java后端中的APPID、应用公钥、应用私钥、支付宝公钥、支付宝网关都改成生产环境中的。
(9)签约、上线。
(10)在生产环境中调试。
在生产环境中调试完毕,没有问题,整个功能完成。