December 27, 2021
简单来说,Credit transfer 就是将一笔钱从一个账号体系的某账户转移到另一个账号体系的某账号,这就是支付最本质最精髓的东西 —— money movement,也就是所有权的转移。
ISO 20022 精准的定义了这个过程,以下是 WalletsNet 的实践,从信息流的角度看,一次 Credit transfer / money movement 的过程中一般会出现这么几种情况:
一个正常的 Credit transfer 完整的流程如下图所示:
如果遇到以下情况,参与者发送给 WalletsNet 的消息会被驳回:
⚠️ 收款方必须在 10秒内(自交易发起时开始计时)反馈是否接受交易,若收款方未能在规定的时间(10秒)内向 WalletsNet 返回交易处理的报文,则 WalletsNet 认为交易已经超时,然后会主动向交易的双方发送交易被取消的报文,交易结束,交易双方应当各自在自己的系统内撤销交易(如下图)。
下图只是交易超时的一种场景,实际上交易超时会在很多情况下出现,比如,在下图中,可能2这一步直接就失败了,即 B 的服务可能已经中断了, WalletsNet 即使经过几次重试也无法将消息发送给B,那么也会造成交易超时。
对方机构收到 credit transfer 的交易请求(即 pacs.008)后,如果想拒绝这笔交易,则发送 Negative 的反馈消息就行了,WalletsNet 收到 Negative 的反馈消息后什么也不做,直接转发给付款方FI。
本文详细介绍了 Credit Transfer 的基本交易流程,了解了该流程就可以轻松构建出很多互联互通的交易场景了,比如 P2P 跨境汇款、跨境电商收款、面对面付款等等。
实际上 Credit Transfer 还有很多更高级的玩法,比如:
各种场景千变万化,看似异常复杂,其实基本原理都是一样的, WalletsNet 也都是完美的支持的,这些复杂场景我们以后以案例的形式慢慢再分享吧。
pacs.008 报文使用场景:
编号 | 发出方 | 收到方 | 备注 |
---|---|---|---|
1 | 付款方 FI | WalletsNet | 付款方发出付款报文 |
2 | WalletsNet | 收款方 FI | 转发付款方的付款指令给收款方 |
以下 pacs.008 message sample 对应的场景为「编号-1」
xxxxxxxxxx
1481{
2 "AppHdr": {
3 "Fr": {
4 "FIId": {
5 "FinInstnId": {
6 "ClrSysMmbId": {
7 "MmbId": "EMTRHKDDXXX"
8 }
9 }
10 }
11 },
12 "To": {
13 "FIId": {
14 "FinInstnId": {
15 "ClrSysMmbId": {
16 "MmbId": "WCSMHKHKXXX"
17 }
18 }
19 }
20 },
21 "BizMsgIdr": "B20211222EMTRHKDDXXXBPSP93891116714",
22 "MsgDefIdr": "pacs.008.001.09",
23 "CreDt": "2021-12-22"
24 },
25 "Document": {
26 "FIToFICstmrCdtTrf": {
27 "CdtTrfTxInf": {
28 "Cdtr": {
29 "Nm": "Laura Simon",
30 "Id": { // [选填] 这里为合规信息,即付款人的身份信息
31 "PrvtId": {
32 "DtAndPlcOfBirth": {
33 "BirthDt": "1980-12-13" // 出生日期
34 },
35 "Othr": {
36 "Id" : "K0000000CHN8008080HK888888888", // 身份证、护照或其他证件编号
37 "SchmeNm" : {
38 "Cd" : "PD" // 证件类型 PD 护照 , IDC 身份证
39 }
40 },
41 "Issr": "CN" // 签发国代码
42 }
43 },
44 "CtryOfRes": "HK" // 国籍
45 },
46 "CdtrAcct": {
47 "Id": {
48 "Othr": {
49 "Id": "dca1d9ce1e5b774cb80186e7c5916edd" // 收款人账户id
50 }
51 }
52 },
53 "CdtrAgt": {
54 "FinInstnId": {
55 "ClrSysMmbId": {
56 "MmbId": "RPAYUSUSXXX" // 收款机构在wNet的Member Id
57 }
58 }
59 },
60 "ChrgBr": "SLEV", // 固定值,表示双边约定
61 "Dbtr": {
62 "Nm": "Monica Rios", // 付款人姓名
63 "Id": { // [选填] 这里为合规信息,即收款人的身份信息
64 "PrvtId": {
65 "DtAndPlcOfBirth": {
66 "BirthDt": "1980-12-13" // 出生日期
67 },
68 "Othr": {
69 "Id" : "K0000000CHN8008080HK888888888", // 身份证、护照或其他证件编号
70 "SchmeNm" : {
71 "Cd" : "PD" // 证件类型 PD 护照 , IDC 身份证
72 }
73 },
74 "Issr": "CHN" // 签发国代码
75 }
76 },
77 "CtryOfRes": "HKG" // 国籍
78 },
79 "DbtrAcct": {
80 "Id": {
81 "Othr": {
82 "Id": "c62be448a7be549640fb5bbab372575c" // 付款人账户ID
83 }
84 }
85 },
86 "DbtrAgt": {
87 "FinInstnId": {
88 "ClrSysMmbId": {
89 "MmbId": "EMTRHKDDXXX" // 付款机构在wNet的Member Id
90 }
91 }
92 },
93 "InstdAgt": {
94 "FinInstnId": {
95 "ClrSysMmbId": {
96 "MmbId": "RPAYUSUSXXX" // 报文接收方,与 CdtrAgt 保持一致
97 }
98 }
99 },
100 "InstgAgt": {
101 "FinInstnId": {
102 "ClrSysMmbId": {
103 "MmbId": "EMTRHKDDXXX" // 报文发起方,与 DbtrAgt 保持一致
104 }
105 }
106 },
107 "InstdAmt": {
108 "Amount": "100", // 交易金额 / 指令金额,通常收款方FI以此金额为收款人入账
109 "Ccy": "HKD" // 交易币种 / 指令币种,通常收款方FI以此币种为收款人入账
110 },
111 "XchgRate": "0.1348", // 汇率(由双边机构自行约定), 1 InstdAmt.Amount = _?_ IntrBkSttlmAmt.Amount,所以此处代表 1 HKD = 0.1348 USD
112 "IntrBkSttlmAmt": {
113 "Amount": "13.48", // 结算金额, 指双边机构实际交收的金额
114 "Ccy": "USD" // 结算币种, 指双边机构实际交收的币种
115 },
116 "PmtId": {
117 "InstrId": "20211222EMTRHKDDXXXBWPSP24706048691", // 交易指令ID,由发起方指定, 全局唯一
118 "EndToEndId": "20211222EMTRHKDDXXXBWPSP24706048691", // E2EID,用来唯一追踪定位一笔交易
119 "TxId": "20211222EMTRHKDDXXXBWPSP24706048691" // 交易ID,由发起方指定,如用来做内部的对账
120 },
121 "PmtTpInf": {
122 "LclInstrm": {
123 "Prtry": "BUSINESS" // BUSINESS 表示付款人为公司; CONSUMER 表示付款人为个人
124 },
125 "SvcLvl": {
126 "Cd": "SDVA" // 固定值,ISO定义为Same Day Value,即当日结算
127 }
128 }
129 },
130 "GrpHdr": {
131 "CreDtTm": "2021-12-22T21:09:16.232188+08:00",
132 "MsgId": "M20211222EMTRHKDDXXXBPSP65659283900", // 消息ID,发起方保证唯一性,此ID在将来可能会被其他消息关联,例如退款消息
133 "NbOfTxs": 1, // 交易数量, 只支持1
134 "SttlmInf": {
135 "ClrSys": {
136 "Cd": "WCSMHKHKXXX" // 固定值
137 },
138 "SttlmMtd": "CLRG" // 固定值, 表示交易通过 Clearing System 来进行结算
139 },
140 "TtlIntrBkSttlmAmt": {
141 "Amount": "13.48", // 结算总金额, WalletsNet只支持一个消息一笔交易, 所以此处必须和 IntrBkSttlmAmt 里面的金额保持一致
142 "Ccy": "USD" // 结算币种,和 IntrBkSttlmAmt 里面的币种必须保持一致
143 }
144 }
145 }
146 }
147}
148
pacs.002 报文使用场景:
编号 | 发出方 | 收到方 | 备注 |
---|---|---|---|
1 | WalletsNet | 付款方 FI | WalletsNet 通知付款方 FI 最终交易结果 |
2 | WalletsNet | 付款方 FI | WalletsNet 驳回收款方 FI 提交的付款交易 |
3 | 收款方 FI | WalletsNet | 收款方 FI 向 WalletsNet 反馈交易处理状态(接受/拒绝) |
4 | WalletsNet | 收款方 FI | WalletsNet 通知收款方 FI 最终交易结果 |
以下 pacs.002 message sample 对应的场景为「编号-3」
xxxxxxxxxx
581{
2 "AppHdr": {
3 "BizMsgIdr": "B20211221BPSP02019983440", // 消息的业务ID,发报方自定义
4 "CreDt": "2021-12-21", // 消息发出的日期
5 "Fr": {
6 "FIId": {
7 "FinInstnId": {
8 "ClrSysMmbId": {
9 "MmbId": "{收款方机构PID}" // 发报方的PID
10 }
11 }
12 }
13 },
14 "MsgDefIdr": "pacs.002.001.11", // 报文类型和版本
15 "To": {
16 "FIId": {
17 "FinInstnId": {
18 "ClrSysMmbId": {
19 "MmbId": "{WalletsNet的PID}" // 收报方的 PID,固定值,为WalletsNet的PID
20 }
21 }
22 }
23 }
24 },
25 "Document": {
26 "FIToFIPmtStsRpt": {
27 "GrpHdr": {
28 "MsgId": "20211221BWPSP79344374600", // 消息ID
29 "CreDtTm": "2021-12-21T15:01:11.250899+08:00" // 消息生成时间
30 },
31 "OrgnlGrpInfAndSts": {
32 "OrgnlCreDtTm": "", // 原报文体中的创建时间
33 "OrgnlMsgId": "", // 原报文头的BizMsgIdr
34 "OrgnlMsgNmId": "pacs.008.001.09", // 原报文的类型和版本
35 "OrgnlNbOfTxs": 1 // 原报文中包含的交易数,固定值,1
36 },
37 "TxInfAndSts": {
38 "AccptncDtTm": "2021-12-21T15:01:11.250925+08:00", // 接受交易的时间
39 "InstgAgt": {
40 "FinInstnId": {
41 "ClrSysMmbId": {
42 "MmbId": "{收款方机构PID}" // 指定发起方
43 }
44 }
45 },
46 "InstdAgt": {
47 "FinInstnId": {
48 "ClrSysMmbId": {
49 "MmbId": "{收款方机构PID}" // 指令接收方
50 }
51 }
52 },
53 "OrgnlInstrId": "20211221BWPSP13688107491", // 原报文中的指令ID
54 "TxSts": "RCVD" // 反馈状态,RCVD为接受该笔交易,RJCT为拒绝该笔交易
55 }
56 }
57 }
58}
📝 当 WalletsNet 以 pacs.002 驳回时,TxSts 为 DS0H,即 Signer is not allowed to sign for this account.
admi.002 报文使用场景:
编号 | 发出方 | 收到方 | 备注 |
---|---|---|---|
1 | WalletsNet | 付款方 FI | WalletsNet 驳回付款方 FI 提交的报文,如格式有误、业务无法处理等 |
以下 admi.002 message sample 对应的场景为「编号-1」
xxxxxxxxxx
361{
2 "AppHdr": {
3 "BizMsgIdr": "B20211217WCSMHKHKXXXBPSP03729053486",
4 "CreDt": "2021-12-17",
5 "Fr": {
6 "FIId": {
7 "FinInstnId": {
8 "ClrSysMmbId": {
9 "MmbId": "WCSMHKHKXXX"
10 }
11 }
12 }
13 },
14 "MsgDefIdr": "admi.002.001.01",
15 "To": {
16 "FIId": {
17 "FinInstnId": {
18 "ClrSysMmbId": {
19 "MmbId": "{收件方 PID}"
20 }
21 }
22 }
23 }
24 },
25 "Document": {
26 "MsgRjct": {
27 "RltdRef": {
28 "Ref": "B20211217BPSP51718094661" // 与该条消息关联的消息 BizMsgIdr
29 },
30 "Rsn": {
31 "AddtlData": "...",
32 "RjctgPtyRsn": "DU01" // WalletsNet 驳回该消息的原因
33 }
34 }
35 }
36}
Reason Code | 说明 | ISO Description |
---|---|---|
AC14 | 收款方账号错误 | Creditor account type missing or invalid |
AG01 | 不允许的交易类型 | Transaction forbidden on this type of account (formerly NoAgreement) |
AG09 | 未找到引⽤的消息报文 | Original payment never received. |
AGNT | 未知的参与⽅ | Agent in the payment workflow is incorrect |
AM01 | 交易⾦额为0 | Specified message amount is equal to zero |
AM06 | 交易⾦额为负数 | Specified transaction amount is less than agreed minimum. |
AM09 | 交易⾦额错误 | Amount received is not the amount agreed or expected |
AM11 | 交易币种错误 | Transaction currency is invalid or missing |
AM13 | 交易⾦额超出上限 | Transaction amount exceeds limits set by clearing system |
CURR | 不允许的交易币种 | Currency of the payment is incorrect |
DT02 | 时间格式错误 | Invalid creation date and time in Group Header (eg, historic date) |
DS0H | 参与⽅不存在或者签名错误 | Signer is not allowed to sign for this account. |
DU01 | MessageId 重复 | Message Identification is not unique. |
FF06 | 未知的枚举类型 | Category Purpose code is missing or invalid |
HD02 | Member Id 未找到 | |
IN01 | 业务流程错误 |
camt.056 报文使用场景:
编号 | 发出方 | 收到方 | 备注 |
---|---|---|---|
1 | WalletsNet | 付款方 FI | WalletsNet 通知交易被取消 |
2 | WalletsNet | 收款方 FI | WalletsNet 通知交易被取消 |
以下 camt.056 message sample 对应的场景为「编号-1」或者「编号-2」
xxxxxxxxxx
851{
2 "AppHdr": {
3 "BizMsgIdr": "B20211216WCSMHKHKXXXBPSP47412931010",
4 "CreDt": "2021-12-16",
5 "Fr": {
6 "FIId": {
7 "FinInstnId": {
8 "ClrSysMmbId": {
9 "MmbId": "WCSMHKHKXXX"
10 }
11 }
12 }
13 },
14 "MsgDefIdr": "camt.056.001.09",
15 "To": {
16 "FIId": {
17 "FinInstnId": {
18 "ClrSysMmbId": {
19 "MmbId": "{收件方 PID}"
20 }
21 }
22 }
23 }
24 },
25 "Document": {
26 "FIToFIPmtCxlReq": {
27 "Assgnmt": {
28 "Assgne": {
29 "Agt": {
30 "FinInstnId": {
31 "ClrSysMmbId": {
32 "MmbId": "指令接收方 PID"
33 }
34 }
35 }
36 },
37 "Assgnr": {
38 "Agt": {
39 "FinInstnId": {
40 "ClrSysMmbId": {
41 "MmbId": "指令发出方 PID"
42 }
43 }
44 }
45 },
46 "CreDtTm": "2021-12-16T20:35:22.290226+08:00",
47 "Id": "16667290383688761345"
48 },
49 "Case": {
50 "Cretr": {
51 "Agt": {
52 "FinInstnId": {
53 "ClrSysMmbId": {
54 "MmbId": "Case发起方,即指令发出方 PID"
55 }
56 }
57 }
58 },
59 "Id": "16667290383688761344"
60 },
61 "Undrlyg": {
62 "OrgnlGrpInfAndCxl": {
63 "OrgnlMsgId": "对应原报文的 MsgId",
64 "OrgnlMsgNmId": "pacs.008.001.009" // 对应原报文的 scheme
65 },
66 "TxInf": { // 以下字段均来自原 Message,用于收件方查找原交易
67 "CxlRsnInf": {
68 "Rsn": {
69 "Cd": "DS24" // 交易取消的原因
70 }
71 },
72 "OrgnlClrSysRef": "20211216XPAYHKHHXXXBWPSP15743949903",
73 "OrgnlEndToEndId": "20211216XPAYHKHHXXXBWPSP15743949903",
74 "OrgnlInstrId": "20211216XPAYHKHHXXXBWPSP15743949903",
75 "OrgnlIntrBkSttlmAmt": {
76 "Amount": "38.94",
77 "Ccy": "HKD"
78 },
79 "OrgnlIntrBkSttlmDt": "2021-12-16",
80 "OrgnlTxId": "20211216XPAYHKHHXXXBWPSP15743949903"
81 }
82 }
83 }
84 }
85}