diff --git a/WebContent/WEB-INF/lib/lombok.jar b/WebContent/WEB-INF/lib/lombok.jar new file mode 100644 index 000000000..8fbcc50e0 Binary files /dev/null and b/WebContent/WEB-INF/lib/lombok.jar differ diff --git a/src_cmb/com/tenwa/sdk/VO/SDKCheckCallBackVO.java b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallBackVO.java new file mode 100644 index 000000000..ab9ab9886 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallBackVO.java @@ -0,0 +1,11 @@ +package com.tenwa.sdk.VO; + +import java.util.List; + +import lombok.Data; + +@Data +public class SDKCheckCallBackVO { + private SDKCheckCallInfoVO info ; + private List details ; +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKCheckCallDetail.java b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallDetail.java new file mode 100644 index 000000000..95c1fffc4 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallDetail.java @@ -0,0 +1,53 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKCheckCallDetail { + private String BUSCOD;// 业务代码 C(6) 附录A.4 否 + private String BUSMOD;// 业务模式 C(5) 否 + private String DBTBBK;// 付方开户地区代码 C(2) 附录A.1 否 + private String DBTACC;// 付方帐号 C(35) 否 企业用于付款的转出帐号,该帐号的币种类型与币种字段相符。 + private String DBTNAM;// 付方帐户名 C(200) 否 企业用于付款的转出帐号的户名 + private String DBTBNK;// 付方开户行 Z(62) 否 企业用于付款的转出帐号的开户行名称,如:招商银行北京分行。 + private String DBTADR;// 付方行地址 Z(62) 可 企业用于付款的转出帐号的开户行地址 + private String CRTBBK;// 收方开户地区代码 C(2) 附录A.1 可 + private String CRTACC;// 收方帐号 C(35) 否 收款企业的转入帐号,该帐号的币种类型与币种字段相符。 + private String CRTNAM;// 收方帐户名 Z(200) 否 收款方企业的转入帐号的帐户名称。 + private String RCVBRD;// 收方大额行号 C(12) 二代支付新增 + private String CRTBNK;// 收方开户行 Z(62) 可 收方帐号的开户行名称,如:招商银行北京分行。 + private String CRTADR;// 收方行地址 Z(62) 可 收方帐号的开户行地址。 + private String GRPBBK;// 母公司开户地区代码 C(2) 附录A.1 可 + private String GRPACC;// 母公司帐号 C(35) 可 企业所属母公司的帐号。只对集团支付有效。 + private String GRPNAM;// 母公司帐户名 Z(62) 可 企业所属母公司帐号的帐户名称。只对集团支付有效。 + private String CCYNBR;// 币种代码 N(2) 附录A.3 否 + private String TRSAMT;// 交易金额 M 否 该笔业务的付款金额。 + private String EPTDAT;// 期望日 D 可 企业银行客户端经办时指定的期望日期。 + private String EPTTIM;// 期望时间 T 可 企业银行客户端经办时指定的期望时间。只有小时数有效。 + private String BNKFLG;// 系统内外标志 C(1) “Y”表示系统内, “N”表示系统外 可 表示该笔业务是否为招行系统内的支付结算业务。 + private String REGFLG;// 同城异地标志 C(1) “Y”表示同城业务; “N”表示异地业务 可 表示该笔业务是否为同城业务。 + private String STLCHN;// 结算方式代码 C(1) N-普通;F-快速 可 + private String NUSAGE;// 用途 Z(28) 可 + private String NTFCH1;// 收方电子邮件 C(36) 可 收款方的电子邮件地址,用于邮件通知。 + private String NTFCH2;// 收方移动电话 C(16) 可 收款方的移动电话,用于短信通知。 + private String OPRDAT;// 经办日期 D 可 经办该笔业务的日期。 + private String YURREF;// 业务参考号 C(30) 否 用于标识该笔业务编号,企业银行编号+业务类型+业务参考号必须唯一。 + private String REQNBR;// 流程实例号 C(10) 可 + private String BUSNAR;// 业务摘要 Z(196) 可 用于企业付款时填写说明或者备注。 + private String REQSTS;// 业务请求状态代码 C(3) 附录A.5 否 + private String RTNFLG;// 业务处理结果代码 C(1) 附录A.6 可 + private String OPRALS;// 操作别名 Z(28) 可 待处理的操作名称。 + private String RTNNAR;// 结果摘要 Z(88) 可 支付结算业务处理的结果描述,如失败原因、退票原因等 + private String RTNDAT;// 退票日期 D 可 + private String ATHFLG;// 是否有附件信息 C(1) “Y”表示有附件,“N”表示无附件 可 + private String LGNNAM;// 经办用户登录名 Z(30) 可 + private String USRNAM;// 经办用户姓名 Z(30) 可 + private String TRSTYP;// 业务种类 C(6) 可 二代支付新增 + private String FEETYP;// 收费方式 C(1) N = 不收费 Y = 收费 可 + private String RCVTYP;// 收方公私标志 C(1) A=对公 P=个人 X=信用卡 可 + private String BUSSTS;// 汇款业务状态 C(1) A =待提出 C=已撤销 D =已删除 P =已提出 R=已退票 W=待处理(待确认) 可 + private String TRSBRN;// 受理机构 C(6) 可 + private String TRNBRN;// 转汇机构 C(6) 可 + private String RSV30Z;// 保留字段 C(30) 可 虚拟户支付时前十位为虚拟户编号 + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKCheckCallInfoVO.java b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallInfoVO.java new file mode 100644 index 000000000..452f771ef --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKCheckCallInfoVO.java @@ -0,0 +1,29 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKCheckCallInfoVO { + private String FUNNAM; + private String DATTYP; + private String RETCOD; + private String ERRMSG; + private int STATUS; + private String XML; + + public SDKCheckCallInfoVO() { + + } + + public SDKCheckCallInfoVO(int STATUS,String ERRMSG) { + this.STATUS = STATUS; + this.ERRMSG = ERRMSG; + } + public SDKCheckCallInfoVO(String XML) { + this.STATUS = 1; + this.XML = XML; + } + + + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKCheckInfoVO.java b/src_cmb/com/tenwa/sdk/VO/SDKCheckInfoVO.java new file mode 100644 index 000000000..ae0a93c0f --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKCheckInfoVO.java @@ -0,0 +1,10 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKCheckInfoVO { + private String FUNNAM ; + private int DATTYP ; + private String LGNNAM ; +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKDcPayReqxVO.java b/src_cmb/com/tenwa/sdk/VO/SDKDcPayReqxVO.java new file mode 100644 index 000000000..59f477584 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKDcPayReqxVO.java @@ -0,0 +1,220 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKDcPayReqxVO { + /* + * URL[https://u.ebank.cmbchina.com/CmbBank_GenShell/UI/Help/DCBank2/API.aspx?03ZFJS/08DCPAYREQ] + */ + + + /* + * 名称[业务参考号] + * 类型[C(30)] + * 取值[] + * 可空[否] + * 备注[用于标识该笔业务的编号,企业银行编号+业务类型+业务参考号必须唯一。企业可以自定义业务参考号,也可使用银行缺省值(单笔支付),批量支付须由企业提供。 直联必须用企业提供] + */ + private String YURREF ; + /* + * 名称[期望日] + * 类型[D] + * 取值[] + * ### 可空[可] + * 备注[默认为当前日期] + */ + private String EPTDAT ; + /* + * 名称[期望时间] + * 类型[T] + * 取值[] + * ### 可空[可] + * 备注[默认为‘000000’] + */ + /* + * 名称[付方帐号] + * 类型[N(35)] + * 取值[] + * 可空[否] + * 备注[企业用于付款的转出帐号,该帐号的币种类型必须与币种字段相符。] + */ + private String DBTACC ; + /* + * 名称[付方开户地区代码] + * 类型[C(2)] + * 取值[附录A.1] + * 可空[否] + * 备注[无] + */ + private String DBTBBK ; + /* + * 名称[交易金额] + * 类型[M] + * 取值[] + * 可空[否] + * 备注[该笔业务的付款金额。] + */ + private String TRSAMT ; + /* + * 名称[币种代码] + * 类型[C(2)] + * 取值[附录A.3] + * 可空[否] + * 备注[币种暂时只支持10-人民币] + */ + private String CCYNBR ; + /* + * 名称[结算方式代码] + * 类型[C(1)] + * 取值[N:普通 F:快速] + * 可空[否] + * 备注[只对跨行交易有效;同行都是实时到账。] + */ + private String STLCHN ; + /* + * 名称[用途] + * 类型[Z(62)] + * 取值[] + * ### 可空[否] + * 备注[对应对账单中的摘要NARTXT] + */ + private String NUSAGE ; + /* + * 名称[业务摘要] + * 类型[Z(200)] + * 取值[] + * ### 可空[可] + * 备注[用于企业付款时填写说明或者备注。] + */ + private String BUSNAR ; + /* + * 名称[收方帐号] + * 类型[N(35)] + * 取值[] + * 可空[否] + * 备注[收款企业的转入帐号,该帐号的币种类型必须与币种字段相符。] + */ + private String CRTACC ; + /* + * 名称[收方帐户名] + * 类型[Z(62)] + * 取值[] + * ### 可空[可] + * 备注[收款方企业的转入帐号的帐户名称。 收方帐户名与收方长户名不能同时为空] + */ + private String CRTNAM ; + /* + * 名称[收方长户名] + * 类型[Z(200)] + * 取值[] + * ### 可空[可] + * 备注[收款方企业的转入帐号的帐户名称。 收方帐户名与收方长户名不能同时为空] + */ + private String LRVEAN ; + /* + * 名称[收方行号] + * 类型[C(30)] + * 取值[] + * ### 可空[可] + * 备注[自动支付收方联行号] + */ + private String BRDNBR ; + /* + * 名称[系统内外标志] + * 类型[] + * 取值[Y:招行;N:非招行] + * 可空[否] + * 备注[无] + */ + private String BNKFLG ; + /* + * 名称[收方开户行] + * 类型[Z(62)] + * 取值[] + * ### 可空[可] + * 备注[无] + */ + private String CRTBNK ; + /* + * 名称[城市代码] + * 类型[C(4)] + * 取值[附录A.18] + * ### 可空[可] + * 备注[行内支付填写,如果为空跟据收方省份和收方城市自动获取代码] + */ + private String CTYCOD ; + /* + * 名称[收方省份] + * 类型[Z(18)] + * 取值[附录A.18] + * 可空[否] + * 备注[支持省简写,如河南,河北,西藏,新疆,内蒙古,广西,宁夏,青海] + */ + private String CRTPVC ; + /* + * 名称[收方城市] + * 类型[Z(22)] + * 取值[附录A.18] + * 可空[否] + * 备注[支持市简写,如郑州,石家庄,拉萨,呼和浩特,南宁,银川,西宁] + */ + private String CRTCTY ; + /* + * 名称[收方县/区] + * 类型[Z(22)] + * 取值[] + * ### 可空[可] + * 备注[收方帐号开户行所在的县或区,格式为:XX县/区,可为空。如:宝安区。] + */ + private String CRTDTR ; + /* + * 名称[收方电子邮件] + * 类型[C(36)] + * 取值[] + * ### 可空[可] + * 备注[收款方的电子邮件地址,用于交易 成功后邮件通知。] + */ + private String NTFCH1 ; + /* + * 名称[收方移动电话] + * 类型[C(16)] + * 取值[] + * ### 可空[可] + * 备注[收款方的移动电话,用于交易 成功后短信通知] + */ + private String NTFCH2 ; + /* + * 名称[收方编号] + * 类型[C(20)] + * 取值[] + * ### 可空[可] + * 备注[用于标识收款方的编号。非受限收方模式下可重复] + */ + private String CRTSQN ; + /* + * 名称[业务种类] + * 类型[C(6)] + * 取值[100001=普通汇兑 101001=慈善捐款 101002 =其他] + * ### 可空[可] + * 备注[默认100001] + */ + private String TRSTYP ; + /* + * 名称[行内收方账号户名校验] + * 类型[C(1)] + * 取值[1:校验 空或者其他值:不校验] + * ### 可空[可] + * 备注[如果为1,行内收方账号与户名不相符则支付经办失败] + */ + private String RCVCHK ; + /* + * 名称[保留字段] + * 类型[C(27)] + * 取值[] + * ### 可空[可] + * 备注[虚拟户支付时,前10位填虚拟户编号;集团支付不支持虚拟户支付] + */ + private String RSVFLD ; + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKDcopdPayXVO.java b/src_cmb/com/tenwa/sdk/VO/SDKDcopdPayXVO.java new file mode 100644 index 000000000..3a7718766 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKDcopdPayXVO.java @@ -0,0 +1,33 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKDcopdPayXVO { + private String YURREF; //业务参考号 C(30) 否 用于标识该笔业务的编号,企业银行编号+业务类型+业务参考号必须唯一。企业可以自定义业务参考号,也可使用银行缺省值(单笔支付),批量支付须由企业提供。 直联必须用企业提供 + private String EPTDAT; //期望日 D 默认为当前日期 可 + private String EPTTIM; //期望时间 T 默认为‘000000’ 可 + private String DBTACC; //付方帐号 N(35) 否 企业用于付款的转出帐号,该帐号的币种类型必须与币种字段相符。 + private String DBTBBK; //付方开户地区代码 C(2) 附录A.1 否 付方帐号的开户行所在地区,如北京、上海、深圳等。 付方开户地区和付方开户地区代码不能同时为空,同时有值时DBTBBK有效。 + private float TRSAMT; //交易金额 M 否 该笔业务的付款金额。 + private String CCYNBR; //币种代码 C(2) 附录A.3 否 币种代码和币种名称不能同时为空同时有值时CCYNBR有效。。币种暂时只支持10(人民币) + private String STLCHN; //结算方式代码 C(1) N:普通 F:快速 否 只对跨行交易有效 + private String NUSAGE; //用途 Z(62) 否 对应对账单中的摘要NARTXT + private String BUSNAR; //业务摘要 Z(200) 可 用于企业付款时填写说明或者备注。 + private String CRTACC; //收方帐号 N(35) 否 收款企业的转入帐号,该帐号的币种类型必须与币种字段相符。 + private String CRTNAM; //收方帐户名 Z(62) 可 收款方企业的转入帐号的帐户名称。 收方帐户名与收方长户名不能同时为空 + private String LRVEAN; //收方长户名 Z(200) 可 + private String BRDNBR; //收方行号 C(30) 可 人行自动支付收方联行号 + private String BNKFLG; //系统内外标志 Y:招行;N:非招行; 否 + private String CRTBNK; //收方开户行 Z(62) 跨行支付(BNKFLG=N)必填 可 + private String CTYCOD; //城市代码 C(4) 附录A.18 CRTFLG不为Y时行内支付必填。 可 行内支付填写,为空则不支持收方识别功能。 + private String CRTADR; //收方行地址 Z(62) 跨行支付(BNKFLG=N)必填;CRTFLG不为Y时行内支付必填。 可 例如:广东省深圳市南山区 + private String CRTFLG; //收方信息不检查标志 C(1) Y: 行内支付不检查城市代码和收方行地址 默认为Y。 可 + private String NTFCH1; //收方电子邮件 C(36) 可 收款方的电子邮件地址,用于交易 成功后邮件通知。 + private String NTFCH2; //收方移动电话 C(16) 可 收款方的移动电话,用于交易 成功后短信通知。 + private String CRTSQN; //收方编号 C(20) 可 用于标识收款方的编号。非受限收方模式下可重复。 + private String TRSTYP; //业务种类 C(6) 100001=普通汇兑 101001=慈善捐款 101002 =其他 默认100001 + private String RCVCHK; //行内收方账号户名校验 C(1) 1:校验 空或者其他值:不校验 可 如果为1,行内收方账号与户名不相符则支付经办失败。 + private String RSV28Z; //保留字段 C(27) 可 虚拟户支付时,前10位填虚拟户编号;集团支付不支持虚拟户支付。 + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKInfoVO.java b/src_cmb/com/tenwa/sdk/VO/SDKInfoVO.java new file mode 100644 index 000000000..b96b0ab8c --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKInfoVO.java @@ -0,0 +1,37 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKInfoVO { + /* + * URL[https://u.ebank.cmbchina.com/CmbBank_GenShell/UI/Help/DCBank2/API.aspx?03ZFJS/08DCPAYREQ] + */ + + + /* + * 名称[函数名] + * 类型[C(1, 20)] + * 取值[DCPAYREQ] + * 可空[否] + * 备注[无] + */ + private String FUNNAM ; + /* + * 名称[数据格式] + * 类型[N(1)] + * 取值[2:xml格式三] + * 可空[否] + * 备注[无] + */ + private int DATTYP ; + /* + * 名称[登陆用户名] + * 类型[Z(1,20)] + * 取值[] + * 可空[可] + * 备注[前置机模式必填] + */ + private String LGNNAM ; + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKNtstLinFxVo.java b/src_cmb/com/tenwa/sdk/VO/SDKNtstLinFxVo.java new file mode 100644 index 000000000..db3e1ac09 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKNtstLinFxVo.java @@ -0,0 +1,8 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKNtstLinFxVo { + private String REQNBR ; +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKPayCallBackVO.java b/src_cmb/com/tenwa/sdk/VO/SDKPayCallBackVO.java new file mode 100644 index 000000000..d24a46424 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKPayCallBackVO.java @@ -0,0 +1,11 @@ +package com.tenwa.sdk.VO; + +import java.util.List; + +import lombok.Data; + +@Data +public class SDKPayCallBackVO { + private SDKPayCallInfoVO info ; + private List details ; +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKPayCallDetail.java b/src_cmb/com/tenwa/sdk/VO/SDKPayCallDetail.java new file mode 100644 index 000000000..e250847cc --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKPayCallDetail.java @@ -0,0 +1,17 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKPayCallDetail { + private String SQRNBR; + private String YURREF; + private String REQNBR; + private String REQSTS; + private String RTNFLG; + private String OPRSQN; + private String OPRALS; + private String ERRCOD; + private String ERRTXT; + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKPayCallInfoVO.java b/src_cmb/com/tenwa/sdk/VO/SDKPayCallInfoVO.java new file mode 100644 index 000000000..f72787b3c --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKPayCallInfoVO.java @@ -0,0 +1,29 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKPayCallInfoVO { + private String FUNNAM; + private String DATTYP; + private String RETCOD; + private String ERRMSG; + private int STATUS; + private String XML; + + public SDKPayCallInfoVO() { + + } + + public SDKPayCallInfoVO(int STATUS,String ERRMSG) { + this.STATUS = STATUS; + this.ERRMSG = ERRMSG; + } + public SDKPayCallInfoVO(String XML) { + this.STATUS = 1; + this.XML = XML; + } + + + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKPayRqxVO.java b/src_cmb/com/tenwa/sdk/VO/SDKPayRqxVO.java new file mode 100644 index 000000000..07cbd78ae --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKPayRqxVO.java @@ -0,0 +1,37 @@ +package com.tenwa.sdk.VO; + +import lombok.Data; + +@Data +public class SDKPayRqxVO { + /* + * URL[https://u.ebank.cmbchina.com/CmbBank_GenShell/UI/Help/DCBank2/API.aspx?03ZFJS/08DCPAYREQ] + */ + + + /* + * 名称[业务类别] + * 类型[C(6)] + * 取值[N02030:支付 N02040:集团支付] + * 可空[否] + * 备注[无] + */ + private String BUSCOD ; + /* + * 名称[业务模式编号] + * 类型[C(5)] + * 取值[] + * 可空[否] + * 备注[业务模式编号和业务模式名称不能同时为空;业务模式编号和业务模式名称同时有值时业务模式编号有效;可经办的业务模式,可通过查询可经办的业务模式信息(ListMode)获得,也可以在通过前置机程序查询获得。] + */ + private String BUSMOD ; + /* + * 名称[业务模式名称] + * 类型[] + * 取值[] + * 可空[可] + * 备注[业务模式编号和业务模式名称不能同时为空;业务模式编号和业务模式名称同时有值时业务模式编号有效;可经办的业务模式,可通过查询可经办的业务模式信息(ListMode)获得,也可以在通过前置机程序查询获得。] + */ + private String MODALS ; + +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKToCheckVO.java b/src_cmb/com/tenwa/sdk/VO/SDKToCheckVO.java new file mode 100644 index 000000000..6ec19037d --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKToCheckVO.java @@ -0,0 +1,11 @@ +package com.tenwa.sdk.VO; + +import java.util.List; + +import lombok.Data; + +@Data +public class SDKToCheckVO { + private SDKCheckInfoVO INFO ; + private List ntstLinFxList ; +} diff --git a/src_cmb/com/tenwa/sdk/VO/SDKToPayVO.java b/src_cmb/com/tenwa/sdk/VO/SDKToPayVO.java new file mode 100644 index 000000000..b375d3e05 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/VO/SDKToPayVO.java @@ -0,0 +1,16 @@ +package com.tenwa.sdk.VO; + +import java.util.List; + +import lombok.Data; + +@Data +public class SDKToPayVO { + private SDKInfoVO INFO ; + private SDKPayRqxVO SDKPAYRQX ; + private List dcPayReqxList ; + private SDKDcPayReqxVO DCPAYREQX ; + private SDKDcopdPayXVO DCOPDPAYX ; + private List dcopdPayXList ; + +} diff --git a/src_cmb/com/tenwa/sdk/controller/PayController.java b/src_cmb/com/tenwa/sdk/controller/PayController.java new file mode 100644 index 000000000..039e0f194 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/controller/PayController.java @@ -0,0 +1,701 @@ +package com.tenwa.sdk.controller; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import com.amarsoft.are.jbo.BizObject; +import com.amarsoft.are.jbo.BizObjectManager; +import com.amarsoft.are.jbo.BizObjectQuery; +import com.amarsoft.are.jbo.JBOFactory; +import com.amarsoft.are.jbo.JBOTransaction; +import com.tenwa.flow.action.comm.BaseFlowStartAction; +import com.tenwa.sdk.VO.SDKCheckCallBackVO; +import com.tenwa.sdk.VO.SDKCheckCallDetail; +import com.tenwa.sdk.VO.SDKCheckInfoVO; +import com.tenwa.sdk.VO.SDKDcPayReqxVO; +import com.tenwa.sdk.VO.SDKInfoVO; +import com.tenwa.sdk.VO.SDKNtstLinFxVo; +import com.tenwa.sdk.VO.SDKPayCallBackVO; +import com.tenwa.sdk.VO.SDKPayCallDetail; +import com.tenwa.sdk.VO.SDKPayRqxVO; +import com.tenwa.sdk.VO.SDKToCheckVO; +import com.tenwa.sdk.VO.SDKToPayVO; +import com.tenwa.sdk.utils.HttpRequest; +import com.tenwa.sdk.utils.XMLStream; +import com.thoughtworks.xstream.XStream; + +import jbo.app.tenwa.calc.LC_FUND_INCOME_TEMP; +import jbo.com.tenwa.entity.comm.own.OWN_ACCOUNT; +import jbo.com.tenwa.entity.comm.own.OWN_INFO; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_CALLBACK_DETAIL; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_CALLBACK_INFO; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_CALLBACK_LOG; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_PAY_DETAIL; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_PAY_INFO; +import jbo.com.tenwa.lease.comm.LC_FUND_INCOME_PAY_LOG; +import jbo.sys.CODE_LIBRARY; +import net.sf.json.JSONObject; + +public class PayController extends BaseFlowStartAction { + private String ids; //获取选择的fund_income_id 值 例如('a,b,c,d,e....') + private String FLOWUNID ; //流程号 + private String bank_id ; //本方银行账户ID + + public String getFLOWUNID() { + return FLOWUNID; + } + + public void setFLOWUNID(String fLOWUNID) { + FLOWUNID = fLOWUNID; + } + + public String getIds() { + return ids; + } + + public void setIds(String ids) { + this.ids = ids; + } + + + public String getBank_id() { + return bank_id; + } + + public void setBank_id(String bank_id) { + this.bank_id = bank_id; + } + + + /* + * 开发文档URL[https://u.ebank.cmbchina.com/CmbBank_GenShell/UI/Help/DCBank2/API.aspx?03ZFJS/09NTSTLINF] + * 具体参数说明 点击VO类进行查看 + */ + @SuppressWarnings("unchecked") + public String to_check(JBOTransaction tx) throws Exception { + Map map = new HashMap(); + map.put("code", "0") ; + map.put("msg", "") ; + if(FLOWUNID==null || "".equals(FLOWUNID)) { + map.put("code", "1") ; + map.put("msg", "流程编号不能为空,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + BizObjectManager accountManager = JBOFactory.getBizObjectManager(OWN_ACCOUNT.CLASS_NAME); + BizObjectManager infoManager = JBOFactory.getBizObjectManager(OWN_INFO.CLASS_NAME); + BizObject accountBo = accountManager.createQuery("select * from o where o.id=:id").setParameter("id", bank_id).getSingleResult(false); + if(accountBo==null) { + map.put("code", "1") ; + map.put("msg", "本方账户不存在,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + BizObject infoBo = infoManager.createQuery("select * from o where o.own_number=:own_number").setParameter("own_number", accountBo.getAttribute("own_id").toString()).getSingleResult(false); + if(infoBo==null) { + map.put("code", "1") ; + map.put("msg", "账户信息不存在,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + String LGNNAM = infoBo.getAttribute("OWN_NAME").toString(); + String FUNNAM = "NTSTLINF"; + int DATTYP = 2; + + SDKToCheckVO toCheckVO = new SDKToCheckVO(); + SDKCheckInfoVO checkInfo = new SDKCheckInfoVO(); + checkInfo.setDATTYP(DATTYP); + checkInfo.setFUNNAM(FUNNAM); + checkInfo.setLGNNAM(LGNNAM); + toCheckVO.setINFO(checkInfo); + + BizObjectManager check_list_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_TEMP.CLASS_NAME); + String sql = "select * from o where ( BANK_REQNBR is not null and BANK_REQNBR<>'' ) and FLOWUNID=:FLOWUNID "; + BizObjectQuery check_list_boo = check_list_bom.createQuery(sql); + check_list_boo.setParameter("FLOWUNID", FLOWUNID) ; + List check_list_bo = check_list_boo.getResultList(false); + if(check_list_bo!=null && check_list_bo.size()>0) { + List ntstLinFxList = new ArrayList(); + SDKNtstLinFxVo ntstLinFxOne = null ; + for(BizObject check_list_one : check_list_bo) { + ntstLinFxOne = new SDKNtstLinFxVo(); + String ONE_REQNBR = check_list_one.getAttribute("BANK_REQNBR").toString(); + ntstLinFxOne.setREQNBR(ONE_REQNBR); + ntstLinFxList.add(ntstLinFxOne); + } + toCheckVO.setNtstLinFxList(ntstLinFxList); + XStream xStream = new XMLStream(); + + xStream.alias("NTSTLINFX", SDKNtstLinFxVo.class); + xStream.alias("CMBSDKPGK", SDKToCheckVO.class); + + String xmlStr = xStream.toXML(toCheckVO); + xmlStr = xmlStr.replace("", "").replace("", "").replace("", ""); +// System.out.println(xmlStr); + HttpRequest request = new HttpRequest(); + String data = xmlStr; + SDKCheckCallBackVO result = request.sendCheckRequest(data); + if(result==null) { + map.put("code", "1") ; + map.put("msg", "请求出错") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + if(result.getInfo().getSTATUS()==1) { + + List callback_list = result.getDetails(); + if(callback_list!=null && callback_list.size()>0) { + BizObjectManager callback_detail_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_CALLBACK_DETAIL.CLASS_NAME) ; + tx.join(callback_detail_bom); + BizObjectQuery callback_detail_boo = callback_detail_bom.createQuery("select * from o where REQNBR=:REQNBR and YURREF=:YURREF and FLOWUNID=:FLOWUNID"); + BizObject callback_detail_bo = null ; + for(SDKCheckCallDetail callback_detail : callback_list) { + callback_detail_boo.setParameter("REQNBR",callback_detail.getREQNBR()) ; + callback_detail_boo.setParameter("YURREF",callback_detail.getYURREF()) ; + callback_detail_boo.setParameter("FLOWUNID",FLOWUNID) ; + callback_detail_bo = callback_detail_boo.getSingleResult(true); + + callback_detail_bo.setAttributeValue("REQSTS",callback_detail.getREQSTS()); + callback_detail_bo.setAttributeValue("RTNFLG",callback_detail.getRTNFLG()); + callback_detail_bo.setAttributeValue("RTNNAR",callback_detail.getRTNNAR()); + callback_detail_bo.setAttributeValue("INPUTUSERID","admin"); + this.initTabeUserInfo(callback_detail_bo); + callback_detail_bom.saveObject(callback_detail_bo); + } + map.put("code", "0") ; + map.put("msg", "查询结果刷新成功") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + }else { + map.put("code", "1") ; + map.put("msg", "没有找到相关数据,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + }else { + map.put("code", "1") ; + map.put("msg", result.getInfo().getERRMSG()) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + + }else { + map.put("code", "1") ; + map.put("msg", "暂无支付申请发起数据,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + } + /* + * 开发文档URL[https://u.ebank.cmbchina.com/CmbBank_GenShell/UI/Help/DCBank2/API.aspx] + * 具体参数说明 点击VO类进行查看 + */ + @SuppressWarnings({ "unused", "unchecked" }) + public synchronized String to_pay(JBOTransaction tx) throws Exception { + Map map = new HashMap(); + map.put("code", "0") ; + map.put("msg", "") ; + if(FLOWUNID==null || "".equals(FLOWUNID)) { + map.put("code", "1") ; + map.put("msg", "流程编号不能为空,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + List income_ids = java.util.Arrays.asList(ids.split("@")); + if(income_ids==null || income_ids.size()<=0) { + map.put("code", "1") ; + map.put("msg", "尚未选择数据,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + BizObjectManager accountManager = JBOFactory.getBizObjectManager(OWN_ACCOUNT.CLASS_NAME); + BizObjectManager infoManager = JBOFactory.getBizObjectManager(OWN_INFO.CLASS_NAME); + BizObject accountBo = accountManager.createQuery("select * from o where o.id=:id").setParameter("id", bank_id).getSingleResult(false); + if(accountBo==null) { + map.put("code", "1") ; + map.put("msg", "本方账户不存在,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + BizObject infoBo = infoManager.createQuery("select * from o where o.own_number=:own_number").setParameter("own_number", accountBo.getAttribute("own_id").toString()).getSingleResult(false); + if(infoBo==null) { + map.put("code", "1") ; + map.put("msg", "账户信息不存在,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + String LGNNAM = infoBo.getAttribute("OWN_NAME").toString(); + String FUNNAM = "DCPAYREQ"; + int DATTYP = 2; + String BUSMOD = "00001"; //默认参数 请按照实际情况谨慎修改 + String BUSCOD = "N02030"; //默认参数 请按照实际情况谨慎修改 + String DBTBBK = accountBo.getAttribute("branch_code").toString(); + String DBTACC = accountBo.getAttribute("acc_number").toString(); + String STLCHN = "F"; //默认参数 + String CCYNBR = "10"; //默认参数 + String TRSTYP = "100001"; //默认参数 + String RCVCHK = "1"; //默认参数 + /* + * 获取常用代码并将codeno存为主键 方便下面代码调用 开始 + */ + BizObjectManager code_library = JBOFactory.getBizObjectManager(CODE_LIBRARY.CLASS_NAME); + List bank_code_list = code_library.createQuery("select codeno,itemno,itemname from o where codeno in ('bank_reqsts','bank_rtnflg','FeeType')").getResultList(false); + Map bank_reqsts = new HashMap(); + Map bank_rtnflg = new HashMap(); + Map fee_type = new HashMap(); + + for(BizObject code_bo:bank_code_list) { + String itemno = code_bo.getAttribute("itemno").toString(); + String itemname = code_bo.getAttribute("itemname").toString(); + String codeno = code_bo.getAttribute("codeno").toString(); + if("bank_reqsts".equals(codeno)) { + bank_reqsts.put(itemno, itemname); + }else if("bank_rtnflg".equals(codeno)) { + bank_rtnflg.put(itemno, itemname); + }else { + fee_type.put(itemno, itemname); + } + } + String[] bank_reqsts_array = {"AUT","NTE","WCF","BNK","FIN","ACK","APD","OPR"}; + String[] bank_rtnflg_array = {"S","F","B","R","D","C","M","V","U","T"}; + List bank_reqsts_list = Arrays.asList(bank_reqsts_array); + List bank_rtnflg_list = Arrays.asList(bank_rtnflg_array); + /* + * 获取常用代码并将codeno存为主键 方便下面代码调用 结束 + */ + SDKToPayVO sDKToPayVO = new SDKToPayVO(); + SDKInfoVO sDKInfoVO = new SDKInfoVO(); + SDKPayRqxVO sDKPayRqxVO = new SDKPayRqxVO(); + List sDKDcPayReqxVOList = new ArrayList(); + + sDKInfoVO.setLGNNAM(LGNNAM); + sDKInfoVO.setFUNNAM(FUNNAM); + sDKInfoVO.setDATTYP(DATTYP); + + sDKPayRqxVO.setBUSCOD(BUSCOD); + sDKPayRqxVO.setBUSMOD(BUSMOD); + + BizObjectManager pay_info_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_PAY_INFO.CLASS_NAME); + BizObject pay_info_bo = pay_info_bom.newObject(); + /* + * PAY_ID 为整个付款发起、回调、查询结果 的关联的ID + */ + String PAY_ID = UUID.randomUUID().toString().replaceAll("-", "") ; + + pay_info_bo.setAttributeValue("ID", PAY_ID); + pay_info_bo.setAttributeValue("FLOWUNID", FLOWUNID); + pay_info_bo.setAttributeValue("INFO_FUNNAM", FUNNAM); + pay_info_bo.setAttributeValue("INFO_DATTYP", DATTYP); + pay_info_bo.setAttributeValue("INFO_LGNNAM", LGNNAM); + pay_info_bo.setAttributeValue("SDKPAYRQX_BUSCOD", BUSCOD); + pay_info_bo.setAttributeValue("SDKPAYRQX_BUSMOD", BUSMOD); + this.initTabeUserInfo(pay_info_bo); + + BizObjectManager pay_log_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_PAY_LOG.CLASS_NAME); + BizObject pay_log_bo = pay_log_bom.newObject(); + pay_log_bo.setAttributeValue("ID", UUID.randomUUID().toString().replaceAll("-", "")); + pay_log_bo.setAttributeValue("PAY_ID", PAY_ID); + pay_log_bo.setAttributeValue("FLOWUNID", FLOWUNID); + this.initTabeUserInfo(pay_log_bo); + + List pay_detail_list = null;// 声明 发起详情list + + + BizObjectManager bankBo = JBOFactory.getBizObjectManager(LC_FUND_INCOME_TEMP.CLASS_NAME); + + BizObject infoOne = null ; + + SDKDcPayReqxVO pay_detail = null ; + + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + + BizObjectManager pay_detail_bom = null ; + String error_msg_tips = ""; + String error_null_tips = ""; + int index = 1 ; + if (income_ids != null && income_ids.size() > 0) { + if(income_ids.size() >=30){ + map.put("code", "1") ; + map.put("msg", "单次处理不能超过30条,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + + pay_detail_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_PAY_DETAIL.CLASS_NAME); + BizObject pay_detail_bo = null; + + BizObjectManager call_back_detail_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_CALLBACK_DETAIL.CLASS_NAME); + BizObject call_back_detail_bo = null ; + tx.join(call_back_detail_bom); + + pay_detail_list = new ArrayList(); + for (String income_id : income_ids) { + String date = df.format(new Date()); + pay_detail = new SDKDcPayReqxVO(); + infoOne = bankBo.createQuery("select o.PROJECT_ID,o.FEE_TYPE,o.PAY_TYPE,o.BANK_SQRNBR,o.BANK_PAY_ID,o.BANK_REQNBR,o.FACT_MONEY,o.memo,o.CONTRACT_ID,o.PAYMENT_NUMBER,o.PLAN_LIST,FLOWUNID,contract_info.CONTRACT_NO,distributor.acc_number,distributor.bank_name,distributor.account,distributor.CRTPVC,distributor.CRTCTY from o left join jbo.com.tenwa.lease.comm.LB_CONTRACT_INFO contract_info on o.CONTRACT_ID = contract_info.id left join jbo.app.tenwa.customer.DISTRIBUTOR_ACCOUNT distributor on contract_info.distributor_id = distributor.id and distributor.is_main='Y' where o.id=:id and o.PAY_TYPE = 'pay_type_out' ").setParameter("id", income_id).getSingleResult(false); + if(infoOne==null) { + map.put("code", "1") ; + map.put("msg", "第["+index+"]笔数据不存在,请检查") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + + String PROJECT_ID = infoOne.getAttribute("PROJECT_ID").toString(); + String CONTRACT_ID = infoOne.getAttribute("CONTRACT_ID").toString(); + String PAYMENT_NUMBER = infoOne.getAttribute("PAYMENT_NUMBER").toString(); + String PLAN_LIST = infoOne.getAttribute("PLAN_LIST").toString(); + String FLOWUNID = this.FLOWUNID ; + String FEE_TYPE = infoOne.getAttribute("FEE_TYPE").toString(); + String PAY_TYPE = infoOne.getAttribute("PAY_TYPE").toString(); + String CONTRACT_NO = infoOne.getAttribute("CONTRACT_NO").toString(); + String CRTACC = infoOne.getAttribute("acc_number").toString(); + String BANK_NAME = infoOne.getAttribute("bank_name").toString(); + String CRTNAM = infoOne.getAttribute("account").toString(); + String CRTPVC = infoOne.getAttribute("CRTPVC").toString(); + String CRTCTY = infoOne.getAttribute("CRTCTY").toString(); + String NUSAGE = infoOne.getAttribute("memo").toString(); + String BANK_YURREF = infoOne.getAttribute("BANK_YURREF").toString(); + String BANK_SQRNBR = infoOne.getAttribute("BANK_SQRNBR").toString(); + String BANK_PAY_ID = infoOne.getAttribute("BANK_PAY_ID").toString(); + String BANK_REQNBR = infoOne.getAttribute("BANK_REQNBR").toString(); + /* + * 检查 当前付款信息 是否存在 开始 + */ + if(BANK_PAY_ID!=null && BANK_PAY_ID!="" && !"".equals(BANK_PAY_ID)) { + String temp_sql = "select * from o where CONTRACT_ID=:CONTRACT_ID and PAYMENT_NUMBER=:PAYMENT_NUMBER and PLAN_LIST=:PLAN_LIST and FLOWUNID=:FLOWUNID and PAY_TYPE=:PAY_TYPE and FEE_TYPE =:FEE_TYPE " ; + if(BANK_YURREF!=null && BANK_YURREF!="" && !"".equals(BANK_YURREF)) + temp_sql = temp_sql + " and YURREF=:BANK_YURREF"; + if(BANK_SQRNBR!=null && BANK_SQRNBR!="" && !"".equals(BANK_SQRNBR)) + temp_sql = temp_sql + " and SQRNBR=:BANK_SQRNBR"; + if(BANK_PAY_ID!=null && BANK_PAY_ID!="" && !"".equals(BANK_PAY_ID)) + temp_sql = temp_sql + " and PAY_ID=:BANK_PAY_ID"; + if(BANK_REQNBR!=null && BANK_REQNBR!="" && !"".equals(BANK_REQNBR)) + temp_sql = temp_sql + " and REQNBR=:BANK_REQNBR"; + + BizObjectQuery call_back_detail_boo= call_back_detail_bom.createQuery(temp_sql); + call_back_detail_boo.setParameter("CONTRACT_ID",CONTRACT_ID) ; + call_back_detail_boo.setParameter("PAYMENT_NUMBER",PAYMENT_NUMBER) ; + call_back_detail_boo.setParameter("PLAN_LIST",PLAN_LIST) ; + call_back_detail_boo.setParameter("FLOWUNID",FLOWUNID) ; + call_back_detail_boo.setParameter("PAY_TYPE",PAY_TYPE) ; + call_back_detail_boo.setParameter("FEE_TYPE",FEE_TYPE) ; + + if(BANK_YURREF!=null && BANK_YURREF!="" && !"".equals(BANK_YURREF)) + call_back_detail_boo.setParameter("BANK_YURREF",BANK_YURREF) ; + if(BANK_SQRNBR!=null && BANK_SQRNBR!="" && !"".equals(BANK_SQRNBR)) + call_back_detail_boo.setParameter("BANK_SQRNBR",BANK_SQRNBR) ; + if(BANK_PAY_ID!=null && BANK_PAY_ID!="" && !"".equals(BANK_PAY_ID)) + call_back_detail_boo.setParameter("BANK_PAY_ID",BANK_PAY_ID) ; + if(BANK_REQNBR!=null && BANK_REQNBR!="" && !"".equals(BANK_REQNBR)) + call_back_detail_boo.setParameter("BANK_REQNBR",BANK_REQNBR) ; + call_back_detail_bo = call_back_detail_boo.getSingleResult(false) ; + if(call_back_detail_bo!=null) { + String CALL_BACK_DETAIL_REQSTS = call_back_detail_bo.getAttribute("REQSTS").toString(); + String CALL_BACK_DETAIL_RTNFLG = call_back_detail_bo.getAttribute("RTNFLG").toString(); + if(bank_reqsts_list.contains(CALL_BACK_DETAIL_REQSTS)) { + error_msg_tips = error_msg_tips + "第["+index+"]笔付款申请失败[请求状态:"+bank_reqsts.get(CALL_BACK_DETAIL_REQSTS)+"]" ; + if(CALL_BACK_DETAIL_RTNFLG!="" && CALL_BACK_DETAIL_RTNFLG!=null && !"".equals(CALL_BACK_DETAIL_RTNFLG)) { + error_msg_tips = error_msg_tips+"[处理结果:"+bank_rtnflg.get(CALL_BACK_DETAIL_RTNFLG)+"]"; + } + error_msg_tips = error_msg_tips+",请检查\n"; + } + } + } + + + /* + * 检查 当前付款信息 是否存在 结束 + */ + BigDecimal FACT_MONEY = new BigDecimal( infoOne.getAttribute("FACT_MONEY").toString()); + int check=FACT_MONEY.compareTo(BigDecimal.ZERO); + + if( CONTRACT_NO==null || "".equals( CONTRACT_NO ) + || CRTACC==null || "".equals( CRTACC ) + || BANK_NAME==null || "".equals( BANK_NAME ) + || PAY_TYPE==null || "".equals( PAY_TYPE ) + || FEE_TYPE==null || "".equals( FEE_TYPE ) + || CRTNAM==null || "".equals( CRTNAM ) + || CRTPVC==null || "".equals( CRTPVC ) + || CRTCTY==null || "".equals( CRTCTY ) + || CRTPVC==null || "".equals( CRTPVC ) + || check==-1 + || CRTPVC==null || "".equals( CRTPVC ) + ){ + error_msg_tips = error_msg_tips+ "第["+index+"]笔相关数据不存在,请检查\n" ; + } + String TRSAMT = FACT_MONEY.toPlainString(); + + String YURREF = index + date+UUID.randomUUID().toString().replaceAll("-", "").substring(0, 10) ; + String BNKFLG = checkCMB(BANK_NAME); + NUSAGE = fee_type.get(FEE_TYPE); + String BUSNAR = "[项目编号:"+PROJECT_ID+"][合同号:"+CONTRACT_ID+"][计划期次:"+PLAN_LIST+"][投放编号:"+PAYMENT_NUMBER+"][费用类型:"+NUSAGE+"]"; + pay_detail.setYURREF(YURREF); + pay_detail.setDBTACC(DBTACC); + pay_detail.setDBTBBK(DBTBBK); + pay_detail.setTRSAMT(TRSAMT); + pay_detail.setCCYNBR(CCYNBR); + pay_detail.setSTLCHN(STLCHN); + pay_detail.setNUSAGE(NUSAGE); + pay_detail.setBUSNAR(BUSNAR); + pay_detail.setCRTACC(CRTACC); + pay_detail.setCRTNAM(CRTNAM); + pay_detail.setBNKFLG(BNKFLG); + pay_detail.setTRSTYP(TRSTYP); + pay_detail.setRCVCHK(RCVCHK); + pay_detail.setCRTPVC(CRTPVC); + pay_detail.setCRTCTY(CRTCTY); + + sDKDcPayReqxVOList.add(pay_detail); + + + pay_detail_bo = pay_detail_bom.newObject(); + + pay_detail_bo.setAttributeValue("ID", UUID.randomUUID().toString().replaceAll("-", "")); + pay_detail_bo.setAttributeValue("PAY_ID", PAY_ID); + pay_detail_bo.setAttributeValue("CONTRACT_ID", CONTRACT_ID); + pay_detail_bo.setAttributeValue("PAYMENT_NUMBER", PAYMENT_NUMBER); + pay_detail_bo.setAttributeValue("PLAN_LIST", PLAN_LIST); + pay_detail_bo.setAttributeValue("FLOWUNID", FLOWUNID); + pay_detail_bo.setAttributeValue("PAY_TYPE", PAY_TYPE); + pay_detail_bo.setAttributeValue("FEE_TYPE", FEE_TYPE); + pay_detail_bo.setAttributeValue("YURREF", YURREF); + pay_detail_bo.setAttributeValue("DBTACC", DBTACC); + pay_detail_bo.setAttributeValue("DBTBBK", DBTBBK); + pay_detail_bo.setAttributeValue("TRSAMT", TRSAMT); + pay_detail_bo.setAttributeValue("CCYNBR", CCYNBR); + pay_detail_bo.setAttributeValue("STLCHN", STLCHN); + pay_detail_bo.setAttributeValue("NUSAGE", NUSAGE); + pay_detail_bo.setAttributeValue("CRTACC", CRTACC); + pay_detail_bo.setAttributeValue("CRTNAM", CRTNAM); + pay_detail_bo.setAttributeValue("BNKFLG", BNKFLG); + pay_detail_bo.setAttributeValue("TRSTYP", TRSTYP); + pay_detail_bo.setAttributeValue("RCVCHK", RCVCHK); + pay_detail_bo.setAttributeValue("CRTPVC", CRTPVC); + pay_detail_bo.setAttributeValue("CRTCTY", CRTCTY); + this.initTabeUserInfo(pay_detail_bo); + + pay_detail_list.add(pay_detail_bo); + + ++index; + + } + } + if(!"".equals(error_msg_tips)) { + map.put("code", "1") ; + map.put("msg", error_msg_tips) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + + if(!"".equals(error_null_tips)) { + map.put("code", "1") ; + map.put("msg", error_null_tips) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + + sDKToPayVO.setINFO(sDKInfoVO); + sDKToPayVO.setSDKPAYRQX(sDKPayRqxVO); + if(sDKDcPayReqxVOList!=null && sDKDcPayReqxVOList.size()>0) { + sDKToPayVO.setDcPayReqxList(sDKDcPayReqxVOList); + } + + + XStream xStream = new XMLStream(); + + xStream.alias("DCPAYREQX", SDKDcPayReqxVO.class); + xStream.alias("CMBSDKPGK", SDKToPayVO.class); + + String xmlStr = xStream.toXML(sDKToPayVO); + xmlStr = xmlStr.replace("", "").replace("", "").replace("", ""); + pay_log_bo.setAttributeValue("XML",xmlStr); + /* + * 发起数据入库 开始 + */ + tx.join(pay_info_bom); + tx.join(pay_log_bom); + + pay_info_bom.saveObject(pay_info_bo); + pay_log_bom.saveObject(pay_log_bo); + + + + if(pay_detail_bom!=null) { + BizObjectManager income_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_TEMP.CLASS_NAME); + BizObject income_bo = null ; + + tx.join(pay_detail_bom); + tx.join(income_bom); + + if(pay_detail_list!=null && pay_detail_list.size()>0) + for (BizObject pay_detail_one : pay_detail_list) { + BizObjectQuery income_boo= income_bom.createQuery("select * from o where CONTRACT_ID=:CONTRACT_ID and PAYMENT_NUMBER=:PAYMENT_NUMBER and PLAN_LIST=:PLAN_LIST and FLOWUNID=:FLOWUNID and PAY_TYPE=:PAY_TYPE and FEE_TYPE=:FEE_TYPE "); + income_boo.setParameter("CONTRACT_ID",pay_detail_one.getAttribute("CONTRACT_ID").toString()) ; + income_boo.setParameter("PAYMENT_NUMBER",pay_detail_one.getAttribute("PAYMENT_NUMBER").toString()) ; + income_boo.setParameter("PLAN_LIST",pay_detail_one.getAttribute("PLAN_LIST").toString()) ; + income_boo.setParameter("FLOWUNID",pay_detail_one.getAttribute("FLOWUNID").toString()) ; + income_boo.setParameter("PAY_TYPE",pay_detail_one.getAttribute("PAY_TYPE").toString()) ; + income_boo.setParameter("FEE_TYPE",pay_detail_one.getAttribute("FEE_TYPE").toString()) ; + income_bo = income_boo.getSingleResult(true) ; + income_bo.setAttributeValue("BANK_PAY_ID",pay_detail_one.getAttribute("PAY_ID").toString()); + income_bo.setAttributeValue("BANK_YURREF",pay_detail_one.getAttribute("YURREF").toString()); + income_bo.setAttributeValue("BANK_ID",bank_id); + this.initTabeUserInfo(income_bo); + income_bom.saveObject(income_bo); + pay_detail_bom.saveObject(pay_detail_one); + } + } + /* + * 发起数据入库 结束 + */ + + try { +// System.out.println(xmlStr); //控制台打印请求的XML数据 + //HttpRequest request = new HttpRequest("http://192.168.1.110:65188"); + HttpRequest request = new HttpRequest(); + String data = xmlStr; + SDKPayCallBackVO result = request.sendPayRequest(data); + if(result==null) { + map.put("code", "1") ; + map.put("msg", "请求出错") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + BizObjectManager callback_info_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_CALLBACK_INFO.CLASS_NAME) ; + BizObjectManager callback_detail_bom = null; + BizObjectManager callback_log_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_CALLBACK_LOG.CLASS_NAME) ; + + BizObject callback_info_bo = callback_info_bom.newObject(); + BizObject callback_detail_bo = null; + BizObject callback_log_bo = callback_log_bom.newObject(); + + tx.join(callback_info_bom); + callback_info_bo.setAttributeValue("ID", UUID.randomUUID().toString().replaceAll("-", "")); + callback_info_bo.setAttributeValue("PAY_ID",PAY_ID); + callback_info_bo.setAttributeValue("FLOWUNID",FLOWUNID); + callback_info_bo.setAttributeValue("INFO_FUNNAM",FUNNAM); + callback_info_bo.setAttributeValue("INFO_DATTYP",DATTYP); + callback_info_bo.setAttributeValue("INFO_RETCOD",result.getInfo().getRETCOD()); + callback_info_bo.setAttributeValue("INFO_ERRMSG",result.getInfo().getERRMSG()); + this.initTabeUserInfo(callback_info_bo); + callback_info_bom.saveObject(callback_info_bo); + + tx.join(callback_log_bom); + callback_log_bo.setAttributeValue("ID", UUID.randomUUID().toString().replaceAll("-", "")); + callback_log_bo.setAttributeValue("PAY_ID",PAY_ID); + callback_log_bo.setAttributeValue("FLOWUNID",FLOWUNID); + callback_log_bo.setAttributeValue("XML",result.getInfo().getXML()); + this.initTabeUserInfo(callback_log_bo); + callback_log_bom.saveObject(callback_log_bo); + + + if(result.getInfo().getSTATUS()==1) { + if("0".equals( result.getInfo().getRETCOD() )) { + + + + + List details = result.getDetails() ; + String error_info = ""; + if(details!=null && details.size()>0) { + callback_detail_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_CALLBACK_DETAIL.CLASS_NAME) ; + tx.join(callback_detail_bom); + int call_index = 1 ; + for (SDKPayCallDetail detail : details) { + if (detail.getREQSTS().equals("FIN") && detail.getRTNFLG().equals("F")) { + error_info= error_info+"\n"+ "第["+call_index+"]笔数据 "+detail.getERRTXT() ; + } + callback_detail_bo = callback_detail_bom.newObject(); + String DETAIL_YURREF = detail.getYURREF() ; + callback_detail_bo.setAttributeValue("ID", UUID.randomUUID().toString().replaceAll("-", "")); + callback_detail_bo.setAttributeValue("PAY_ID",PAY_ID); + callback_detail_bo.setAttributeValue("YURREF",DETAIL_YURREF); + callback_detail_bo.setAttributeValue("SQRNBR",detail.getSQRNBR()); + callback_detail_bo.setAttributeValue("REQNBR",detail.getREQNBR()); + callback_detail_bo.setAttributeValue("REQSTS",detail.getREQSTS()); + callback_detail_bo.setAttributeValue("RTNFLG",detail.getRTNFLG()); + callback_detail_bo.setAttributeValue("OPRSQN",detail.getOPRSQN()); + callback_detail_bo.setAttributeValue("OPRALS",detail.getOPRALS()); + callback_detail_bo.setAttributeValue("ERRCOD",detail.getERRCOD()); + callback_detail_bo.setAttributeValue("ERRTXT",detail.getERRTXT()); + this.initTabeUserInfo(callback_detail_bo); + if(pay_detail_list!=null && pay_detail_list.size()>0) { + BizObjectManager income_bom = JBOFactory.getBizObjectManager(LC_FUND_INCOME_TEMP.CLASS_NAME); + BizObject income_bo = null ; + tx.join(income_bom); + BizObjectQuery income_boo= income_bom.createQuery("select * from o where CONTRACT_ID=:CONTRACT_ID and PAYMENT_NUMBER=:PAYMENT_NUMBER and PLAN_LIST=:PLAN_LIST and FLOWUNID=:FLOWUNID and PAY_TYPE=:PAY_TYPE and FEE_TYPE=:FEE_TYPE "); + for (BizObject pay_detail_one : pay_detail_list) { + if(DETAIL_YURREF.equals( pay_detail_one.getAttribute("YURREF").toString() )) { + + income_boo.setParameter("CONTRACT_ID",pay_detail_one.getAttribute("CONTRACT_ID").toString()) ; + income_boo.setParameter("PAYMENT_NUMBER",pay_detail_one.getAttribute("PAYMENT_NUMBER").toString()) ; + income_boo.setParameter("PLAN_LIST",pay_detail_one.getAttribute("PLAN_LIST").toString()) ; + income_boo.setParameter("FLOWUNID",pay_detail_one.getAttribute("FLOWUNID").toString()) ; + income_boo.setParameter("PAY_TYPE",pay_detail_one.getAttribute("PAY_TYPE").toString()) ; + income_boo.setParameter("FEE_TYPE",pay_detail_one.getAttribute("FEE_TYPE").toString()) ; + income_bo = income_boo.getSingleResult(true) ; + income_bo.setAttributeValue("BANK_SQRNBR",detail.getSQRNBR()); + income_bo.setAttributeValue("BANK_REQNBR",detail.getREQNBR()); + this.initTabeUserInfo(income_bo); + income_bom.saveObject(income_bo); + + callback_detail_bo.setAttributeValue("CONTRACT_ID",pay_detail_one.getAttribute("CONTRACT_ID").toString()); + callback_detail_bo.setAttributeValue("PAYMENT_NUMBER",pay_detail_one.getAttribute("PAYMENT_NUMBER").toString()); + callback_detail_bo.setAttributeValue("PLAN_LIST",pay_detail_one.getAttribute("PLAN_LIST").toString()); + callback_detail_bo.setAttributeValue("FLOWUNID",pay_detail_one.getAttribute("FLOWUNID").toString()); + callback_detail_bo.setAttributeValue("PAY_TYPE",pay_detail_one.getAttribute("PAY_TYPE").toString()); + callback_detail_bo.setAttributeValue("FEE_TYPE",pay_detail_one.getAttribute("FEE_TYPE").toString()); + } + } + } + callback_detail_bom.saveObject(callback_detail_bo); + ++call_index; + } + } + + if(error_info==""){ + map.put("code", "0") ; + map.put("msg", "受理成功,请耐心等待审核") ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + }else { + map.put("code", "2") ; + map.put("msg", "部分发起申请失败,请检查"+error_info) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + }else { + map.put("code", "1") ; + map.put("msg", result.getInfo().getERRMSG()) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + }else { + map.put("code", "1") ; + map.put("msg", result.getInfo().getERRMSG()) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + } catch (Exception e) { + map.put("code", "1") ; + map.put("msg", e.getMessage()) ; + JSONObject jsonObj = JSONObject.fromObject(map); + return jsonObj.toString(); + } + } + + private String checkCMB(String str) { + if (str.indexOf("招行") != -1 || str.indexOf("招商银行") != -1) { + return "Y"; + } else { + return "N"; + } + } +} diff --git a/src_cmb/com/tenwa/sdk/utils/HttpRequest.java b/src_cmb/com/tenwa/sdk/utils/HttpRequest.java new file mode 100644 index 000000000..59fd23df2 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/utils/HttpRequest.java @@ -0,0 +1,333 @@ +package com.tenwa.sdk.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.ProtocolException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import com.tenwa.sdk.VO.SDKCheckCallBackVO; +import com.tenwa.sdk.VO.SDKCheckCallDetail; +import com.tenwa.sdk.VO.SDKCheckCallInfoVO; +import com.tenwa.sdk.VO.SDKPayCallBackVO; +import com.tenwa.sdk.VO.SDKPayCallDetail; +import com.tenwa.sdk.VO.SDKPayCallInfoVO; + +public class HttpRequest { + + private String ipAddr = "http://192.168.7.85:65188"; // 测试地址。。。 + private int timeout = 30 * 1000; + public String getIpAddr() { + return ipAddr; + } + + public void setIpAddr(String ipAddr) { + this.ipAddr = ipAddr; + } + + public int getTimeout() { + return timeout; + } + + public void setTimeout(int timeout) { + this.timeout = timeout; + } + + public HttpRequest(String ipAddr) { + this.ipAddr = ipAddr; + } + + public HttpRequest() { + } + + public SDKPayCallBackVO sendPayRequest(String data) { + SDKPayCallBackVO callBack = new SDKPayCallBackVO(); + SDKPayCallInfoVO info = new SDKPayCallInfoVO(); + String result = ""; + try { + URL url = new URL(this.ipAddr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(this.timeout); + connection.setReadTimeout(this.timeout); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Accept", "application/xml"); + connection.setRequestProperty("Content-Type", "application/xml"); + connection.connect(); + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "GBK"); + out.append(data); + out.flush(); + out.close(); + + int code = connection.getResponseCode(); + InputStream is = null; + if (code == 200) { + is = connection.getInputStream(); + } else { + is = connection.getErrorStream(); + } + + int length = (int) connection.getContentLength(); + if (length != -1) { + byte[] datas = new byte[length]; + byte[] temp = new byte[512]; + int readLen = 0; + int destPos = 0; + while ((readLen = is.read(temp)) > 0) { + System.arraycopy(temp, 0, datas, destPos, readLen); + destPos += readLen; + } + result = new String(datas, "GBK"); + } + is.close(); +// System.out.println("----"); +// System.out.println(result); +// System.out.println("----"); + } catch (MalformedURLException e) { + info.setSTATUS(-1); + info.setERRMSG("URL协议、格式或者路径错误"); + } catch (UnsupportedEncodingException e) { + info.setSTATUS(-1); + info.setERRMSG("字符编码有问题"); + } catch (ProtocolException e) { + info.setSTATUS(-1); + info.setERRMSG("协议异常"); + } catch (IOException e) { + info.setSTATUS(-1); + info.setERRMSG("响应超时"); + } + + if (info.getSTATUS() != -1) { + info.setSTATUS(1); + info.setXML(result); + } + callBack.setInfo(info); + return toPayObj(callBack); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private SDKPayCallBackVO toPayObj(SDKPayCallBackVO vo) { + if (vo.getInfo().getSTATUS() != -1) { + SDKPayCallInfoVO info = vo.getInfo(); + String result = vo.getInfo().getXML(); + if (result != null && result.length() > 0) { + XmlPacket pktRsp = XmlPacket.valueOf(result); + if (pktRsp != null) { + String sRetCod = pktRsp.getRETCOD(); + String sFunnam = pktRsp.getFUNNAM(); + String sDattpy = pktRsp.getDATTYP(); + String sErrmsg = pktRsp.getERRMSG(); + + info.setRETCOD(sRetCod); + info.setFUNNAM(sFunnam); + info.setDATTYP(sDattpy); + Vector vec = null ; + if (sRetCod.equals("0")) { + vec = pktRsp.getProperty("NTQPAYRQZ"); + if(vec!=null && vec.size()>0) { + List details = new ArrayList(); + + for (Map propPayResult : vec) { + SDKPayCallDetail detail_one = new SDKPayCallDetail(); + String REQSTS = (String) propPayResult.get("REQSTS"); + String RTNFLG = (String) propPayResult.get("RTNFLG"); + String SQRNBR = (String) propPayResult.get("SQRNBR"); + String YURREF = (String) propPayResult.get("YURREF"); + String REQNBR = (String) propPayResult.get("REQNBR"); + String OPRSQN = (String) propPayResult.get("OPRSQN"); + String OPRALS = (String) propPayResult.get("OPRALS"); + String ERRCOD = (String) propPayResult.get("ERRCOD"); + String ERRTXT = (String) propPayResult.get("ERRTXT"); + + detail_one.setERRCOD(ERRCOD); + detail_one.setERRTXT(ERRTXT); + detail_one.setOPRALS(OPRALS); + detail_one.setOPRSQN(OPRSQN); + detail_one.setREQNBR(REQNBR); + detail_one.setREQSTS(REQSTS); + detail_one.setRTNFLG(RTNFLG); + detail_one.setSQRNBR(SQRNBR); + detail_one.setYURREF(YURREF); + + if (REQSTS.equals("FIN") && RTNFLG.equals("F")) { + detail_one.setERRTXT("支付失败:" + ERRTXT); + } else { + detail_one.setERRTXT("支付已被银行受理(支付状态:" + REQSTS + ")"); + } + details.add(detail_one); + } + vo.setDetails(details); + } + } else if (sRetCod.equals("-9")) { + info.setERRMSG("支付未知异常,请查询支付结果确认支付状态,错误信息:" + sErrmsg); + } else { + info.setERRMSG("支付失败:" + sErrmsg); + } + } else { + info.setERRMSG("响应报文解析失败"); + } + } + vo.setInfo(info); + } + return vo; + } + + public SDKCheckCallBackVO sendCheckRequest(String data) { + SDKCheckCallBackVO callBack = new SDKCheckCallBackVO(); + SDKCheckCallInfoVO info = new SDKCheckCallInfoVO(); + String result = ""; + try { + URL url = new URL(this.ipAddr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(this.timeout); + connection.setReadTimeout(this.timeout); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setUseCaches(false); + connection.setInstanceFollowRedirects(true); + connection.setRequestMethod("POST"); + connection.setRequestProperty("Accept", "application/xml"); + connection.setRequestProperty("Content-Type", "application/xml"); + connection.connect(); + OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(), "GBK"); + out.append(data); + out.flush(); + out.close(); + + int code = connection.getResponseCode(); + InputStream is = null; + if (code == 200) { + is = connection.getInputStream(); + } else { + is = connection.getErrorStream(); + } + + int length = (int) connection.getContentLength(); + if (length != -1) { + byte[] datas = new byte[length]; + byte[] temp = new byte[512]; + int readLen = 0; + int destPos = 0; + while ((readLen = is.read(temp)) > 0) { + System.arraycopy(temp, 0, datas, destPos, readLen); + destPos += readLen; + } + result = new String(datas, "GBK"); + } + is.close(); + System.out.println("----"); + System.out.println(result); + System.out.println("----"); + } catch (MalformedURLException e) { + info.setSTATUS(-1); + info.setERRMSG("URL协议、格式或者路径错误"); + } catch (UnsupportedEncodingException e) { + info.setSTATUS(-1); + info.setERRMSG("字符编码有问题"); + } catch (ProtocolException e) { + info.setSTATUS(-1); + info.setERRMSG("协议异常"); + } catch (IOException e) { + info.setSTATUS(-1); + info.setERRMSG("响应超时"); + } + + if (info.getSTATUS() != -1) { + info.setSTATUS(1); + info.setXML(result); + } + callBack.setInfo(info); + return toCheckObj(callBack); + } + + + + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private SDKCheckCallBackVO toCheckObj(SDKCheckCallBackVO vo) { + if (vo.getInfo().getSTATUS() != -1) { + SDKCheckCallInfoVO info = vo.getInfo(); + String result = vo.getInfo().getXML(); + if (result != null && result.length() > 0) { + XmlPacket pktRsp = XmlPacket.valueOf(result); + if (pktRsp != null) { + String sRetCod = pktRsp.getRETCOD(); + String sFunnam = pktRsp.getFUNNAM(); + String sDattpy = pktRsp.getDATTYP(); + String sErrmsg = pktRsp.getERRMSG(); + + info.setRETCOD(sRetCod); + info.setFUNNAM(sFunnam); + info.setDATTYP(sDattpy); + Vector vec = null ; + if (sRetCod.equals("0")) { + vec = pktRsp.getProperty("NTQPAYQYZ"); + if(vec!=null && vec.size()>0) { + List details = new ArrayList(); + + for (Map propPayResult : vec) { + SDKCheckCallDetail detail_one = new SDKCheckCallDetail(); + String BUSCOD = (String) propPayResult.get("BUSCOD"); + String BUSMOD = (String) propPayResult.get("BUSMOD"); + String DBTBBK = (String) propPayResult.get("DBTBBK"); + String DBTACC = (String) propPayResult.get("DBTACC"); + String DBTNAM = (String) propPayResult.get("DBTNAM"); + String DBTBNK = (String) propPayResult.get("DBTBNK"); + String CRTACC = (String) propPayResult.get("CRTACC"); + String CRTNAM = (String) propPayResult.get("CRTNAM"); + String CCYNBR = (String) propPayResult.get("CCYNBR"); + String TRSAMT = (String) propPayResult.get("TRSAMT"); + String YURREF = (String) propPayResult.get("YURREF"); + String REQNBR = (String) propPayResult.get("REQNBR"); + String REQSTS = (String) propPayResult.get("REQSTS"); + String RTNFLG = (String) propPayResult.get("RTNFLG"); + String RTNNAR = (String) propPayResult.get("RTNNAR"); + + detail_one.setBUSCOD(BUSCOD); + detail_one.setBUSMOD(BUSMOD); + detail_one.setDBTBBK(DBTBBK); + detail_one.setDBTACC(DBTACC); + detail_one.setDBTNAM(DBTNAM); + detail_one.setDBTBNK(DBTBNK); + detail_one.setCRTACC(CRTACC); + detail_one.setCRTNAM(CRTNAM); + detail_one.setCCYNBR(CCYNBR); + detail_one.setTRSAMT(TRSAMT); + detail_one.setYURREF(YURREF); + detail_one.setREQNBR(REQNBR); + detail_one.setYURREF(YURREF); + detail_one.setREQSTS(REQSTS); + detail_one.setRTNFLG(RTNFLG); + detail_one.setRTNNAR(RTNNAR); + + details.add(detail_one); + } + vo.setDetails(details); + } + } else if (sRetCod.equals("-9")) { + info.setERRMSG("支付未知异常,请查询支付结果确认支付状态,错误信息:" + sErrmsg); + } else { + info.setERRMSG("支付失败:" + sErrmsg); + } + } else { + info.setERRMSG("响应报文解析失败"); + } + } + vo.setInfo(info); + } + return vo; + } + + + +} \ No newline at end of file diff --git a/src_cmb/com/tenwa/sdk/utils/SaxHandler.java b/src_cmb/com/tenwa/sdk/utils/SaxHandler.java new file mode 100644 index 000000000..0b301349b --- /dev/null +++ b/src_cmb/com/tenwa/sdk/utils/SaxHandler.java @@ -0,0 +1,83 @@ +package com.tenwa.sdk.utils; + + + +import java.util.Map; +import java.util.Properties; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + + +/** + * + * 招行XML报文解析类 + * + */ +@SuppressWarnings("rawtypes") +public class SaxHandler extends DefaultHandler { + int layer=0; + String curSectionName; + String curKey; + String curValue; + XmlPacket pktData; + Map mpRecord; + + public SaxHandler(XmlPacket data){ + curSectionName = ""; + curKey = ""; + curValue = ""; + pktData = data; + mpRecord = new Properties(); + } + + public void startElement(String uri, String localName, String qName, + Attributes attributes) throws SAXException { + layer++; + if(layer==2){ + curSectionName = qName; + }else if(layer==3){ + curKey = qName; + } + } + + @SuppressWarnings("unchecked") + public void endElement(String uri, String localName, String qName) + throws SAXException { + if(layer==2){ + pktData.putProperty(curSectionName, mpRecord); + mpRecord = new Properties(); + }else if(layer==3){ + mpRecord.put(curKey, curValue); + if(curSectionName.equals("INFO")){ + if(curKey.equals("FUNNAM")){ + pktData.setFUNNAM(curValue); + }else if(curKey.equals("LGNNAM")){ + pktData.setLGNNAM(curValue); + }else if(curKey.equals("RETCOD")){ + pktData.setRETCOD(curValue); + }else if(curKey.equals("ERRMSG")){ + pktData.setERRMSG(curValue); + }else if(curKey.equals("DATTYP")){ + pktData.setDATTYP(curValue); + } + } + } + curValue = ""; + layer--; + } + + @SuppressWarnings("unlikely-arg-type") + public void characters(char[] ch, int start, int length) + throws SAXException { + if(layer==3){ + String value = new String(ch, start, length); + if(ch.equals("\n")){ + curValue += "\r\n"; + }else{ + curValue += value; + } + } + } +} diff --git a/src_cmb/com/tenwa/sdk/utils/XMLStream.java b/src_cmb/com/tenwa/sdk/utils/XMLStream.java new file mode 100644 index 000000000..b7f0acaa3 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/utils/XMLStream.java @@ -0,0 +1,57 @@ +package com.tenwa.sdk.utils; + + +import java.io.OutputStream; +import java.io.Writer; + +import com.thoughtworks.xstream.XStream; + +public class XMLStream extends XStream { + + // XML的声明 + public String getDeclaration() { + return "\n"; + } + + @Override + public void toXML(Object obj, OutputStream output) { + try { + String dec = this.getDeclaration(); + byte[] bytesOfDec = dec.getBytes("UTF-8"); + output.write(bytesOfDec); + } catch (Exception e) { + throw new RuntimeException("error", e); + } + super.toXML(obj, output); + } + + @Override + public void toXML(Object obj, Writer writer) { + try { + writer.write(getDeclaration()); + } catch (Exception e) { + throw new RuntimeException("error", e); + } + super.toXML(obj, writer); + } +// @Override +// protected MapperWrapper wrapMapper(MapperWrapper next) { +// return new MapperWrapper(next) { +// @Override +// public boolean shouldSerializeMember(@SuppressWarnings("rawtypes") Class definedIn, String fieldName) { +// // 不能识别的节点,掠过。 +// if (definedIn == Object.class) { +// return false; +// } +// // 节点名称为fileName的掠过 +// if (fieldName.equals("dcPayReqxList")) { +// return false; +// } +// return super.shouldSerializeMember(definedIn, fieldName); +// } +// }; +// } + + + +} diff --git a/src_cmb/com/tenwa/sdk/utils/XmlPacket.java b/src_cmb/com/tenwa/sdk/utils/XmlPacket.java new file mode 100644 index 000000000..145cab721 --- /dev/null +++ b/src_cmb/com/tenwa/sdk/utils/XmlPacket.java @@ -0,0 +1,107 @@ +package com.tenwa.sdk.utils; + + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; +import java.util.Vector; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.xml.sax.SAXException; + +import lombok.Data; +@SuppressWarnings("rawtypes") +@Data +public class XmlPacket{ + protected String RETCOD; + protected String ERRMSG; + protected String FUNNAM; + protected String LGNNAM; + protected String DATTYP; + protected Map data; // + + public XmlPacket(){ + data = new Properties(); + } + + public boolean isError(){ + if(RETCOD.equals("0")){ + return false; + }else{ + return true; + } + } + @SuppressWarnings("unchecked") + public void putProperty(String sSectionName, Map mpData){ + if(data.containsKey(sSectionName)){ + Vector vt = (Vector)data.get(sSectionName); + vt.add(mpData); + }else{ + Vector vt = new Vector(); + vt.add(mpData); + data.put(sSectionName, vt); + } + } + + /** + * 取得指定接口的数据记录 + * @param sSectionName + * @param index 索引,从0开始 + * @return Map + */ + public Map getProperty(String sSectionName, int index){ + if(data.containsKey(sSectionName)){ + return (Map)((Vector)data.get(sSectionName)).get(index); + }else{ + return null; + } + } + + public Vector getProperty(String sSectionName){ + if(data.containsKey(sSectionName)){ + return ((Vector)data.get(sSectionName)); + }else{ + return null; + } + } + + /** + * 取得制定接口数据记录数 + * @param sSectionName + * @return + */ + + public int getSectionSize(String sSectionName){ + if(data.containsKey(sSectionName)){ + Vector sec = (Vector)data.get(sSectionName); + return sec.size(); + } + return 0; + } + /** + * 解析xml字符串,并转换为报文对象 + * @param message + */ + public static XmlPacket valueOf(String message) { + SAXParserFactory saxfac = SAXParserFactory.newInstance(); + try { + SAXParser saxparser = saxfac.newSAXParser(); + ByteArrayInputStream is = new ByteArrayInputStream(message.getBytes("GBK")); + XmlPacket xmlPkt= new XmlPacket(); + saxparser.parse(is, new SaxHandler(xmlPkt)); + is.close(); + return xmlPkt; + } catch (ParserConfigurationException e) { + e.printStackTrace(); + } catch (SAXException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} \ No newline at end of file