commit 5e01f94bcb85aa6fb06aeee159325d5fd4dcf7e0 Author: Alawn Date: Fri Oct 8 15:39:59 2021 +0800 first commit diff --git a/HRO接口文档.md b/HRO接口文档.md new file mode 100644 index 0000000..fe37777 --- /dev/null +++ b/HRO接口文档.md @@ -0,0 +1,799 @@ + + +# 易才代收付API + +**修订记录** + +版本号 | 更新日期 | 更新人 | 更新内容 +--- | --- | --- | --- +v2.0 | 2021-10-08 | 赵磊 | 增加二期接口 +v1.2 | 2021-04-02 | 赵磊 | 送盘文件增加银行代号、联行号字段 +v1.1 | 2021-02-26 | 赵磊 | 退票接口增加transStsMsg +v1.0 | 2021-02-03 | 赵磊 | 修改acctType枚举值 +v0.9 | 2021-02-02 | 赵磊 | transStsSync增加原状态 +v0.8 | 2021-01-29 | 赵磊 | applyDisk增加HRO批次名称&增加对账信息查询 +v0.7 | 2021-01-18 | 赵磊 | 增加对账接口 +v0.6 | 2021-01-14 | 赵磊 | 明确交易状态;增加批次失败信息;调整附言位置; +v0.5 | 2021-01-13 | 赵磊 | diskResult/diskNotify增加diskMessage;增加账户类型 +v0.4 | 2021-01-12 | 赵磊 | refundQuery增加页码、总页数、当前页码 +v0.3 | 2021-01-11 | 赵磊 | titleSync去除费项代码,增加账户类型 +v0.2 | 2021-01-11 | 赵磊 | 支付地增加代付默认配置 +v0.1 | 2020-12-29 | 赵磊 | 初稿 + +[TOC] + +## 接口设计 + +### 报文头 + +报文头格式为:“\报文头内容\”,内容结构详见接口设计部分公共报文头 + +### 报文体 + +报文体主要用于传输业务数据信息,格式为:“\报文体内容\” + +### 通讯 + +Protocol:HTTP +Method:POST +Content-Type:application/xml;charset=utf-8 + +### 签名 + +将HTTP Body中的数据流用MD5进行签名,将签名结果与密钥拼接生成签名串,再使用SHA256对签名串进行哈希,结果放在HTTP Request Header中,Key为Signature + +```java +String contentMD5 = byteArrayToHexString(MD5(bodyStream.getBytes("UTF-8"))); +String signature = Base64.encode(SHA256((contentMD5 + secretKey).getBytes("UTF-8"))); +``` + +bodyStream 为字节数组 + +### 报文格式 + +- 请求 + + ```xml + + + + v1.0 + diskApply + 20210104000000000001 + 20200104235959 + + + + 20201229 + 20201229000000000000000000000001 + 00001 + v1 + OHJEMIA1EINGUGAH0AITHOHNUEYAHWOO + 1000001 + c5950a259435d3e51262539a10a22910 + + + ``` + +- 返回 + + ```xml + + + + 000000 + 交易成功 + 20210104235959 + + + ``` + + + + +## 接口清单 + +序号 | 服务名 | 描述 | 报文方向 | 是否签名 +:---: | --- | -- | :----: | :----: +1 | diskApply | 批量代付申请 | HRO -> 沐融代付 | Y +2 | diskResult | 批量代付结果查询 | HRO -> 沐融代付 | Y +3 | diskNotify | 批次终态通知 | 沐融代付 -> HRO | Y +4 | refundQuery | 退票查询 | HRO -> 沐融代付 | Y +5 | customerSync | 客户信息同步 | HRO -> 沐融代付 | Y +6 | titleSync | 支付地账户信息同步 | HRO -> 沐融代付 | Y +7 | transStsSync | 业务状态同步 | HRO -> 沐融代付 | Y +8 | cardInfoQuery | 卡信息查询 | HRO -> 沐融代付 | Y +9 | reconciliationQuery | 对账信息查询 | HRO -> 沐融代付 | Y + + +### 接口约束性说明 + +符号 | 含义 | 描述 +--- | --- | --- +M | Mandatory | 强制的 +O | Optional | 可选的 +C | Conditional | 满足条件后必选 + +### 公共请求/响应头 + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + version | VARCHAR(10) | M | 接口版本 | v1.0 + serviceName | VARCHAR(50) | M | 服务名 | eg. diskApply + requestId | VARCHAR(48) | M | 请求ID | 全局唯一 + requestTime | VARCHAR(14) | M | 请求时间 | eg. 20210104120000 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + requestId | VARCHAR(48) | M | 请求ID | 全局唯一 + respCode | VARCHAR(8) | M | 返回码 | 详见 [响应码](#响应码) 的定义 + respMessage | VARCHAR(100) | M | 返回信息 | + respTime | VARCHAR(14) | M | 服务器时间 | + +### diskApply [批量代付申请] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + applyDate | VARCHAR(8) | M | 送盘日期 | eg. 20201229 + diskNo | VARCHAR(48) | M | 磁盘编号 | eg. 20201229000000000000000000000001 + diskDesc | VARCHAR(100) | M | 磁盘名称 | eg. XX客户2021-01-29代发工资 + filePath | VARCHAR(100) | M | 文件名/FID | eg. 00001 + fileVersion | VARCHAR(8) | O | 文件版本 | eg. v1 默认v1 + customerId | VARCHAR(48) | M | 客户编号 | eg. OHJEMIA1EINGUGAH0AITHOHNUEYAHWOO + titleId | VARCHAR(48) | M | 支付地抬头ID | eg. 1000001 + md5 | VARCHAR(32) | M | 磁盘MD5值 | eg. c5950a259435d3e51262539a10a22910 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + [公共返回头] | | | | 详见[公共请求/响应头] + +### diskResult [批量代付结果查询] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + applyDate | VARCHAR(8) | M | 送盘日期 | eg. 20201229 + diskNo | VARCHAR(48) | M | 磁盘名称 | eg. 20201229000000000000000000000001 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + diskSts | VARCHAR(1) | M | 批次状态 | 1:已接收完成 2: 批次处理中 3: 批次处理完成 4: 批次处理失败 + diskMessage | VARCHAR(100) | M | 批次结果信息 | + lastDate | VARCHAR(8) | M | 最后更新日期 | + lastTime | VARCHAR(6) | M | 最后更新时间 | + totalCount | VARCHAR(8) | M | 总笔数 | + totalAmount | VARCHAR(18) | M | 总金额 | + succCount | VARCHAR(8) | M | 成功笔数 | + succAmount | VARCHAR(18) | M | 成功金额 | + failCount | VARCHAR(8) | M | 失败笔数 | + failAmount | VARCHAR(18) | M | 失败金额 | + filePath | VARCHAR(100) | M | 文件路径/FID | eg. 00001 + md5 | VARCHAR(32) | M | 磁盘MD5值 | eg. c5950a259435d3e51262539a10a22910 + + +### diskNotify [批次终态通知] + +> 批次完成后通知HRO系统 + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + diskNo | VARCHAR(48) | M | 磁盘名称 | + diskSts | VARCHAR(1) | M | 批次状态 | 1:已接收完成 2: 批次处理中 3: 批次处理完成 4: 批次处理失败 + diskMessage | VARCHAR(100) | M | 批次结果信息 | + lastDate | VARCHAR(8) | M | 最后更新日期 | + lastTime | VARCHAR(6) | M | 最后更新时间 | + totalCount | VARCHAR(8) | M | 总笔数 | + totalAmount | VARCHAR(18) | M | 总金额 | + succCount | VARCHAR(8) | M | 成功笔数 | + succAmount | VARCHAR(18) | M | 成功金额 | + failCount | VARCHAR(8) | M | 失败笔数 | + failAmount | VARCHAR(18) | M | 失败金额 | + filePath | VARCHAR(100) | M | 文件路径/FID | eg. 000001 + md5 | VARCHAR(32) | M | 磁盘MD5值 | eg. c5950a259435d3e51262539a10a22910 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + [公共返回头] | | | | 详见[公共请求/响应头] + + +### refundQuery [退票查询] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + startDate | VARCHAR(8) | M | 开始日期 | + endDate | VARCHAR(8) | M | 结束日期 | + offset | VARCHAR(8) | M | 当前页码 | + limit | VARCHAR(8) | M | 每页记录数 | + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + total | VARCHAR(8) | M | 总页码 | + offset | VARCHAR(8) | M | 当前页码 | + limit | VARCHAR(8) | M | 每页记录数 | + rec | LIST | | 循环节点 | + diskNo | VARCHAR(48) | M | 磁盘编号 | + transId | VARCHAR(48) | M | 业务平台流水号 | 沐融交易流水号 + refId | VARCHAR(48) | M | 参考号 | HRO明细流水号 + bankRefId | VARCHAR(48) | M | 银行流水号 | + acctNo | VARCHAR(48) | M | 账号 | 卡号、存折号 + acctName | VARCHAR(150) | M | 姓名 | + transDate | VARCHAR(14) | M | 交易日期 | + transSts | VARCHAR(1) | M | 交易状态 | 视银行返回结果定 + transStsMsg | VARCHAR(100) | M | 交易状态信息 | 视银行返回结果定 + amount | VARCHAR(18) | M | 金额 | 分为单位 + refundCode | VARCHAR(5) | M | 退票代码 | + refundPs | VARCHAR(100) | M | 退票附言 | + payerAcctNo | VARCHAR(48) | M | 出款账号 | + payerAcctName | VARCHAR(100) | M | 出款户名 | + remark | VARCHAR(100) | M | 备注 | + +### customerSync [客户信息同步] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + customerId | VARCHAR(48) | M | 客户ID | + customerName | VARCHAR(100) | M | 客户名称 | + customerCode | VARCHAR(48) | M | 客户编号 | + rank | VARCHAR(100) | M | 等级 | 数字1~3,数字越大代表等级越高 + enabled | VARCHAR(1) | M | 是否启用 | Y:启用 N:停用 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + [公共返回头] | | | | 详见[公共请求/响应头] + +### titleSync [支付地账户同步] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + titleId | VARCHAR(48) | M | 支付地抬头ID | + titleName | VARCHAR(100) | M | 支付地抬头名称 | + bankCode | VARCHAR(20) | M | 银行代码 | 详见 [银行代码](#银行代码) + brNo | VARCHAR(20) | M | 开户行所在分行号 | 详见 [分行号](#分行号) + acctType | VARCHAR(1) | M | 账户类型 | B:基本户 N:一般户 + acctNo | VARCHAR(30) | M | 账号 | + acctName | VARCHAR(100) | M | 户名 | + enabled | VARCHAR(1) | M | 是否启用 | Y:启用 N:停用 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + [公共返回头] | | | | 详见[公共请求/响应头] + +### transStsSync [业务状态同步] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + applyDate | VARCHAR(8) | M | 原订单申请日期 | + refId | VARCHAR(48) | M | 参考号 | HRO明细流水号 + oriTransSts | VARCHAR(1) | M | 原交易状态 | S:成功 F:失败 R:已退票 + transSts | VARCHAR(1) | M | 交易状态 | S:成功 F:失败 R:已退票 + remark | VARCHAR(100) | O | 备注 | 此处可填修改状态的具体原因 + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + [公共返回头] | | | | 详见[公共请求/响应头] + +### cardInfoQuery [卡信息查询] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + cardNo | VARCHAR(32) | M | 卡号 | + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + bankType | VARCHAR(4) | M | 银行类型 | 详见 [银行代码](#银行代码) + cardType | VARCHAR(2) | M | 卡类型 | + cardName | VARCHAR(100) | M | 卡名称 | + +### reconciliationQuery [对账信息查询] + +- 请求 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + date | VARCHAR(8) | M | 对账日期 | + +- 返回 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + filePath | VARCHAR(100) | M | 文件路径/FID | + totalCount | VARCHAR(8) | M | 总笔数 | + totalAmount | VARCHAR(18) | M | 总金额 | 分为单位 + succCount | VARCHAR(8) | M | 成功笔数 | + succAmount | VARCHAR(18) | M | 成功金额 | 分为单位 + failCount | VARCHAR(8) | M | 失败笔数 | + failAmount | VARCHAR(18) | M | 失败金额 | 分为单位 + md5 | VARCHAR(32) | M | 磁盘MD5值 | eg. c5950a259435d3e51262539a10a22910 + + +## 文件格式 + +> 文件分两部分:首行汇总信息 + 循环明细行 +> 文件中各栏位采用分隔符**##**来分隔 + +### 送盘 + +- 首行 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + totalCount | VARCHAR(8) | M | 总笔数 | + totalAmount | VARCHAR(18) | M | 总金额 | 分为单位 + titleId | VARCHAR(48) | M | 支付地抬头ID | + customerId | VARCHAR(48) | M | 客户ID | + postscript | VARCHAR(100) | M | 银行附言 | + +- 循环体 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + acctNo | VARCHAR(48) | M | 账号 | 卡号、存折号 + acctName | VARCHAR(150) | M | 姓名 | + refId | VARCHAR(48) | M | 参考号 | HRO明细流水号 + amount | VARCHAR(18) | M | 金额 | 分为单位 + bankCode | VARCHAR(20) | C | 开户银行代号 | 详见 [银行代码](#银行代码) + bankCity | VARCHAR(100) | C | 开户行所在城市 | 存折与大小额时必输 + bankName | VARCHAR(100) | C | 开户银行网点 | 存折与大小额时必输 + bankNo | VARCHAR(14) | C | 联行号 | 开户行联行号(预留) + remark | VARCHAR(100) | O | 备注 | + +### 回盘 + +- 首行 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + totalCount | VARCHAR(8) | M | 总笔数 | + totalAmount | VARCHAR(18) | M | 总金额 | 分为单位 + succCount | VARCHAR(8) | M | 成功笔数 | + succAmount | VARCHAR(18) | M | 成功金额 | 分为单位 + failCount | VARCHAR(8) | M | 失败笔数 | + failAmount | VARCHAR(18) | M | 失败金额 | 分为单位 + titleId | VARCHAR(48) | M | 支付地抬头ID | + customerId | VARCHAR(48) | M | 客户ID | + +- 循环体 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + applyDate | VARCHAR(8) | M | 申请日期 | + lastTime | VARCHAR(14) | M | 最后更新时间 | eg. 20210111 + acctType | VARCHAR(2) | M | 账号类型 | 00:借记卡 01:贷记卡 02:准贷记卡 03:预付费卡 + acctNo | VARCHAR(48) | M | 账号 | 卡号、存折号 + acctName | VARCHAR(150) | M | 姓名 | + transId | VARCHAR(48) | M | 业务平台流水号 | 沐融交易流水号 + refId | VARCHAR(48) | M | 参考号 | HRO明细流水号 + bankRefId | VARCHAR(48) | M | 银行流水号 | + amount | VARCHAR(18) | M | 金额 | 分为单位 + bankName | VARCHAR(50) | O | 银行名称 | + postscript | VARCHAR(100) | O | 银行附言 | + payerAcctNo | VARCHAR(48) | M | 出款账号 | + payerAcctName | VARCHAR(100) | M | 出款户名 | + orgNo | VARCHAR(100) | O | 合作机构编号 | 详见 [银行代码](#银行代码) + remark | VARCHAR(100) | M | 备注 | + transSts | VARCHAR(1) | M | 明细状态 | S:成功 F:失败 + transMessage | VARCHAR(100) | M | 业务信息 | 当transSts = F时该字段返回错误信息 + + + +### 对账 + +- 循环体 + + 字段名称 | 类型 | 必输 | 描述 | 备注 + --- | --- | :----: | ---- | --- + applyDate | VARCHAR(8) | M | 申请日期 | + transId | VARCHAR(48) | M | 业务平台流水号 | 沐融交易流水号 + refId | VARCHAR(48) | M | 参考号 | HRO明细流水号 + bankRefId | VARCHAR(48) | M | 银行流水号 | + payerAcctNo | VARCHAR(48) | M | 出款账号 | + payerAcctName | VARCHAR(100) | M | 出款户名 | + acctNo | VARCHAR(48) | M | 账号 | 卡号、存折号 + acctName | VARCHAR(150) | M | 姓名 | + amount | VARCHAR(18) | M | 金额 | 分为单位 + orgNo | VARCHAR(100) | O | 合作机构编号 | 详见 [银行代码](#银行代码) + transSts | VARCHAR(1) | M | 明细状态 | S:成功 P:处理中 + transMessage | VARCHAR(100) | M | 业务信息 | + +## 附录 + +### 响应码 + +应答码(respCode) | 描述(respMessage) +--- | --- +00 | 操作成功 +01 | 支付失败。详情请咨询您的发卡行 +02 | 您输入的卡号无效,请确认后输入 +03 | 支付失败,您的发卡银行不支持该商户,请更换其他银行卡 +04 | 交易失败,请重试 +05 | 文件校验错误 +06 | 您的卡已经过期,请使用其他卡支付 +09 | 业务处理中 +10 | 公司账号不符 +11 | 您卡上的余额不足 +13 | 账号已挂失 +14 | 您的卡已过期或者是您输入的有效期不正确,支付失败 +15 | 您输入的银行卡密码有误,支付失败" +16 | 账号户名不符 +18 | 交易未通过,请尝试使用其他银联卡支付或联系95516 +20 | 您输入的转入卡卡号有误,支付失败 +21 | 您输入的验证信息有误,支付失败 +22 | 付款币种非法 +23 | 失败,请检查交易对应业务是否已经开通 +25 | 查找原始交易失败 +30 | 报文错误 +31 | 交易受限 +32 | 系统维护中 +36 | 交易金额超限,支付失败 +37 | 原始金额错误 +39 | 您已连续多次输入错误密码 +40 | 您的银行卡暂不支持在线支付业务,请向您的银行咨询如何加办银联在线支付 +41 | 您的银行卡不支持认证支付,请选择快捷支付 +42 | 您的银行卡不支持小额支付,请选择快捷支付 +43 | 您的银行卡不支持认证支付 +44 | 代发金额或次数超限 +56 | 您的银行卡所能进行的交易受限,详细请致电发卡行进行查询 +57 | 该银行卡未开通银联在线支付业务 +60 | 银行卡未开通认证支付 +61 | 银行卡开通状态查询次数过多 +71 | 交易无效,无法完成,支付失败 +72 | 无此交易 +73 | 扣款成功但交易超时 +74 | 对不起,该操作员只能在交易当日进行 +80 | 内部错误 +81 | 可疑报文 +82 | 验签失败 +83 | 超时 +84 | 订单不存在 +85 | 不支持短信发送 +86 | 短信验证码错误 +87 | 您的短信发送过于频繁,请稍候再试 +88 | 您的短信发送累计过于频繁,请在x分钟后重试 +89 | 对不起,短信发送失败,请稍候再试 +90 | 请您登录工商银行网上银行或拨打95588进行后续认证操作 +93 | 请致电您的银行以确定您的个人客户基本信息中的相关信息设置正确 +94 | 重复交易 +95 | 您尚未在邮储银行网点柜面或个人网银签约加办银联无卡支付业务,请去柜面或网银开通 +97 | 请致电您的银行以确定您的用户信息是否设置正确,并咨询是否已经开办银联在线支付 + + +### 银行代码 + +银行代码(bankCode) | 银行名称(bankName) | 超网联行号 +--- | --- | --- +GHB | 广东华兴银行 | 313586000006 +TCRCB | 太仓农村商业银行 | 314305106644 +YRRCB | 黄河农村商业银行 | 402871099996 +GDRCU | 广东省农村信用社联合社 | 402581090008 +HLJRCU | 黑龙江省农村信用社联合社 | 402261000004 +YZRCB | 北京顺义银座村镇银行 | 320100010011 +NYCB | 南阳村镇银行 | 320513000018 +BEA | 东亚银行有限公司 | 502290000006 +BOHB | 河北银行股份有限公司 | 313121006888 +HLCB | 葫芦岛银行 | 313227600018 +GYBC | 贵阳银行股份有限公司 | 313701098010 +KSRB | 昆山农村商业银行 | 314305206650 +GDNYB | 广东南粤银行 | 313591001001 +PAB | 平安银行 | 307584007998 +YTB | 烟台银行 | 313456000108 +TACB | 泰安银行 | 313463000993 +CITIB | 花旗中国 | 531290088881 +BEA | 东亚银行中国有限公司 | 502290000006 +JLCB | 吉林银行 | 313241066661 +WZCB | 温州银行 | 313333007331 +DLCB | 大连银行 | 313222080002 +TCCB | 天津市商业银行 | 313110000017 +DDB | 丹东银行 | 313226009000 +CJCCB | 江苏长江商业银行 | 313312300018 +LZCB | 柳州银行股份有限公司 | 313614000012 +ZRCB | 枣庄银行 | 313454000016 +PAB | 平安银行股份有限公司 | 307584007998 +GZRB | 广州农村商业银行 | 314581000011 +JYRCB | 江阴农村商业银行 | 314302200018 +SHDRB | 山东省农村信用社联合社 | 402451000010 +DGRB | 东莞农村商业银行 | 402602000018 +ZJGRCB | 张家港农村商业银行 | 314305670002 +GXZRCU | 广西农村信用社联合社 | 402611099974 +WHRCB | 武汉农村商业银行 | 402521090019 +HNHSRCB | 会宁会师村镇银行 | 320824275019 +FBB | 富邦华一银行 | 787290000019 +ASRCB | 鞍山银行 | 313223007007 +HSBC | 徽商银行 | 319361000013 +SGB | 中德住房储蓄银行 | 717110000010 +BDCB | 保定银行 | 313134000011 +FJHTB | 福建华通银行 | 323391060018 +BOSR | 上饶银行 | 313433076801 +AIB | 中信百信银行 | 326100010008 +SHRB | 上海华瑞银行股份有限公司 | 323290000016 +JZCCB | 晋中银行 | 313175000011 +JJCCB | 九江银行 | 313424076706 +HKURCB | 海口联合农村商业银行 | 314641000014 +CEB | 光大银行 | 303100000006 +BOC | 中国银行 | 104100000004 +GDB | 广发银行股份有限公司 | 306581000003 +CMB | 招商银行 | 308584000013 +SCB | 渣打银行中国有限公司 | 671290000017 +HXCB | 福建海峡银行股份有限公司 | 313391080007 +CHDCB | 成都商业银行 | 313651099999 +PZHCCB | 攀枝花市商业银行 | 313656000019 +ZJKCB | 张家口市商业银行 | 313138000019 +TSCCB | 唐山市商业银行 | 313124000018 +JSCB | 江苏银行 | 313301099999 +SNZCB | 遂宁市商业银行 | 313662000015 +LSZCB | 凉山州商业银行 | 313684093748 +HSBCB | 衡水市商业银行 | 313148053964 +HRXJ | 华融湘江银行 | 313551070008 +SJBK | 盛京银行 | 313221030008 +KSRB | 昆山农信社 | 314305206650 +CRRB | 常熟农村商业银行 | 314305506621 +BRCB | 北京农商行 | 402100000018 +SCRC | 四川省农村信用社联合社 | 402651020006 +ZSXLRB | 中山小榄村镇银行 | 320603000018 +HSB | 恒生银行有限公司 | 504290005116 +BOB | 北京银行 | 313100000013 +GLB | 桂林银行 | 313617000018 +BOQH | 青海银行 | 313851000018 +BONB | 宁波银行 | 313332082914 +CITIC | 中信银行 | 302100011000 +BOGZ | 贵州银行 | 313701099012 +NUBOLN | 辽宁振兴银行 | 323221000086 +XMCCB | 厦门银行 | 313393080005 +SHRB | 上海华瑞银行股份有限公司 | 322290000011 +BEA | 东亚银行 | 502290000006 +BOZZ | 郑州银行 | 313491000232 +JSBC | 晋商银行 | 313161000017 +ABC | 农业银行 | 103100000026 +CMBC | 民生银行 | 305100000013 +WOORIB | 友利银行(中国)有限公司 | 593100000020 +XMCCB | 厦门银行股份有限公司 | 313393080005 +LYCB | 洛阳银行 | 313493080539 +SXCB | 绍兴银行 | 313337009004 +JJCCB | 九江银行股份有限公司 | 313424076706 +QHDCCB | 秦皇岛银行股份有限公司 | 313126001022 +TZCB | 台州银行 | 313345001665 +ZCCBC | 浙江稠州商业银行 | 313338707013 +BOWC | 乌海银行股份有限公司 | 313193057846 +HUBCB | 湖北银行 | 313521006000 +BOTC | 西藏银行 | 313770000016 +SHRB | 上海农商银行 | 322290000011 +SZRCB | 深圳农村商业银行 | 402584009991 +CQRB | 重庆农村商业银行 | 314653000011 +BEEB | 宁波鄞州农村合作银行 | 402332010004 +JSRCU | 江苏省农村信用社联合社 | 402301099998 +GZRCU | 贵州省农村信用社联合社 | 402701002999 +HBRC | 河北省农村信用社联合社 | 402121000009 +TJBHRC | 天津滨海农村商业银行 | 314110000011 +BOC | 中国银行(香港) | 104100000004 +KLCB | 昆仑银行股份有限公司 | 313882000012 +JXRCU | 江西省农村信用社联合社 | 402421099990 +XTCCB | 邢台银行 | 313131000016 +JCB | 晋城银行 | 313168000003 +CYCB | 朝阳银行 | 313234001089 +BOXAC | 西安银行 | 313791000015 +GZRCU | 贵州省农村信用联合社 | 402701002999 +HMCCB | 哈密市商业银行 | 313884000016 +WZMSB | 温州民商 | 323333000013 +SNB | 江苏苏宁银行 | 323301000019 +ZJKCB | 张家口银行 | 313138000019 +LZCB | 柳州银行 | 313614000012 +CCB | 中国建设银行 | 105100000017 +BCOM | 交通银行 | 301290000007 +CIB | 兴业银行 | 309391000011 +CZB | 浙商银行 | 316331000018 +CRBC | 珠海华润银行股份有限公司 | 313585000990 +CQCB | 重庆银行 | 313653000013 +MYCCB | 绵阳市商业银行 | 313659000016 +QCCBC | 曲靖市商业银行 | 313736000019 +SZSCB | 石嘴山银行 | 313872097457 +TJRCB | 天津农村商业银行 | 317110010019 +ZJRCU | 浙江省农村信用社联合社 | 402331000007 +IMRCU | 内蒙古自治区农村信用社联合式 | 402191009992 +CCB | 中国建设银行澳门股份有限公司 | 105100000017 +CQFMB | 重庆富民银行 | 323653010015 +AHXAB | 安徽新安银行 | 323361000014 +CDCB | 承德银行 | 313141052422 +BQD | 青岛银行 | 313452060150 +NJCB | 南京银行 | 313301008887 +AHRB | 安徽省农村信用社 | 402361018886 +XCXWB | 四川新网银行 | 323651066666 +WHZBB | 武汉众邦银行 | 323521012066 +SHRB | 上海农商银行贷记卡 | 322290000011 +HXB | 华夏银行 | 304100040000 +CRBC | 珠海华润银行 | 313585000990 +JXCCB | 嘉兴银行 | 313335081005 +LJCB | 龙江银行股份有限公司 | 313261099913 +JZCB | 锦州银行股份有限公司 | 313227000012 +CSCB | 长沙银行股份有限公司 | 313551088886 +BOLF | 廊坊银行 | 313146000019 +CDCB | 承德市商业银行 | 313141052422 +ZGCCB | 自贡市商业银行 | 313655091983 +ESB | 鄂尔多斯银行 | 313205057830 +JZCCB | 晋中市商业银行 | 313175000011 +YQCB | 阳泉市商业银行 | 313163000004 +YASCB | 雅安市商业银行 | 313677000010 +BOGS | 甘肃银行 | 313821050016 +CDRB | 成都农村商业银行股份有限公司 | 314651000000 +HNRCU | 河南省农村信用社联合社 | 402491000026 +HNRB | 海南省农村信用社联合社 | 402641000014 +SXRB | 山西省农村信用社联合社 | 402161002352 +BOC | 中国银行(香港) | 104100000004 +HDCB | 邯郸银行 | 313127000013 +HZB | 杭州银行 | 313331000014 +BOIM | 内蒙古银行 | 313191000011 +DYCCB | 东营银行 | 313455000018 +LZB | 兰州银行 | 313821001016 +SHRB | 上海农商银行贷记卡 | 323290000016 +FDB | 富滇银行 | 313731010015 +BOGC | 赣州银行股份有限公司 | 313428076517 +ZGCB | 北京中关村银行 | 323100000012 +GZB | 广州银行股份有限公司 | 313581003284 +LJCB | 龙江银行 | 313261099913 +HNRC | 湖南省农村信用联合社 | 402551080008 +JHCB | 金华银行股份有限公司 | 313338009688 +FSCB | 抚顺银行 | 313224000015 +HLCB | 葫芦岛市商业银行 | 313227600018 +NXCB | 宁夏银行 | 313871000007 +BOFC | 阜新银行 | 313229000008 +BOJC | 济宁银行股份有限公司 | 313461000012 +LHCCB | 漯河商行 | 320504000014 +NBCB | 宁波通商银行 | 313332090019 +FJRCU | 福建省农村信用社联合社 | 402391000068 +WXCCB | 无锡农村商业银行 | 314302066666 +HNRC | 湖南省农村信用社联合社 | 402551080008 +JLNC | 吉林省农村信用社联合社 | 402241000015 +QHRCB | 青海省农村信用社联合社 | 402851000016 +LNNC | 辽宁省农村信用社联合社 | 402221010013 +CCB | 中国建设银行亚洲股份有限公司 | 105100000017 +SCB | 渣打银行香港有限公司 | 671290000017 +ICBC | 中国工商银行(澳门) | 102100099996 +JLYLCB | 吉林亿联银行 | 323241000016 +HRBCB | 哈尔滨银行 | 313261000018 +XIB | 厦门国际银行 | 781393010011 +ZYB | 中原银行 | 313491099996 +BORZ | 日照银行 | 313473200011 +GBGB | 广西北部湾银行 | 313611001018 +LSBC | 临商银行 | 313473070018 +CQCB | 重庆银行股份有限公司 | 313653000013 +SPDB | 浦东发展银行 | 310290000013 +JZCB | 锦州银行 | 313227000012 +SZCB | 苏州银行 | 313305066661 +WCCB | 威海市商业银行 | 313465000010 +QSCCB | 齐鲁银行股份有限公司 | 313451000019 +HFB | 恒丰银行 | 315456000105 +BOWF | 潍坊银行 | 313458000013 +QSSCCB | 齐商银行 | 313453001017 +BOHN | 海南银行 | 313641099995 +CBHB | 渤海银行 | 318110000014 +BOS | 上海银行 | 325290000012 +HKB | 汉口银行 | 313521000011 +DGCB | 东莞市商业银行 | 313602088017 +BOXAC | 西安银行股份有限公司 | 313791000015 +QZCCB | 泉州银行 | 313397075189 +YKCB | 营口银行股份有限公司 | 313228000276 +CZCB | 沧州银行 | 313143005157 +LSB | 莱商银行 | 313463400019 +DYCB | 德阳银行 | 313658000014 +ZMCBC | 浙江民泰商业银行 | 313345400010 +TACB | 泰安市商业银行 | 313463000993 +LSSCB | 乐山市商业银行 | 313665092924 +CQTGB | 重庆三峡银行 | 321667090019 +YBCCB | 宜宾市商业银行 | 313671000017 +YKCBC | 营口沿海银行 | 313228060009 +XJHHB | 新疆汇和银行 | 313898100016 +SHRB | 上海农商银行 | 323290000016 +SDRCB | 佛山顺德农村商业银行 | 314588000016 +SZCB | 苏州银行股份有限公司 | 313305066661 +JXRCU | 江西农信联合社 | 402421099990 +SXNRCU | 陕西省农村信用社联合社 | 402791000010 +AHRB | 安徽省农村信用社联合社 | 402361018886 +JSHJMTRCB | 江苏邗江民泰村镇银行 | 320312091015 +LSRB | 东营莱商村镇银行 | 320455000019 +CITIB | 花旗银行有限公司 | 531290088881 +HSB | 恒生银行 | 504290005116 +CCB | 中国建设银行(亚洲) | 105100000017 +HZBC | 湖州银行 | 313336071575 +BOFC | 阜新银行股份有限公司 | 313229000008 +XJB | 新疆银行 | 313881088887 +ZJTLCB | 浙江泰隆商业银行 | 313345010019 +DLRCB | 大连农商行 | 314222001893 +MZKSB | 梅州客商银行 | 323596001013 +QSCCB | 齐鲁银行 | 313451000019 +ICBC | 中国工商银行 | 102100099996 +LYCCB | 辽阳银行股份有限公司 | 313231000013 +SZCB | 苏州市商业银行 | 313305066661 +BOZZ | 郑州银行股份有限公司 | 313491000232 +JCB | 晋城银行股份有限公司 | 313168000003 +CZCCB | 长治市商业银行 | 313164000006 +DZB | 德州银行 | 313468000015 +HDCB | 邯郸市商业银行 | 313127000013 +CCAB | 长安银行 | 313791030003 +PDSCCB | 平顶山银行股份有限公司 | 313495081900 +NDHB | 宁波东海银行 | 313332040018 +XTCCB | 邢台银行股份有限公司 | 313131000016 + + +### 分行号 + +分行名 | 代码(brNo) +--- | --- +北京 | 10 +广州 | 20 +上海 | 21 +天津 | 22 +重庆 | 23 +沈阳 | 24 +南京 | 25 +武汉 | 27 +成都 | 28 +西安 | 29 +太原 | 35 +郑州 | 37 +石家庄 | 38 +唐山 | 39 +大连 | 41 +长春 | 43 +哈尔滨 | 45 +呼和浩特 | 47 +银川 | 51 +苏州 | 52 +青岛 | 53 +宁波 | 54 +合肥 | 55 +济南 | 56 +杭州 | 57 +温州 | 58 +福州 | 59 +泉州 | 60 +无锡 | 62 +南通 | 63 +烟台 | 65 +东莞 | 69 +南宁 | 71 +西宁 | 72 +长沙 | 73 +深圳 | 75 +佛山 | 77 +南昌 | 79 +贵阳 | 85 +昆明 | 87 +海口 | 89 +乌鲁木齐 | 91 +厦门 | 92 +兰州 | 93 +香港 | 97 +总行 | 01 diff --git a/HRO签名DEMO.md b/HRO签名DEMO.md new file mode 100644 index 0000000..91a1d1c --- /dev/null +++ b/HRO签名DEMO.md @@ -0,0 +1,96 @@ +# HRO签名DEMO + + +```java +import org.junit.Test; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +/** + * @Author: Alawn + * @Description: + * @Date: Create in 6:40 下午 2021/1/20 + */ +public class SignDemo { + + private final static String secret = "Giur9quiuD"; + private final static String charSet = "UTF-8"; + + @Test + public void sign() throws NoSuchAlgorithmException, UnsupportedEncodingException { + String reqBody = "v1.0diskApply20210104000000000001202001042359592020122920201229000000000000000000000001/data/send/20201229000000000000000000000001v1OHJEMIA1EINGUGAH0AITHOHNUEYAHWOO1000001c5950a259435d3e51262539a10a22910"; + + MessageDigest md5Digest = MessageDigest.getInstance("MD5"); + + String md5 = byteArrayToHexString(md5Digest.digest(reqBody.getBytes(charSet))); + + MessageDigest shaDigest = MessageDigest.getInstance("SHA-256"); + + byte[] signBuf = new byte[md5.getBytes(charSet).length + secret.getBytes(charSet).length]; + + System.arraycopy(md5.getBytes(charSet),0,signBuf,0,md5.getBytes(charSet).length); + + System.arraycopy(secret.getBytes(charSet),0,signBuf,0,secret.getBytes(charSet).length); + + String sign = String.valueOf(Base64.getEncoder().encodeToString(shaDigest.digest(signBuf))); + + System.out.println("Sign:[" + sign + "]"); + } + + @Test + public void verifySign() throws NoSuchAlgorithmException, UnsupportedEncodingException { + + String respBody = "000000交易成功20210104235959"; + String respSign = "PcPrQVDIsguzP6ASffQM2zFtznHqi7Bz1RhZhALMnTs="; + + + MessageDigest md5Digest = MessageDigest.getInstance("MD5"); + + String md5 = byteArrayToHexString(md5Digest.digest(respBody.getBytes(charSet))); + + MessageDigest shaDigest = MessageDigest.getInstance("SHA-256"); + + byte[] signBuf = new byte[md5.getBytes(charSet).length + secret.getBytes(charSet).length]; + + System.arraycopy(md5.getBytes(charSet), 0, signBuf, 0, md5.getBytes(charSet).length); + + System.arraycopy(secret.getBytes(charSet), 0, signBuf, 0, secret.getBytes(charSet).length); + + String sign = Base64.getEncoder().encodeToString(shaDigest.digest(signBuf)); + + if (!respSign.equals(sign)) { + System.out.println("验签失败;请求签名:[" + respSign + "] 验证签名: [" + sign + "]"); + } + else{ + System.out.println("验签成功"); + } + + } + + public static String byteArrayToHexString(byte b[]) { + StringBuffer resultSb = new StringBuffer(); + for (int i = 0; i < b.length; i++) { + resultSb.append(byteToHexString(b[i])); + } + + return resultSb.toString(); + } + + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) { + n += 256; + } + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + + private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", + "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; + +} +``` diff --git a/HRO融合方案.md b/HRO融合方案.md new file mode 100644 index 0000000..202c383 --- /dev/null +++ b/HRO融合方案.md @@ -0,0 +1,68 @@ + +# HRO融合方案 + +## 流程图 + +### 流程图 + +```mermaid +sequenceDiagram +participant hro_web +participant mr_web +participant mr_server +participant auth_server + +hro_web->>mr_web: https://ui.domain/page?token=xxxxxxx +mr_web->>mr_server: [token=xxxxxxx][funcId=xxxxx] +mr_server->>auth_server: http://auth.domain/auth?token=ZW9xpZTdvamE4SWVTNmkK&funcId=10001 +auth_server-->>mr_server: 返回鉴权结果(200:成功;403:Forbidden) 与 下级funcId集合字符串(xxxx,xxxx,xxxx) +mr_server->>mr_server: 权限判断 +mr_server-->>mr_web: 返回权限结果与下级funcId +``` + +## 接口说明 + +### Auth Server + +#### 鉴权 + +- 请求 + + protocol : HTTP + method : GET + content-Type : application/x-www-form-urlencoded + token:Token + funcId:功能ID + + eg. + + ```http + GET /auth?token=ZW9xpZTdvamE4SWVTNmkK&funcId=10001 HTTP/1.1 + Content-Type : application/x-www-form-urlencoded + Host: localhost: 8888 + Connection: keep-alive + ``` + +- 返回 + + 根据http state来判断是否鉴权成功;200:鉴权通过 403:鉴权失败 + funcSet: 满足条件的funcId集合,以逗号符分割 + + eg. 成功: + + ```http + HTTP/1.1 200 OK + Date: Wed, 13 Jan 2021 15:27:25 GMT + Content-Type : application/xml + Content-Length: 52 + + 100001,100002,100005 + ``` + + eg. 失败: + + ```http + HTTP/1.1 403 Forbidden + Date: Wed, 13 Jan 2021 15:27:25 GMT + ``` + diff --git a/route.md b/route.md new file mode 100644 index 0000000..1c3e7d8 --- /dev/null +++ b/route.md @@ -0,0 +1,85 @@ +## 路由说明及控制点 + +- 正式表/临时表 同步机制 + + > 路由维护的一种保障机制,因为路由规则是一条一条逐步维护的,所以为了保障这些路由策略能够同时生效,通过临时表导入到正式表来保证策略同步生效 + + - 导入正式表:将临时表中维护好的策略导入正式表(仅会将临时表中状态为生效的策略导入正式表,且导入正式表之前会清空正式表中现有的策略) + + - 同步正式表:将正式表中的策略同步到临时表中,使其以基于现有生产的策略基础上编辑 + + PS:临时表是个规则池,该表中的策略规则数量可大于等于正式表 + + +- 支付地、路由组、路由策略见的关系 + + - 每个支付地必须归属到具体的某个路由组下(支付地路由组维护) + + - 每套路策略均以组为单位维护(路由维护界面中先选择路由组) + +- 默认路由 + + - 每套路由组中必然存在一条默认路由的规则,该条规则优先级由系统自动设置成最低(9999),使之在没有满足任何前置路由的情况下,最终会走到该条默认路由 + + - 默认路由的规则由创建用户组的同时自动生成,生成后只能修改其合作机构、汇路,系统将控制不得删除该条规则 + +- 规则级别 + + - 描述规则的优先级,取值范围从0~9999(其中9999为系统自动创建的默认路由) + + - 数值越小表示优先级越高,相同条件的规则集中优先级高会优先选择 + +- 发卡银行编号 + + - 代付明细中银行卡所属的银行编号,可通过该条件来设置本贷本/本贷它或者特定的银行卡来走特定的通道 + +- 合作机构 + + - 银行通道,目前易才仅对接工行、招行两家 + +- 汇路 + + > 央行现代化支付系统中的对应系统名称(大额、小额、超网),合作银行会根据汇路来走央行对应的支付系统 + +- 权重 + + > 该条件决定了该条规则中所设置合作机构的命中概率 + + 通常用于各通道保量的场景,如工行30%的量、招行70%的量,工行规则的权重设置成30,招行规则的权重设置成70 + + - 权重的单位为数值,取值范围1~999 + + - 权重仅在存在多条满足条件的规则前提下,才有意义 + +- 交易金额区间 + + > 该条件确定规则中金额区间 + + - 金额区间的规则是大于下限,小于等于上限,如0 - 5000区间则表示 金额大于等于0.01,小于等于5000 + +- 生效日期区间 + + > 该条件确定规则生效的日期范围 + + - 生效日期区间的规则是大于等于起始日,小于等于截止日 + + - 通常规则的截止日建议配置一个无限大的值,如9999年 + + - 生效日区间 + 规则级别的组合可以配置出节假日走特定路由的效果 + + +- 生效时间区间 + + > 该条件确定了路由规则的时间范围 + + - 生效时间区间的规则是大于等于起始时间,小于等于截止时间 + +- 状态 + + > 定义了该条规则的状态,生效、未生效 + + +- 路由试算 + + > 在临时表配置完路由策略后,可通过此功能来对已配置的策略进行核对 + diff --git a/test.md b/test.md new file mode 100644 index 0000000..fe9a414 --- /dev/null +++ b/test.md @@ -0,0 +1,19 @@ +## 易才测试方案 + +### 测试范围 + +1. 运营管理系统 + +2. HRO接口对接的系统 + +### 测试点 + +#### 运营管理 + +#### HRO接口 + +银行卡类型管理 + + + + diff --git a/前端改造.md b/前端改造.md new file mode 100644 index 0000000..409f14e --- /dev/null +++ b/前端改造.md @@ -0,0 +1,12 @@ +EVT_ORG_TIM_FAL | 机构运营时间超限 +EVT_ORG_AMT_OFW | 机构金额超限 +EVT_ORG_BLC_SRT | 机构余额不足 +EVT_BAT_SND_FAL | 批量送盘失败 +EVT_BAT_SND_SUC | 批量送盘成功 +EVT_BAT_RSP_FAL | 批量回盘失败 +EVT_BAT_RSP_SUC | 批量回盘成功 +EVT_ORG_STL_SUC | 机构清算成功 +EVT_ORG_STL_FAL | 机构清算失败 +EVT_DSK_TIM_OUT | 磁盘长时间未回盘 +EVT_BAT_TIM_OUT | 批次长时间未回盘 +EVT_RSK_BE_HIT | 风控命中 diff --git a/文件压缩解压.md b/文件压缩解压.md new file mode 100644 index 0000000..97fc0e5 --- /dev/null +++ b/文件压缩解压.md @@ -0,0 +1,40 @@ +# 文件压缩/解压 + +## Maven配置 + +```xml + + net.lingala.zip4j + zip4j + 2.6.4 + +``` + +## 压缩 + +```java +ZipParameters zipParameters = new ZipParameters(); +zipParameters.setEncryptFiles(true); +zipParameters.setEncryptionMethod(EncryptionMethod.AES); +// Below line is optional. AES 256 is used by default. You can override it to use AES 128. AES 192 is supported only for extracting. +zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256); + +List filesToAdd = Arrays.asList( + new File("somefile"), + new File("someotherfile") +); + +ZipFile zipFile = new ZipFile("filename.zip", "password".toCharArray()); +zipFile.addFiles(filesToAdd, zipParameters); +``` + + +## 解压 + +```java +new ZipFile("filename.zip", "password".toCharArray()).extractAll("/destination_directory"); +``` + +## 参考 + +[zip4j](https://github.com/srikanth-lingala/zip4j) diff --git a/易才代收付.drawio b/易才代收付.drawio new file mode 100644 index 0000000..c9b3eec --- /dev/null +++ b/易才代收付.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/易才代收付.png b/易才代收付.png new file mode 100644 index 0000000..13bc772 Binary files /dev/null and b/易才代收付.png differ diff --git a/路由策略.md b/路由策略.md new file mode 100644 index 0000000..6a4c348 --- /dev/null +++ b/路由策略.md @@ -0,0 +1,83 @@ +# 路由策略 + +## 银行路由配置说明 + +1. 两家银行跨行发放单笔100万以上只能走大额支付系统(开放时间:工作日20:30-次日17:30),单笔小于100万大/小额及超网都支持,区别在于收款人银行卡维护 + +2. 工行跨行工资发放默认“跨行快汇”方式上送;招行跨行工资发放默认“超网代发”方式发放 + +3. 非超网体系内银行卡,如存折(跨行)及小型城市商业银行,系统可判断情况下直接转大小额通道发放(超网名单随时变动更新) + +4. 路由配置策略选择: + + A. 只有工行账户(HRO系统维护唯一账户),所有工资发放都通过工行账户发放(单笔超100万转大额); + + B. 只有招行账户(HRO系统维护唯一账户),所有工资发放都通过招行账户发放(单笔超100万转大额); + + C. 既有工行又有招行账户,所有工行银行卡通过工行账户发放(工行同行),所有非工行卡账户都通过招行账户发放(招行同行及跨行); + + D. 既有工行又有招行账户,所有工资发放都通过招行账户发放(单笔超100万转大额) + +## 各地区策略 + +大区 | 支付地抬头 | 路由方案(下拉选项) | 如选E请具体说明 +--- | --- | --- | --- +北京 | 北京易才人力资源顾问有限公司 | C | +北京 | 北京智唯易才人力咨询有限公司 | D | +北京 | 北京宏瀚管理顾问有限公司 | B | +北京 | 北京宏荣管理顾问有限公司 | B | +北京 | 北京宏裕管理顾问有限公司 | B | +北京 | 北京易才营销顾问有限公司 | C | +北京 | 北京易才人力资源顾问有限公司太原分公司 | A | +北京 | 北京易才人力资源顾问有限公司长春分公司 | A | +北京 | 北京易才人力资源顾问有限公司南昌分公司 | A | +上海 | 上海智联易才人力资源顾问有限公司 | D | +上海 | 上海智联易才人才咨询有限公司 | D | +上海 | 上海易宏人力资源服务有限公司 | D | +北区 | 青岛易才人力资源顾问有限公司 | D | +北区 | 天津智唯易才人力资源顾问有限公司 | D | +北区 | 呼和浩特市易才人力资源有限责任公司 | A | +北区 | 大连易才人力资源顾问有限公司 | D | +北区 | 河南易才人力资源咨询有限公司 | D | +北区 | 沈阳易才人力资源顾问有限公司 | D | +北区 | 河北智联易才人力资源顾问有限公司 | D | +北区 | 济南易才人力资源顾问有限公司 | D | +南区 | 福州智唯易才人力资源顾问有限公司 | D | +南区 | 长沙易才人力资源顾问有限公司 | D | +南区 | 长沙智唯劳务服务有限公司 | A | +南区 | 东莞市易才人力资源顾问有限公司 | D | +南区 | 东莞市易才人力资源顾问有限公司松山湖分公司 | B | +南区 | 武汉智唯易才人力资源顾问有限公司 | D | +南区 | 广州智唯易才企业管理顾问有限公司 | D | 万宁,乐金,中安保,TVB工资需工行发放,线下发放 +南区 | 广州智唯易才企业管理顾问有限公司湛江分公司 | A | +南区 | 海口易才人力资源咨询有限公司 | A | +南区 | 厦门智唯易才人力资源顾问有限公司泉州分公司 | A | +南区 | 厦门智唯易才人力资源顾问有限公司 | C | +南区 | 广西易才人力资源顾问有限公司 | D | +南区 | 深圳易才人力资源顾问有限公司 | D | 联通通过代发e发放,线下发放 +南区 | 深圳易薪人力资源顾问有限公司 | D | +西区 | 西安易才人力资源顾问有限公司 | D | +西区 | 成都智唯易才人力资源顾问有限公司 | C | +西区 | 西安易才人力资源顾问有限公司兰州分公司 | D | +西区 | 西安易才人力资源顾问有限公司乌鲁木齐分公司 | A | +西区 | 新疆智唯易才人力资源顾问有限公司 | A | +西区 | 青海易才人力资源顾问有限公司 | D | +西区 | 西藏易才人力资源顾问有限公司 | D | +西区 | 贵州易才人力资源顾问有限公司 | D | +西区 | 云南易才人力资源顾问有限公司 | D | +西区 | 重庆易才人力资源顾问有限公司 | C | +东区 | 南京易才人力资源有限公司 | D | +东区 | 南京易才人力资源有限公司高淳分公司 | A | HRO系统未单独设置组织架构,目前仅为返还代发6家 +东区 | 南通易才人力资源有限公司 | D | +东区 | 泰州易才人力资源顾问有限公司 | A | +东区 | 杭州易才人力资源管理有限公司 | D | +东区 | 淮安易才人力资源顾问有限公司 | A | +东区 | 无锡易才人力资源顾问有限公司 | D | +东区 | 南京易才人力资源有限公司镇江分公司 | A | +东区 | 常州智易人力资源服务有限公司 | A | +东区 | 安徽智易人力资源顾问有限公司 | D | 特殊客户:华夏银行股份有限公司合肥分行 +东区 | 南京易才人力资源有限公司温州分公司 | D | +东区 | 扬州易才人力资源顾问有限公司 | D | +东区 | 宁波易才人力资源咨询有限公司 | D | +东区 | 苏州易才人力资源顾问有限公司 | D | +东区 | 苏州易才人力资源顾问有限公司园区分公司 | D | diff --git a/风控.md b/风控.md new file mode 100644 index 0000000..326832b --- /dev/null +++ b/风控.md @@ -0,0 +1,112 @@ +# 风控介绍 + + + +## 风控模型 + +### 客户风控模型 + +![](https://fairy8-1258530674.picsh.myqcloud.com/img/20210131171417.png) + +### 机构风控模型 + +![](https://fairy8-1258530674.picsh.myqcloud.com/img/20210131171836.png) + +### 事件通知模型 + +![](https://fairy8-1258530674.picsh.myqcloud.com/img/20210201092324.png) + + +## 命中后处理方式 + +- 预警 + + - 邮件通知 + - 短信通知 + - 社交群通知(微信、钉钉) + - 监控大屏幕 + +- 拦截 + + - 交易拒绝 + - 审批 + +## 检测方式 + +- 埋点 + +- 探针 + +- 白/黑/灰名单 + +- 行为分析 + +- 数据分析 + +## 易才风控点 + +- 累计(日累、月累、年类) + +- 限额(批限额、笔限额、日限额、月限额、年限额) + +- 接入批次处理异常 + + > 文件处理过程中出现异常 + +- 通道通讯异常 + + > 银行通道心跳探测 + +- fastDFS异常通知 + +- 接出批次回盘异常 + + > 接入/接出批次号、银行通道 + +- 客户风控命中告警 + + > 客户命中风控 + +- 机构风控命中告警 + +- 接入批次长时间未处理完成 + + > 超过设定时间未处理完成 + +- 接出批次长时间未处理完成 + + > 超过设定时间未处理完成 + +- 付款账户余额不足告警 + + > 判断银行余额不足的返回码 + +- 对账文件生成失败 + +- 业务失败/成功率 + +- 各类图表 + + > 机构风控需要根据支付地分组 + +- 余额不够处理情况处理逻辑 + + - 都不发? + - 继续发,足额成功;不足额失败? + + +## 事件列表 + +事件名称 | 事件描述 | 入参 +--- | --- | --- +EVT_DISK_PROC_FAILURE | 接入批次处理异常 | DSK_NO,ERR_MSG +EVT_CHANNEL_COMMU_FAILURE | 通道通讯异常 | CORG_NO,ERR_MSG +EVT_DFS_UPLOAD_FAILURE | FastDFS上传失败 | DSK_NO,FID,ERR_MSG +EVT_DFS_DOWNLOAD_FAILURE | FastDFS下载失败 | DSK_NO,FID,ERR_MSG +EVT_BATCH_SEND_FAILURE | 接出批次送盘异常 | DSK_NO,BAT_NO,ERR_MSG +EVT_BATCH_BACK_FAILURE | 接出批次回盘异常 | DSK_NO,BAT_NO,ERR_MSG +EVT_RISK_BEEN_HIT | 客户风控命中告警 | DSK_NO,CUS_ID,ERR_MSG +EVT_BALANCE_INSUFFICIENT | 余额不足 | DSK_NO,TITLE_NAME,AC_NO,CORG_NO +EVT_DISK_PROC_TIMEOUT | 接入批次长时间未处理完成 | DSK_NO,DSK_STS +EVT_BATCH_PROC_TIMEOUT | 接出批次长时间未处理完成 | DSK_NO,BAT_NO,BAT_STS,CORG_NO +RECONCILIATION_FAILURE | 对账文件失败 | CHK_DT,ERR_MSG