第一次写博客,写得不好请见谅!
公司本来有个旧项目是用PHP3.1开发的,结果现在增加了一个需求。项目要求:客户通过银行APP自助转账来入金到平台,平台则通过非NC方式对接工行接口出金。本来应该是没有我这边的事的,谁知最后开发的时候,工行的项目经理反馈说现在非NC模式不支持太老版本的PHP了(也可能是没找到文档???),建议使用JAVA做个中间件,中间件接收工行的XML报文,再通过接口的方式返回json给PHP,接口是尽量的简化了参数,毕竟大部分参数用不到。
对接工行接口:(不要问我为什么加高级,问就是工行文档)
高级鉴权指令提交(交易代码:AUTHCK);
高级鉴权指令查询(交易代码:QAUTHCK);
支付指令提交(交易代码:PAYENT);
支付指令查询(交易代码:QPAYENT);
高级明细查询(交易代码:QHISD);
高级新多账户余额查询(交易代码:QACCBAL);
下面是中间件与php的对接文档。
必看说明
本系统采用MD5的算法进行签名。
请求的签名生成方法如下:
将除 sign 外的其他全部字段按照参数字典(ASCII)顺序,组装形成一个待签名字符signSrc=k1=v1&k2=v2&kN=vN
将得到的字符串signSrc+key(申请的密钥)进行MD5作为sign字段;
返回的签名校验方法如下:
只有返回的json结果中code=success的情况下才需要验签;
返回的json参数data+key(密钥)进行MD5生成sign进行比对;
账户余额查询
发送请求------------http://地址/icbc/QACCBAL.do | ||||
参数名称 | 参数含义 | 必填 | 数据类型 | 说明 |
packageID | 唯一编号 | 是 | String(32) | order1575266396000 |
sign | 签名 | 是 | String(32) | MD5签名 |
返回的数据 | ||||
{ "code": "success", "data": { "out": { "rd": { "AccBalance": "7", "AccName": "xxx有限公司", "AccNo": "", "AcctProperty": "004", "AcctSeq": "", "Balance": "7", "CashExf": "0", "CurrType": "001", "FrzAmt": "0", "HoldAmt": "0", "InterDeposit": "1", "InterWithdrawal": "1", "LastIntrDate": "2019-09-21", "MainAcctNo": "", "QueryTime": "20191220135600000020", "RepReserved3": "", "UsableBalance": "7", "iRetCode": "0", "iRetMsg": "", "iSeqno": "" } }, "pub": { "BankCode": "102", "CIS": "证书号码", "ID": "证书ID", "RetCode": "0", "RetMsg": "多账户余额查询成功", "TranDate": "20191220", "TranTime": "135620151", "TransCode": "QACCBAL", "fSeqno": "" } }, "sign": "a568d4e0bcf0431c2da86c87fe2c32bb" } |
鉴权
发送请求------------http://地址/icbc/AUTHCK.do | ||||
参数名称 | 参数含义 | 必填 | 数据类型 | 说明 |
packageID | 唯一编号 | 是 | String(32) | order1575266396000 |
accName | 姓名 | 是 | String(30) | 张三 |
accNo | 卡号 | 是 | String(19) | 6217232103000389459 |
certType | 证件类型 | 是 | String(2) | 0-身份证 1-护照 2-军官证 3-士兵证 4-港澳台居民往来通行证 5-临时身份证 6-户口本 7-其他 9-警官证12-外国人永久居留证 |
certNo | 证件号码 | 是 | String(18) |
|
isRealtime | 是否同步鉴权 | 否 | String(1) | 0否 1是 |
sign | 签名 | 是 | String(32) | MD5签名 |
返回的参数 | ||||
{ "code": "success", "data": { "out": { "MerID": "银行卡部,商户档案号", "TotalNum": "1", "rd": { "AccName": "张三", "AccNo": "银行卡号", "CertNo": "证件号码", "CertType": "0", "OrderNo": "1", "Result": "7", "iRetCode": "0", "iRetMsg": "交易成功" } }, "pub": { "BankCode": "102", "CIS": "证书号码", "ID": "证书ID", "RetCode": "0", "RetMsg": "", "SerialNo": "KOA123456", "TranDate": "20191220", "TranTime": "140144051", "TransCode": "AUTHCK", "fSeqno": "" } }, "sign": "78be33849a82ce61f868b10004f0f213" } |
鉴权查询
发送请求------------http://地址/icbc/QAUTHCK.do | ||||
参数名称 | 参数含义 | 必填 | 数据类型 | 说明 |
packageID | 唯一编号 | 是 | String(32) | order1575266396000 |
二选一参数 | ||||
qryfSeqno | 鉴权接口上送的packageID | 否 | String(32) | 鉴权上送的参数 |
qrySerialNo | 鉴权接口返回的SerialNo | 否 | String(32) | 鉴权返回的参数 |
sign | 签名 | 是 | String(32) | MD5签名 |
返回的参数 | ||||
{ "code": "success", "data": { "out": { "MerID": "银行卡部,商户档案号", "TotalNum": "1", "rd": { "AccName": "张三", "AccNo": "银行卡号", "CertNo": "证件号码", "CertType": "0", "OrderNo": "1", "Result": "7", "iRetCode": "0", "iRetMsg": "交易成功" } }, "pub": { "BankCode": "102", "CIS": "证书号码", "ID": "证书ID", "RetCode": "0", "RetMsg": "", "SerialNo": "KOA123456", "TranDate": "20191220", "TranTime": "140144051", "TransCode": "AUTHCK", "fSeqno": "" } }, "sign": "78be33849a82ce61f868b10004f0f213" } |
出金(入账方式采用逐笔入账)
发送请求------------http://地址/icbc/PAYENT.do | ||||
参数名称 | 参数含义 | 必填 | 数据类型 | 说明 |
packageID | 唯一编号 | 是 | String(32) | order1575266396000 |
totalAmt | 总金额 | 是 | String(20) | 无正负号,不带小数点,以分作单位 |
recAccNo | 对方账号 | 是 | String(34) |
|
payType | 记账处理方式 | 是 | String(1) | 1:加急 2:普通(工行异地人民币转账不再区分普通\加急,统一按加急处理) 3:跨行快汇(当涉及账户管家账户转账时,记账方式不支持普通,工行异地转账不再区分普通\加急,统一按加急处理) |
sysIOFlg | 系统内外标志 | 是 | String(1) | 1:系统内 2:系统外
工行卡系统内,非工行卡系统外 |
useCN | 用途中文描述 | 是 | String(20) | 用途描述 |
二选一必填参数 | ||||
recAccNameCN | 对方账户名称 | 否 | String(100) | 根据人行标准,人民币账户的户名不应超过60字节,否则该字段可能被截取 如:张三 |
recAccNameEN | 对方账户英文名称 | 否 | String(100) | zhangsan |
跨行必填 | ||||
prop | 对公对私标志 | 否 | String(1) | 0:对公账户 1:个人账户 |
recBankNo | 对方行行号 | 否 | String(13) | 非跨行支付时,此项上送空值 |
recBankName | 交易对方银行名称 | 否 | String(60) | 跨行指令此项必输,中文,60位字符。 |
非必填参数(联系我,可增加其他参数) | ||||
recCityName | 收款方所在城市名称 | 否 | String(30) | 跨行指令(非跨行快汇)此项必输 (经测试,工行内部加急转账不传也可以。) |
isSameCity | 同城异地标志 | 否 | String(1) | 1:同城 2:异地 |
recICBCCode | 交易对方工行地区号 | 否 | String(5) | 4位工行地区号 |
postScript | 附言 | 否 | String(100) | 如果是跨行交易,目前最多只支持60个字符。 |
summary | 摘要 | 否 | String(20) |
|
sign | 签名 | 是 | String(32) | MD5签名 |
返回的参数 | ||||
{ "code": "success", "data": { "out": { "AlertFlag": "0", "BusType": "", "OnlBatF": "1", "PackageName": "", "QrySerialNo": "CMM123456", "QryfSeqno": "", "SettleMode": "0", "rd": { "BankRetTime": "20191219142008", "BankType": "", "BusCode": "", "CrvouhName": "", "CrvouhNo": "", "CrvouhType": "", "CurrType": "001", "ERPSqn": "", "ERPcheckno": "", "EnSummary": "", "FileNames": "", "Indexs": "", "IsSameCity": "1", "MCardName": "", "Oref": "", "PayAccNameCN": "xxx有限公司", "PayAccNameEN": "", "PayAccNo": "付款银行账号", "PayAmt": "1000", "PaySubNo": "", "PayType": "3", "PostScript": "用户提现", "QryOrderNo": "1", "QryiSeqno": "12345678", "RecAccNameCN": "张三", "RecAccNameEN": "", "RecAccNo": "银行卡号", "RecBankName": "中国农业银行股份有限公司", "RecBankNo": "103100000026", "RecCityName": "", "RecICBCCode": "0000", "Ref": "", "ReimburseNo": "", "ReimburseNum": "", "Result": "6", "StartDate": "", "StartTime": "", "Summary ": "用户提现", "SysIOFlg": "2", "UseCN": "用户提现", "UseCode": "", "iRetCode": "0", "iRetMsg": "", "iSeqno": "1", "instrRetCode": "4102", "instrRetMsg": "余额不足" } }, "pub": { "BankCode": "102", "CIS": "证书号码", "ID": "证书ID", "RetCode": "0", "RetMsg": "", "TranDate": "20191220", "TranTime": "140659740", "TransCode": "QPAYENT", "fSeqno": "" } }, "sign": "a4de6cd22eeccf806d47159adb855f12" } |
出金订单查询
发送请求------------http://地址/icbc/QPAYENT.do | ||||
参数名称 | 参数含义 | 必填 | 数据类型 | 说明 |
packageID | 唯一编号 | 是 | String(32) | order1575266396000 |
二选一参数 | ||||
qryfSeqno | 出金接口上送的packageID | 否 | String(32) | 出金上送的参数 |
qrySerialNo | 出金返回的SerialNo | 否 | String(32) | 出金返回的参数 |
sign | 签名 | 是 | String(32) | MD5签名 |
返回的参数 | ||||
{ "code": "success", "data": { "out": { "AlertFlag": "0", "BusType": "", "OnlBatF": "1", "PackageName": "", "QrySerialNo": "CMM123456", "QryfSeqno": "", "SettleMode": "0", "rd": { "BankRetTime": "20191219142008", "BankType": "", "BusCode": "", "CrvouhName": "", "CrvouhNo": "", "CrvouhType": "", "CurrType": "001", "ERPSqn": "", "ERPcheckno": "", "EnSummary": "", "FileNames": "", "Indexs": "", "IsSameCity": "1", "MCardName": "", "Oref": "", "PayAccNameCN": "xxx有限公司", "PayAccNameEN": "", "PayAccNo": "付款银行账号", "PayAmt": "1000", "PaySubNo": "", "PayType": "3", "PostScript": "用户提现", "QryOrderNo": "1", "QryiSeqno": "12345678", "RecAccNameCN": "张三", "RecAccNameEN": "", "RecAccNo": "银行卡号", "RecBankName": "中国农业银行股份有限公司", "RecBankNo": "103100000026", "RecCityName": "", "RecICBCCode": "0000", "Ref": "", "ReimburseNo": "", "ReimburseNum": "", "Result": "6", "StartDate": "", "StartTime": "", "Summary ": "用户提现", "SysIOFlg": "2", "UseCN": "用户提现", "UseCode": "", "iRetCode": "0", "iRetMsg": "", "iSeqno": "1", "instrRetCode": "4102", "instrRetMsg": "余额不足" } }, "pub": { "BankCode": "102", "CIS": "证书号码", "ID": "证书ID", "RetCode": "0", "RetMsg": "", "TranDate": "20191220", "TranTime": "140659740", "TransCode": "QPAYENT", "fSeqno": "" } }, "sign": "a4de6cd22eeccf806d47159adb855f12" } |
需要代码可以联系779293860