支付宝为第三方APP的支付集成提供了嵌入式的集成渠道接口,因此总体来说我们可以借助支付宝的接入规则文件和支付宝集成接入包的导入、修改完成我们对支付宝支付渠道接口的集成。
支付宝支付渠道接口分两个模块:第一个为Alipay负责后动与返回结果,第二个部分AlipayAction,为支付宝支付渠道接口的整体设计,也就是我们集成接入的部分,此处分为三部分,即接入、支付与返回。
本文并不涉及支付服务器,因此本接口设计只讨论设计流程图中如何发送关键参数以及接收与处理同步返回的结果。
1、AliPay 模块
支付宝支付渠道接口的整体设计模块主要功能函数,payRequest()和JPayManager getJPayManager()
.payRequest()
//将商户信息传迸给AlipayAction payAction,启动AlipayAction
AlipayAction payAction = new AlipayAction( this,cpInfo );
payAction.pay();
.JPayManager getJPayManager()
//返回最终支付结果
return mManager.
2、AlipayAction 模块
AlipayAction模块是支付宝集成接入的模块,在借助其帮助的同时,我们需要对它进行一定的修改,使其能够匹配我们集成支付平台的需要。在接支付结果入部分Pay()和PayCallBack()是我们后期增加,为了向集成平台服务器请求、获取key信息的功能;在返回部分也需要增加将支付结果通知集成平台的功能,对RQF_PAY()进行少许修改。
1.接入部分
接入部分需要获取调用支付宝接口时根据业务规则需要传递的请求参数,如表1支付请求接口参数列表所示,调用接口开始支付。
表1 支付请求接口参数列表
首先通过Pay()向集成支付平台的支付服务器获取事先己经申请后的key信息。表2为获取关键参数请求列表。
表2 获取关键参数请求列表
主要功能代码如下:
//将集成平台支付服务器需要验证的信息加密
long time = System.currentTimeMi11is();
String sign = "" + JPayManager.ALIPAY + JPayManager.FLAG + time;
sign = SignUtil.getMD5(sign);
//传递验证信息请求支付服务器数据
payReq.keyInfoRequest(JPayManager.ALIPAY,JPayManager.FLAG,String.valueOf(time),mCPInfo.getOrderId(),sign,mPayCallBack).
通过PayCallBack()向集成平台获取己存储在集成平台服务器端的Partner、Seller、RsaPrivate、RsaAlipayPublic、ftotifyUrl,首先判断平台服务器是否回应,如有则获取相关参数,再判断Partner、Seller、RsaPrivate、RsaAlipayPublic、NotifyUrl如果有一个为空则失败,直接返回A1ipay模块,如果成功则将获取的信息mhandler返回给下一支付进程,在支付服务器数据的交互时,使用Json数据格式。表3为从支付服务器返回的参数列表。
表3 支付服务器返回的参数列表
主要功能代码如下:
private PayCallBack mPayCallBack = new PayCallBack()
//判断平台服务器是否回应,在有服务器沟通成功的前提下获取Partner、Seller、Rsa_Private、Rsa_alipay_public、Notify_Url相关参数
jo = new JSONObject (response);
if (jo != null) {
jo = new JSONObject(message);
mPartner = jo.getString("partner");
mSeller = jo.getString("seller");
mRsaPrivate = jo.getString("rsa_privateW);
raRsaAlipayPublic = jo.getString("rsa_alipay_public");
mNotifyUrl = jo.getString("notify_url");
//判断Partner、Seller、RsaPrivate、RsaAlipayPublic、NotifyUrl如果有一个为空则失败,直接返回A1iPay模块
Check message();
//如果成功返回给下一支付进程PAY_TO_ALIPAY
mHandler.sendEmptyMessage (PAY_TO_ALIPAY).
PAY_TO_ALIPAY()将各方获取的信息以支付宝支付接口文档的请求参数标准进行整合,并开始支付。
//按照文档标准获取支付参数
String orderInfo = getOrderInfo();
//获取签名的类型
String signType = getSignType();
//根据签名的方式为订单信息进行签名
String strsign = sign(signType,orderInfo);
//对签名进行编码
strsign = URLEncoder,encode(strsign);
//将参数组装好
final String Info = orderInfo + "&sign=" + """+ strsign + """ + "&" + getSignType().
2.支付部分
首先实例化一个Thread()来支付、接收支付宝服务器同步返回的通知结果。
new Thread(){
public void run(){
//从支付宝接口获取同步返回的支付结果,返回值为msg,提供给RQF_PAY完成解析和检验。
AliPay alipay = new AliPay(mActivity,mHandler);
String result = alipay.pay(orderInfo);
Log.i (TAG,"result = " + result);
Message msg = new Message();
msg.what = RQF_PAY;
msg.obj = result;
mHandler.sendMessage(msg);}
}.start().
3.返回部分
返回部分需要将同步返回的通知结果解析,判断是否是真实的结果,并通知集成支付平台的支付管理模块。当获得到通知返回时的待签名字符串后,把待签名字符串、支付宝提供的公钥、支付宝通知返回参数中的参数sign的值三者一同放入RSA的签名函数中进行非对称的签名运算,来判断签名是否验证通过。
因为本文不涉及集成支付平台的支付服务器设计,所以支付宝服务器异步返回的通知不加讨论。表4是支付宝接口返回字段说明列表。
表4 支付宝接口返回字段说明列表
RQF_PAY()首先将msg中的result解析,用支付宝提供的公钥进行解析,如果匹配再与集成平台服务器获得的异步返回通知结果进行比对,确保结果正确,并将最终的结果payState返回给集成支付平台的支付管理模块JPayManager。核心代码如下:
//解析new Thread()传递回来的result
String memo = "memo=";
int imemoStart = strRet.indexOf("memo=");
imemoStart += memo,length();
int iraemoEnd = strRet.indexOf(";result=");
memo = strRet.substring(imemoStart,imeraoEnd);
//用先前在PayCallBack()里获取的支付宝公钥进行解析,判断sign、signtype是否匹配
ResultChecker resultChecker = new ResultChecker(strRet,mRsaAlipayPublic);
checksign();
//获取返回字符串中的支付结果状态
String resultStatus = resultChecker.getResultStatus();
//如果匹配再与集成平台服务器获得的异步返回通知结果进行比对,确保结果正确,并将最终的结果WPayStateCode返回给集成支付平台的支付管理模块JPayManager
CheckOrder.recheckOrderWithServer (CPInfo,PayStateCode);
Alipay.getJPayManager().PayCallBack PayStateCode,JPayManager.ALIPAY).