财付通与支付宝一样,为第三方APP的支付集成提供了嵌入式的集成渠道接口,因此总体来说我们依然可以借助财付通的接入规则文档和财付通集成接口以及一定的修改完成我们对财付通/微信支付接口的集成。
财付通/微信支付渠道接口分两个模块:第一个为Tenpay负责启动与返回结果,第二个部分TenpayAction,就是我们集成的部分,为财付通/微信支付渠道接口的整体设计。整体设计分为三部分,即接入、支付与返回。
本文并不涉及支付服务器,因此本接口设计只讨论设计流程图中如何发送关键参数以及接收与处理同步返回的结果。
1、Tenpay模块
财付通/微信支付渠道接口的整体设计模块主要功能函数,payRequest()和JPayManager getJPayManager()。
.payRequest()
//将商户信息传递给TenpayAction.payRequest,启动TenpayAction。
TenpayAction payRequest = new TenpayAction(this,cpInfo);
payAction.payRequest();
.JPayManager getJPayManager()
//返回最终支付结果。
Return mManager.
2、TenpayAction模块
TenpayAction模块是使用财付通集成接入的模块,在借助其帮助的同时,我们需要对它进行一定的修改;
使其能够匹配我们第三方集成支付平台的需要,在接支付结果入部分payRequest()、requestPrePayInfo()和PayCallBack()是我们后期增加,为了向集成平台服务器请求、获取财付通/微信支付前获取tokenId信息的功能;在返回部分也需要增加将支付结果通知集成平台的功能,对TenpayHandler()进行了少许修改。
1. 接入部分
接入部分需要获取调用财付通接口时根据业务规则需要传递tokenId的请求参数,表1是财付通/微信支付请求接口参数列表,调用接口开始支付。
表1 财付通/微信支付请求接口参数列表
payRequest()开始请求前往财付通进行支付,首先要获取支付前必要的参数信息。
//获取支付前必要的参数信息。
requestPrePayInfo().
requestPrePayInfo()实现的是在调用财付通/微信支付平台支付前,向财付通平台服务器获取tokenId必要的财付通请求参数。表2为财付通前期支付请求参数表。
表2 财付通前期支付准备请求参数表
主要功能代码如下:
//将发送给集成平台支付服务器的请求参数组装,并使用MD5完成签名
String sign = "" + JPayManager.TENPAY + JPayManager.FLAG + time;
sign = SignUtil.getMD5(sign);
//将请求参数发送给集成平台支付服务器
payReq.keyInfoRequest (JPayManager.TENPAY,JPayManager.FLAG,String.value0f(time),CPInfo.getOrderId(),sign,mCallPayCallBack).
PayCallBack()从集成平台支付服务器获取返回的请求tokenId的关键数,数据从支付服务器数据返回时,使用的是Json数据格式,表3是财付通前期支付请求返回参数表。
表3 财付通前期支付请求返回参数表
主要功能代码如下:
//验证签名
Checksign();
//将返回的Json格式结果进行解析,获取bargainid,key,notiyfyurl
JSONObject jo;
jo = new JSONObject (response);
String message = jo.getString("secret");
jo = new JSONObject (message);
mbargainorid = jo.getString ("bargainor_id");
mKey = jo.getString ("key");
mNotifyUrl = jo.getString ("Notify_Url");
//检查判断返回的是不是有空值
Check message();
//开始进入请求TokenId的步骤
requestTokenId (mCPInfo).
requestTokenId()将支付订单信息完整获取并组装后,使用MD5进行签名发送,向财付通/微信支付平台请求tokenId,请求发送的参数如表4请求tokenId参数orderInfo列表所示。
表4 请求tokenId参数orderInfo列表
核心代码如下:
//按照文档标准获取支付参数
String orderInfo = orderInfo + sign + time;
//向财付通/微信支付平台请求获取tokenId
payReq.tokenIdRequest (orderInfo).
tokenIdRequest()从集成支付平台获取到tokenId。
//验证签名
Checksign();
//获取返回值
Return tokenId.
2. 支付部分
TENPAY_TOKEN_ID_RESPONSE()将tokenId以请求参数的形式发送,调用财付通/微信支付接口开始支付。
//将tokenId传递给财付通/微信支付接口,调用该接口开始支付
TenpayServiceHelper tenpayHelper = new TenpayServiceHelper(mContext);
tenpay.pay (tokenId, mTenpayHandler, MSG_PAY_RESULT).
3. 返回部分
返回部分分为异步通知和同步返回两部分,首先进行的是异步返回,通过notify_url直接与集成支付平台的支付服务器进行互动,同时向财付通/微信支付平台发送结果通知查询请求,但是由于本文不涉及集成平台支付服务器的设计,因此异步返回通知不在本文返回部分的设计范围内。
支付渠道接口部分获得的支付结果是集成平台服务器在得到异步返回的参数后将支付结果通知返回给财付通,财付通服务器将最终的结果通知给财付通支付管理功能函数。因此我们是以这一部分进行研究和讨论。表5为财付通平台支付结果返回列表。
表5 财付通/微信支付返回接口参数列表
TenpayHandler()的功能是取出最终的支付结果,对签名检验,如没有问题与服务器二次确认,通知财付通/微信支付渠道的Tenpay模块,返回最终结果,返回的数据格式为Json。
//取出最终的支付结果
JSONObject jo;
//检查签名是否正确后获取Statuscode
checksign();
Statuscode = jo.getString ("Statuscode");
//与支付集成平台的支付服务器进行确认
CheckOrder.recheckOrderWithServer(mCPInfo, Statuscode);
//通知财付通/微信支付渠道的Tenpay模块,返回最终结果。
Tenpay.getJPayManager().PayCallBack(Statuscode,JPayManager.Tenpay).