电子化支付典型业务场景
及开发案例 (代理银行篇)
广州江南科友科技股份有限公司
2013-6-20
1
1.
典型业务场景 ........................................................................................................................... 1 1.1. 读取凭证 ....................................................................................................................... 1 1.2. 预算外拨款单(财政<-->商业银行) ........................................................................ 1
1.2.1. 查看拨款单 ....................................................................................................... 1 1.2.2. 拨款单打印 ....................................................................................................... 1 1.2.3. 拨款单签章发送 ............................................................................................... 1 1.2.4. 拨款单退回: ................................................................................................... 1 1.3. 直接支付凭证(财政<-->商业银行) ........................................................................ 2
1.3.1. 支付凭证查看 ................................................................................................... 2 1.3.2. 支付凭证打印 ................................................................................................... 2 1.3.3. 支付凭证签章发送 ........................................................................................... 2 1.3.4. 支付凭证退回 ................................................................................................... 2 1.4. 授权支付凭证(财政<-->商业银行) ........................................................................ 2
1.4.1. 支付凭证查看 ................................................................................................... 2 1.4.2. 支付凭证打印 ................................................................................................... 3 1.4.3. 支付凭证签章发送 ........................................................................................... 3 1.4.4. 支付凭证退回: ............................................................................................... 3 1.5. 划款单(商业银行<-->清算行) ................................................................................ 3
1.5.1. 划款单签章发送 ............................................................................................... 3 1.5.2. 划款单查看 ....................................................................................................... 3 1.6. 划款回单(清算行<-->商业银行) ............................................................................ 4
1.6.1. 划款回单查看 ................................................................................................... 4 1.6.2. 划款单回单打印 ............................................................................................... 4 1.6.3. 划款单回单转发财政 ....................................................................................... 4 1.7. 退款划款回单(清算行<-->商业银行) .................................................................... 4
1.7.1. 划款回单查看 ................................................................................................... 4 1.7.2. 划款单回单打印 ............................................................................................... 4 1.7.3. 划款单回单转发财政 ....................................................................................... 5 1.7.4. 退款通知书签章发送 ....................................................................................... 5 1.8. 其他业务说明 ............................................................................................................... 5
1.8.1. 其他业务主要包括 ........................................................................................... 5 1.8.2. 凭证作废接口 ................................................................................................... 5 1.8.3. 批量查询凭证发送状态 ................................................................................... 5 1.8.4. 凭证打印 ........................................................................................................... 5 代码处理建议 ........................................................................................................................... 6 2.1. 服务端事务一致性处理建议 ....................................................................................... 6 2.2. 采用多线程进行自动回单处理建议 ........................................................................... 7 代码举例 ................................................................................................................................... 8 3.1. WebService封装........................................................................................................... 8
3.1.1. 开发环境 ........................................................................................................... 8 3.1.2. Webservice工具类封装 ................................................................................... 8 3.2. ocx封装 ...................................................................................................................... 16
3.2.1. 开发环境 ......................................................................................................... 16
2
2.
3.
3.2.2. ocx工具类封装 .............................................................................................. 16 3.3. 凭证读取 ..................................................................................................................... 17
3.3.1. 流程图 ............................................................................................................. 17 3.3.2. 示例代码 ......................................................................................................... 17 3.4. 额度到账通知单生成 ................................................................................................. 19
3.4.1. 流程图 ............................................................................................................. 19 3.4.2. 示例代码 ......................................................................................................... 19 3.5. 直接支付确认 ............................................................................................................. 20
3.5.1. 流程图 ............................................................................................................. 20 3.5.2. 示例代码 ......................................................................................................... 20 3.6. 授权支付确认 ............................................................................................................. 21
3.6.1. 流程图 ............................................................................................................. 21 3.6.2. 示例代码 ......................................................................................................... 21 3.7. 划款申请签章发送 ..................................................................................................... 22
3.7.1. 流程图 ............................................................................................................. 22 3.7.2. 示例代码 ......................................................................................................... 22 3.8. 退款凭证签章发送 ..................................................................................................... 24
3.8.1. 流程图 ............................................................................................................. 24 3.8.2. 示例代码 ......................................................................................................... 24 3.9. 退款通知书签章发送 ................................................................................................. 26
3.9.1. 流程图 ............................................................................................................. 26 3.9.2. 示例代码 ......................................................................................................... 26 3.10. 财政直接支付入账通知书生成 ............................................................................. 27
3.10.1. 流程图 ............................................................................................................. 27 3.10.2. 示例代码 ......................................................................................................... 27 3.11. 授权支付日报生成 ................................................................................................. 28
3.11.1. 流程图 ............................................................................................................. 28 3.11.2. 示例代码 ......................................................................................................... 28 3.12. 预算外拨款 ............................................................................................................. 29
3.12.1. 流程图 ............................................................................................................. 29 3.12.2. 示例代码 ......................................................................................................... 29 3.13. 预算外清算划款 ..................................................................................................... 31
3.13.1. 流程图 ............................................................................................................. 31 3.13.2. 示例代码 ......................................................................................................... 31 3.14. 签收回执处理 ......................................................................................................... 32
3.14.1. 流程图 ............................................................................................................. 32 3.14.2. 示例代码 ......................................................................................................... 32
3
1. 典型业务场景
1.1. 读取凭证
1) (服务器端)读取未签收凭证readVoucherAgain
2) (服务器端)签收成功 confirmVoucher 3) (服务器端)签收失败 confirmVoucherFail
1.2. 预算外拨款单(财政<-->商业银行) 1.2.1. 查看拨款单
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
1.2.2. 拨款单打印
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer;
5)
(客户端)打印凭证PrintAllVoucher(每次调用最多支持200笔)1.2.3. 拨款单签章发送
1) (服务端)凭证签章signStampByNos 2) (服务端)发送凭证sendVoucher
1.2.4. 拨款单退回:
1) (服务端)凭证退回returnVoucher
1
1.3. 直接支付凭证(财政<-->商业银行) 1.3.1. 支付凭证查看
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
1.3.2. 支付凭证打印
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer;
5)
(客户端)打印凭证PrintAllVoucher(每次调用最多支持200笔)1.3.3. 支付凭证签章发送
1) (服务端)凭证签章signStampByNos 2) (服务端)发送凭证sendVoucher
1.3.4. 支付凭证退回
1) (服务端)凭证退回returnVoucher
1.4. 授权支付凭证(财政<-->商业银行)
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
1.4.1. 支付凭证查看
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl
2
2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5) 显示指定凭证SetCurrentVoucher或调用Refresh
1.4.2. 支付凭证打印
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer;
5)
(客户端)打印凭证PrintAllVoucher(每次调用最多支持200笔)1.4.3. 支付凭证签章发送
1) (服务端)凭证签章signStampByNos 2) (服务端)发送凭证sendVoucher
1.4.4. 支付凭证退回:
1) (服务端)凭证退回returnVoucher
1.5. 划款单(商业银行<-->清算行) 1.5.1. 划款单签章发送
1) (服务端)凭证签章signStampByNos 2) (服务端)发送凭证sendVoucher
1.5.2. 划款单查看
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
3
1.6. 划款回单(清算行<-->商业银行) 1.6.1. 划款回单查看
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
1.6.2. 划款单回单打印
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer;
5)
(客户端)打印凭证PrintAllVoucher(每次调用最多支持200笔)1.6.3. 划款单回单转发财政
1) (服务端)设置凭证库服务器地址sendVoucherFullSigns
1.7. 退款划款回单(清算行<-->商业银行) 1.7.1. 划款回单查看
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer; 5)
显示指定凭证SetCurrentVoucher或调用Refresh
1.7.2. 划款单回单打印
1) (客户端)设置凭证库服务器地址SetEvoucherServiceUrl 2) (客户端)设置电子印章服务地址SetEstampServiceUrl 3) (客户端)初始化控件Initialize
4) (客户端)加载凭证AddVoucherfromServer;
5)
(客户端)打印凭证PrintAllVoucher(每次调用最多支持200笔)
4
1.7.3. 划款单回单转发财政
1) (服务端)设置凭证库服务器地址sendVoucherFullSigns
1.7.4. 退款通知书签章发送
1) (服务端)凭证签章signStampByNos 2) (服务端)发送凭证sendVoucher
1.8. 其他业务说明 1.8.1. 其他业务主要包括
1. 直接支付入账通知书、退款通知书等:由银行生成凭证,服务端签章后发送给财政。 2. 直接支付额度、授权支付额度等:同拨款单(银行不再做转账操作)
1.8.2. 凭证作废接口
1. 作废凭证:凭证作废接口将已经签过章的所有凭证进行作废,所指定作废的凭证号在凭
证库的所有签章记录处于不可用状态。discardVoucher
1.8.3. 批量查询凭证发送状态
1. 批量查询凭证状态:凭证签章发送后,通过该接口可以查询凭证状态,凭证状态有
0未接收 1、已接收 2、接收失败 3、签收成功 4、签收失败 5、已回单 6、被退回几种模式,根据实际情况进行后续处理,比如入账通知书接收失败则作废原有凭证(discardVoucher),并重新签章发送给财政。
1.8.4. 凭证打印
凭证打印有两种业务场景,包括日常的采用预览凭证打印和定期批量打印,需要采用ocx控件实现打印功能,调用方式如下: 注:安装客户端EVoucherOcx安装包,32位操作系统采用setup.bat自动安装;64位操作系统需要安装到:c:\\Windows\\SysWOW64目录。
5
1.8.4.1. 日常可视化打印
1. 2. 3. 4. 5. 6.
设置凭证库服务器地址SetEvoucherServiceUrl 设置电子印章服务地址SetEstampServiceUrl 设置身份认证服务地址SetCertVerifyUrl 初始化控件Initialize
循环加载凭证AddVoucherfromServer 显示指定凭证SetCurrentVoucher
7. 打印凭证时调用PrintVoucherByNo接口打印指定凭证。
1.8.4.2. 定期批量打印
1. 2. 3. 4.
设置凭证库服务器地址SetEvoucherServiceUrl 设置电子印章服务地址SetEstampServiceUrl 初始化控件Initialize
批量打印凭证PrintAllVoucher(每次调用最多支持200笔)
2. 代码处理建议
2.1. 服务端事务一致性处理建议
事务处理的关键是将对凭证库的写类操作(改变凭证状态的操作)代码,放在业务逻辑代码的最后处理。这样当调用电子凭证库出异常时;业务系统的逻辑可以回滚,无异常时,可以提交。以业务系统手动控制事务为例,代码逻辑如下: try { //1、获取客户端传来的签章报文
Object clientData = …
//2、事务开始 beginTransction();
//3、业务系统业务处理逻辑 (略)
//4、将签章报文保存入库,这行代码放在业务系统处理逻辑最后面。
/saveStampVoucher();
//5、事务提交 commit(); }
catch(Exception)
6
{ }
//业务系统事务回滚 rollback();
//如果是凭证库异常,并按照凭证库异常代码提示相应错误信息 //其他异常,业务系统自行处理。
2.2. 采用多线程进行自动回单处理建议
适用的情况:
1)代理银行自动接收额度通知单并进行回单处理。
2)授权支付由代理银行代编模式下,授权支付申请发给财政,财政自动进行额度控制,并发回审批单。
如果采用单一线程从凭证库读取数据并进行回单处理,由于每笔回单的生成、签章和发送均需要消耗时间,可能导致数据积压在凭证库的情况。
如果凭证库中同时到达1000笔数据,每笔数据下载成功后并进行签收、生成回单、签章、发送的处理时间为每笔5秒,那么处理完1000笔就需要5000秒,近2个小时,发送方才能接到回单。
如果采用多线程处理,在业务系统服务器理想状态下,那么基本可以在5分钟内处理完成。 所以我们建议业务系统采用多线程模式,进行回单生成,并行处理。
建议的业务系统处理方式(仅供参考): 业务系统将原来的单一线程逻辑: {
第一步:读取“未签收”凭证
第二步:业务处理:凭证入“业务数据库”,设定为“未处理”标识 第三步:签收凭证 第四步:生成回单
第五步:回单签章并发送
第六步:修改业务表中凭证为“已处理”标识 }
修改为两类线程处理, 一类是调度线程“凭证读取线程”,是单一线程,负责凭证的读取和签收, 另一类是任务线程“凭证审批处理程序”,负责凭证的回单生成和发送。
1) 调度线程:凭证读取线程
负责读取凭证,查找空闲的”凭证审批处理线程”,将待处理的凭证分配给凭证审批处理线程。
调度逻辑如下: {
第一步:调用:读取“未签收”凭证 第二步:业务处理:凭证入“业务数据库”,设定为“未处理”标识 第三步:调用:设置凭证标识“已签收” 第四步:分发任务线程进行回单处理
7
}
2) 任务线程:凭证审批处理线程, 任务线程”的数量在5-10个以内,在业务系统可以进行配置。
处理逻辑如下: {
第一步:回单生成
第二步:回单签章和发送处理。
第三步:修改业务表中凭证为“已处理”标识 }
3. 代码举例
3.1. WebService封装 3.1.1. 开发环境
1.axis1.4 所需jar包==》。 2.jdk6.0
3.1.2. Webservice工具类封装
package test; import java.io.IOException; import java.io.InputStream; import java.rmi.RemoteException; import java.util.HashMap; import java.util.Properties; import org.apache.axis.client.Call; import org.apache.axis.client.Service; /******************************************************************************* * webservice调用工具类 8
* */ public class WSClientHandler { /** * 根据配置地址调用函数 * * @param address * 服务地址 * @param opName * 函数名 * @param paras * 参数 * @return 函数返回值 9
/** 缓存远程调用 * */ private static HashMap * 反射调用 * * @param call * 远程调用对象 * @param opName * 函数名 * @param paras * 参数集 * @return 函数函数值 */ private static Object invokeMethod(Call call, String opName, } /** * 根据地址获取远程调用对象 * * @param address * 服务地址 * @return 远程调用对象 */ private static Call getCall(String address) { Call call = null; if (CACHE_SERVICE.containsKey(address)) { call = CACHE_SERVICE.get(address); // 创建服务对象 11 Object... paras) { Object retObj = null; // 设置要调用的方法 call.setOperationName(opName); // 该方法需要的参数 Object[] objs = new Object[paras.length]; int a = 0; for (Object objpara : paras) { } try { // 调用该方法 retObj = call.invoke(objs); objs[a] = objpara; a++; } catch (RemoteException e) { throw new RuntimeException(\"远程调用函数失败\", e); } return retObj; } else { } } } Service service = new Service(); try { call = (Call) service.createCall(); } catch (javax.xml.rpc.ServiceException e) { throw new RuntimeException(\"获取远程调用对象失败\", e); } // 设置远程地址 call.setTargetEndpointAddress(address); CACHE_SERVICE.put(address, call); // 清空操作 call.clearOperation(); // 清空头 call.clearHeaders(); return call; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * 凭证库服务类 * @author xxx * */ public class AsspOperator { /** * 写入指定位置服务器签章的凭证 */ @SuppressWarnings(\"unchecked\") 12 private String certID=\"\"; public AsspOperator(String certId){ } this.certID = certId; public Map } admDivCode,year,vtCode,vouchers,Stamp); /** * 查询未读取的凭证 */ public byte[] asspReadFromEvoucher(String admDivCode, int year, } /** * 确认凭证签收成功 */ public void asspConfirmVoucherSuccess(String admDivCode,int year, } /** * 确认凭证签收失败 */ public void asspConfirmVoucherFail(String admDivCode,int year, } throws Exception { String voucherNo) throws Exception { throws Exception { String vtCode, int voucherCount) return (byte[]) WSClientHandler.callMethod(\"readVoucherAgain\", year, vtCode, voucherCount); certID,admDivCode, String vtCode, WSClientHandler.callMethod(\"confirmVoucher\", year, vtCode,new String[]{voucherNo}); certID,admDivCode, String vtCode, String voucherNo,String errMsg) WSClientHandler.callMethod(\"confirmVoucherFail\", year, vtCode, new String[]{voucherNo},errMsg); certID,admDivCode, * 退回凭证 */ public void asspReturnVoucher(String admDivCode, int year, String } /** * 发送凭证包含全部签章 */ public void sendVoucherFullSigns(String admDivCode, int year, } /** * 发送凭证 */ public void asspSendVoucher(String admDivCode, } /** * 查询指定凭证类型的盖章位置及名称 */ @SuppressWarnings(\"unchecked\") public Map vtCode, String voucherNo, String errmsg) throws Exception { year,vtCode,new String[]{voucherNo}, new WSClientHandler.callMethod(\"returnVoucher\", certID, admDivCode, String[]{errmsg}); String srcOrgType, String decOrgType, String vtCode, String[] voucherNo) throws Exception { WSClientHandler.callMethod(\"sendVoucherFullSigns\", certID, decOrgType,year,vtCode,voucherNo); admDivCode,srcOrgType, String srcOrgType, String decOrgType, int year,String vtCode, String[] voucherNos) throws Exception { WSClientHandler.callMethod(\"sendVoucher\", certID, decOrgType,year,vtCode,voucherNos); admDivCode,srcOrgType, admDivCode, int year, String vtCode) { return (Map /** * 查询指定凭证类型的印章信息 */ @SuppressWarnings(\"unchecked\") public List