您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页T3.4电子化支付典型业务场景及开发案例(代理银行篇)

T3.4电子化支付典型业务场景及开发案例(代理银行篇)

来源:意榕旅游网


电子化支付典型业务场景

及开发案例 (代理银行篇)

广州江南科友科技股份有限公司

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 CACHE_SERVICE = new HashMap(); private static String DEFAULT_ADDRESS = null; /** * 根据传入地址调用函数 * * @param address * 服务地址 * @param opName * 函数名 * @param paras * 参数 * @return 函数返回值 */ public static Object callMethodByAddress(String address, String } Object... paras) { opName, Object retObj = null; if (null == address || address.length() == 0) throw new RuntimeException(\"WebService地址为空\"); if (null == opName || opName.length() == 0) throw new RuntimeException(\"传入的函数名为空\"); Call call = WSClientHandler.getCall(address); retObj = WSClientHandler.invokeMethod(call, opName, paras); return retObj; */ public static Object callMethod(String opName, Object... paras) { } /** * 获取配置文件地址 * * @return */ private static String getDefaultAddress() { if (DEFAULT_ADDRESS != null) return DEFAULT_ADDRESS; InputStream in = null; Properties prop = new Properties(); try { // 读配置文件中的地址 in = WSClientHandler.class .getResourceAsStream(\"/wsaddress.properties\"); prop.load(in); Object retObj = null; if (null == opName || opName.length() == 0) throw new RuntimeException(\"传入的函数名为空\"); String address = WSClientHandler.getDefaultAddress(); Call call = WSClientHandler.getCall(address); retObj = WSClientHandler.invokeMethod(call, opName, paras); return retObj; } catch (Exception e) { throw new RuntimeException(\"无法获取WebService地址文件\", e); } finally { } DEFAULT_ADDRESS = prop.getProperty(\"address\"); if (null == DEFAULT_ADDRESS || DEFAULT_ADDRESS.length() == 0) throw new RuntimeException(\"WebService地址为空\"); return DEFAULT_ADDRESS; if (in != null) try { } in.close(); throw new RuntimeException(\"关闭WebService文件流失败”\", } catch (IOException e) { e); } /** 10

* 反射调用 * * @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 asspSignStampByNos (String admDivCode, int String vtCode, byte[] vouchers, String Stamp) throws Exception{ year, return (Map)WSClientHandler.callMethod(\"signStampByNos\", certID, /** 13

} 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 asspQueryStampPositionWithName(String } 14

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) certID,admDivCode,year,vtCode); WSClientHandler.callMethod(\"queryStampPositionWithName\",

/** * 查询指定凭证类型的印章信息 */ @SuppressWarnings(\"unchecked\") public List> asspGetStampInfo(String admDivCode, Object[] obj = int year, String orgType) { (Object[])WSClientHandler.callMethod(\"getStampInfo\", certID,admDivCode,year,orgType); } 案例,调用凭证库接口:查询未读取的凭证信息 byte[] bytes =(byte[]) WSClientHander.callMethod(\"readVoucher\参数1,参数2,参数3…); /** * 作废凭证 */ public void asspDiscardVoucher(String admDivCode, int year, String } String[] voucherNos) throws Exception { } List> l = new for(Object o:obj){ } return l; l.add((Map)o); ArrayList>(); vtCode, WSClientHandler.callMethod(\"discardVoucher\", certID, vtCode,voucherNos); admDivCode,year, 15

3.2. ocx封装 3.2.1. 开发环境 3.2.2. ocx工具类封装

一、在电脑中注册ocx控件,将生成在系统目录下的CTJEstampOcx.ocx添加在开户发环境中,完成对ocx的引用,可将ocx拖放在界面中,主要代码如下: private AxEstampOcxLib.AxEstampOcx axEstampOcx1; this.axEstampOcx1 = new AxEstampOcxLib.AxEstampOcx(); this.axEstampOcx1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject(\"axEstampOcx1.OcxState\"))); this.axEstampOcx1.Enabled = true; 二、以凭证显示为例,接口参数参照凭证库接口文档,代码示例如下: 1. 初始化显示控件,从电子支付服务端加载电子凭证的模板。 int ret = 0; int ret= axEstampOcx1.Initialize(certID, admDivCode, stYear, vtCode, payFlowNo, operateType, displayMode, defaultPage); if (ret != 0) { string error = axEstampOcx1.GetLastErr(); BaseMessageBox.ShowInfo(\"\", \"\", \"查看凭证失败原因:\" + error); return; } 2. 添加显示凭证信息用于财政客户端程序,调用此方法添加需要显示的签章凭证信息。 axEstampOcx1.AddVoucher(voucherNo, xml); 3. 定位到显示的凭证,OCX自动验签(章),取章显示 ret = axEstampOcx1.SetCurrentVoucher(voucherNo); if (ret != 0) { string error = axEstampOcx1.GetLastErr(); BaseMessageBox.ShowInfo(\"\", \"\", \"查看凭证失败原因:\" + error); return; } 4. 刷新显示界面,防止出现界面未立即刷新而导致凭证显示不完整的问题。 this.Refresh(); 16

3.3. 凭证读取 3.3.1. 流程图

轮询开始从凭证库读取未签收凭证业务逻辑校验如:付款银行判断,要素信息完整性校验凭证解析入库confirmVoucher入库成功解析入库是否成功?入库失败设定凭证签收成功标志设定凭证签收失败标志一次结束财政授权支付额度通知单(5105)判定凭证类型额度到账通知单生成2301划款申请回单2302退款划款申请回单划款申请单(新增2)一次结束回单登记一次结束一次结束更新本地库中数据为“已同步状态”;更新凭证状态为“5已回单”“是否已同步状态标志”参考签收回执处理的标识说明

3.3.2. 示例代码

//设置证书id为xxx AsspOperator asspOperator = new AsspOperator(\"xxx\"); try { //读取区划为500000,年度为2013年,凭证类型为1021的凭证,每次读取20byte[] content= if( content == null || content.length == 0 ){ 17

条 asspOperator.asspReadFromEvoucher(\"5000000\", 2013, \"5021\", 20); } } return; List objList = parse(content); for( int i = 0; i < objList.size(); i++){ //开启开始小事物处理 PayVoucher pv = null; try{ pv = (PayVoucher)objList.get(i); save2Database(pv); asspOperator.asspConfirmVoucherSuccess(\"5000000\", 2013, \"5021\", new String[]{pv.getVoucherNo()} ); }catch( Exception e ){ } asspOperator.asspConfirmVoucherFail(\"5000000\", 2013, \"5021\", pv.getVoucherNo(), e.getMessage()); //结束小事物处理 } // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { 18

3.4. 额度到账通知单生成 3.4.1. 流程图

开始接到财政授权支付额度通知单(5108)根据授权支付额度通知单生成财政授权支付额度到账通知书(2104)财政授权支付额度到账通知书签章signStampByNos 发送财政授权支付额度到账通知书到预算单位sendVoucher结束

3.4.2. 示例代码

//根据授权额度通知单生成额度到账通知单 //读取未签章的额度到账通知单 //拼装签章所需xml byte[] voucherXml = \"\"; //拼装逻辑自行编写 //拼装所需盖章的xml String stampXml = \"\";//拼装逻辑自行编写 //签章 asspOperator.asspSignStampByNos(\"500000\", 2013, \"2104\", //发送 asspOperator.asspSendVoucher(\"500000\", \"本地路由\", \"财政端路由 2013, \"5012\", new String[]{\"单号1\",\"单号2\"}); voucherXml, stampXml); \",

19

3.5. 直接支付确认 3.5.1. 流程图

开始读取未支付的直接支付凭证(5201)按账号、操作用户分权限提取直接支付,主办行操作授权支付由网点柜面操作补行号等支付转账提交转账提交成功转账提交是否成功?转账提交失败生成支付凭证回单支付凭证回单签章支付凭证回单发送财政(预算单位)支付凭证退回财政returnVouchersignStampByNos 结束sendVoucher结束

3.5.2. 示例代码

boolean succ = 转账逻辑; if( succ ){ //拼装签章所需xml byte[] voucherXml = \"\"; //拼装所需盖章的xml String stampXml = \"\"; //签章 asspOperator.asspSignStampByNos(\"500000\", 2013, \"5021\", //发送 本地路由处填写本银行的机构代码 财政端路由处填写财政端的机构代码 asspOperator.asspSendVoucher(\"500000\", \"本地路由\", \"财政端路由voucherXml, stampXml); \",

20

}else{ 2013, \"5012\", new String[]{\"单号1\",\"单号2\"}); asspOperator.asspReturnVoucher(\"500000\", 2013, \"5021\", \"单号\", \"收款账户不存在!\"); } 3.6. 授权支付确认 3.6.1. 流程图

开始读取未支付的授权支付凭证(8202)补行号等按账号、操作用户分权限提取授权支付凭证额度控制是否通过是调用总行转账接口提示是否强制提交是否强制提交否支付转账提交额度超支处理是结束转账提交成功转账提交是否成功?转账提交失败生成支付凭证回单支付凭证回单签章支付凭证回单发送财政(预算单位)signStampByNos 支付凭证退回财政returnVouchersendVoucher结束结束 3.6.2. 示例代码

同直接支付。

21

3.7. 划款申请签章发送 3.7.1. 流程图

开始查询已支付支付凭证(5201、8202)同行清算是否同行清算跨行清算生成划款凭证(2301)signStampByNos 生成划款凭证(2301)划款申请单签章(业务章)划款凭证签章(转讫章)signStampByNos 2301划款申请单签章sendVoucher sendVoucher 发送划款凭证单给财政发送划款申请单到清算行结束结束

3.7.2. 示例代码

/***划款单签章建议生成划款单后逐一签章发送,因为有同行清算、跨行清算多种情况,同时跨行清算又分为与人行或者其它商业银行清算***/ //根据直接支付凭证生成划款凭证 //拼装签章所需要的报文 byte[] voucherXml = \"\";//拼装逻辑自行编写 //拼装签章信息 boolean clearType = \"清算类型\"; //同行清算 if(clearType){ String stampXml1 = \"\"//获取业务章信息 asspOperator.asspSignStampByNos(\"500000\",2013,\"2301\",voucherXml,stampXml1); 22

//划款单确认(加盖转讫章) String stampXml2 = \"\"//获取转讫章信息xml asspOperator.assSignStampByNos(\"500000\",2013,\"2301\",voucherXml,stampXml2); //发送本地路由是本代理行机构代码,财政路由是财政机构代码 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"财政路由\",2013,\"2301\",new String[]{\"单号1\",\"单号2\"}); //跨行清算 }else{ //拼装印章xml String estampXml = \"\";//拼装逻辑自行编写(代理银行业务章) //签章 asspOperator.asspSignStampByNos(\"500000\",2013,\"2301\",voucherXml,estampXml); //本地路由是本代理行机构代码,清算行路由根据划款单对应的清算银行对应 //开发过程可以配置清算银行与机构代码之间的映射关系,方便发送中匹配对//应的机构编码 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"清算行路由\",2013,\"2301\",new String[]{\"单号1\",\"单号2\"}); } 23

3.8. 退款凭证签章发送 3.8.1. 流程图

开始根据退款流水根据收款人、付款人、支付日期、用途查询原始支付凭证查询待退款支付凭证(5201,8202)根据原始凭证生成退款通知书(2203、2204)生成退款凭证(2302)同行清算是否同行清算跨行清算生成退款凭证(2302)signStampByNos 生成退款凭证(2302)划款申请单签章(业务章)退款凭证签章(转讫章)signStampByNos signStampByNos 2301退款凭证签章(业务章)sendVoucher sendVoucher 发送退款凭证给财政发送退款凭证到清算行结束结束

3.8.2. 示例代码

/***划款单签章建议生成退款凭证后逐一签章发送,因为有同行清算、跨行清算多种情况,同时跨行清算又分为与人行或者其它商业银行清算***/ //根据直接支付凭证生成划款凭证 //拼装签章所需要的报文 byte[] voucherXml = \"\";//拼装逻辑自行编写 //拼装签章信息 boolean clearType = \"清算类型\"; //同行清算 24

if(clearType){ String stampXml1 = \"\"//获取业务章信息 asspOperator.asspSignStampByNos(\"500000\",2013,\"2302\",voucherXml,stampXml1); //划款单确认(加盖转讫章) String stampXml2 = \"\"//获取转讫章信息xml asspOperator.assSignStampByNos(\"500000\",2013,\"2302\",voucherXml,stampXml2); //发送本地路由是本代理行机构代码,财政路由是财政机构代码 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"财政路由\",2013,\"2301\",new String[]{\"单号1\",\"单号2\"}); //跨行清算 }else{ //拼装印章xml String estampXml = \"\";//拼装逻辑自行编写(代理银行业务章) //签章 asspOperator.asspSignStampByNos(\"500000\",2013,\"2302\",voucherXml,estampXml); //本地路由是本代理行机构代码,清算行路由根据划款单对应的清算银行对应 //开发过程可以配置清算银行与机构代码之间的映射关系,方便发送中匹配对//应的机构编码 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"清算行路由\",2013,\"2301\",new String[]{\"单号1\",\"单号2\"}); } 25

3.9. 退款通知书签章发送 3.9.1. 流程图

开始sendFullSings查询已清算的退款通知书(2303、2304)在读取凭证进程中2302的回单已经回来后查询已清算的退款通知书(2303、2304)signStampByNos 退款通知书签章(2303、2304)退款通知书发送sendVoucher、结束

3.9.2. 示例代码

//以直接支付退款通知书发送为例 //生成用于签章和发送的报文 String voucherXml = \"\";//业务报文 String estampXml = \"\"; //电子印章报文 //退款凭证签章 asspOperator.signStampByNos(\"500000\",2013,\"2206\",voucherXml,estampXml); //退款通知书发送 本地路由是本行机构编码 财政路由是财政机构编码 asspOperator.asspSendVoucher(\"500000\",\"本地路由,\"财政路由\",2013,\"2206\",new String[]{\"单号1\",\"单号2\"}); 26

3.10. 财政直接支付入账通知书生成 3.10.1. 流程图

开始开始查询已确认直接支付凭证(5201)2205明细需要有原凭证号查询已清算直接支付退款通知书(2203)由于退款格式不同,所以需要增加一个新的凭证类型生成直接支付入账通知书(2205)signStampByNos 生成直接支付退款入账通知书(新增3)signStampByNos 直接支付入账通知书签章直接支付退款入账通知书签章sendVoucher直接支付入账通知书发送直接支付退款入账通知书发送sendVoucher结束结束

3.10.2. 示例代码

//1,正常流程 //查询已经确认的直接支付凭证 //根据已经确认的直接支付凭证,生成入账通知单 //获取签证报文 byte[] voucherXml = \"\"; //获取印章信息 String estampXml = \"\"; //对生成的直接支付入账通知书进行签章 asspOperator.asspStampByNos(\"500000\",2013,\"2205\",voucherXml,estampXml); //将已经签章的入账通知书发送到财政 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"财政路由\",2013,\"2205\",new String[]{\"单号1\",\"单号2\"}); //2,退款流程 27

//查询已经清算的直接支付退款通知书 //生成直接支付退款入账通知书 //拼装直接支付退款通知书报文 byte[] voucherXml =\"\"; //获取印章信息 String estampXml = \"\"; //对生成的直接支付退款入账通知书进行签章 asspOperator.asspStampByNos(\"500000\",2013,\"凭证类型\",voucherXml,estampXml); //将签章后的直接支付退款入账通知书发送到财政 asspOperator.asspSendVoucher(\"500000\",\"本地路由\",\"财政路由\",2013,\"凭证类型\",new String[]{\"单号1\",\"单号2\"});

3.11. 授权支付日报生成 3.11.1. 流程图

开始2206明细需要有原凭证号查询已确认授权支付凭证(2202)、查询已清算授权支付退款通知书(2204)生成授权支付日报(2206)授权支付日报签章授权支付日报发送signStampByNos sendVoucher、结束

3.11.2. 示例代码

参照3.10.2入账通知单生成

28

3.12. 预算外拨款 3.12.1. 流程图

开始读取未确认的划款凭证(2301)比对清算额度通知单(5106,5108)划款确认提交成功提交是否成功?提交失败生成划款凭证回单划款凭证凭证退回财政划款凭证回单签章signStampByNos 结束划款凭证回单回单发送代理银行sendVoucher结束 3.12.2. 示例代码

boolean succ = \"转账逻辑\"; if(succ){ //生成拨款回单 //获取博看回单报文 byte[] voucherXml = \"\"; //获取签章信息 29

String estampXml =\"\"; //签章 asspOperator.asspStampByNos(\"500000\",2013,\"凭证类型编码\",voucherXml,estampXml); //发送到财政凭证库 asspOperator.asspSendVoucher(\"50000\",\"本地路由\",\"财政路由\",2013, \"5207\",new String[]{\"单号1\",\"单号2\"}); }else{ //获取退回原因 String backReason = \"\"; //退回财政 asspOperator.asspReturnVoucher(\"500000\",\"5207\",new String[]{\"单号1\",\"单号2\"},backReason); }

30

3.13. 预算外清算划款 3.13.1. 流程图

开始读取未确认的划款凭证(2301)比对清算额度通知单(5106,5108)划款确认提交成功提交是否成功?提交失败生成划款凭证划款凭证凭证退回单回财政划款凭证回单signStampByNos 签章结束划款凭证回单sendVoucher回单发送代理银行结束3.13.2. 示例代码

参照3.12.2预算外划款拨款。

31

3.14. 签收回执处理 3.14.1. 流程图

需要轮询的数据有:5201直接支付凭证回单、8202授权凭证回单、2205直接支付入账通知书、2206授权支付日报、2301划款凭证回单,2302退款凭证回单等轮询开始batchQuerySentVoucherStatus从本系统读取已发送状态为“未同步状态”的凭证读取的状态判断“是否已同步状态标志”用来避免重复查询同一凭证的状态2、接收失败 3、签收成功 4、签收失败 5、已回单、6、被退回更新本地库中数据状态更新本地库中数据为“已同步状态”一次结束

3.14.2. 示例代码

32

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务