通知参数
回调URL必须由商家提供。
URL
https://xxx/xxx/paymentNotification- 请求参数
- 响应参数
Header
| 字段名 | 是否必需 | 类型 | 描述 |
|---|---|---|---|
Signature | 是 | String | 包含消息的签名值。消息的发起者负责生成签名,而消息的接收者必须验证签名,以确保消息的完整性、真实性和不可否认性。 请参考 附录 1 |
sourceSystem | 是 | String | 消息发起者的系统 ID。 |
Body
请参考 嵌入代码对内容进行加密,并在正文前添加消息类型指示符0025。
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
msgVer | 是 | String | 8 | 版本数字 | "1.0" |
billerType | 是 | String | 2 | 付款类型 | "KP" - KPOS |
callerDeviceType | 是 | String | 2 | 呼叫设备类型. | "KP" - KPOS |
callerDeviceVer | 是 | String | 8 | 呼叫设备的应用版本数字。 | "1" |
sequenceNo | 是 | String | 16 | 在日历日内系统中唯一的运行消息序列数字,每天从 1 重新开始。 | "202409288868" |
mrn | 是 | String | 40 | 由 POS 系统分配的唯一参考数字,用于识别原始支付交易。 | "8e8c6e61-f9e4-40f0-a4a5-9e561579c901" |
resultCode | 是 | String | 5 | 结果代码 | "00000" |
authIdResp | 条件的 | String | 16 | 仅用于已批准交易的发卡行/银行授权码。消费者应将此代码作为已批准支付交易的参考。 | "484684" |
paymentScheme | 条件的 | String | 2 | 交易的支付方案。 | "AF" - 蚂蚁金融(支付宝) "JC" - JCB "MC" - 万事达卡 "PN" - Paynet(DuitNow) "UP" - 银联(前称 CUP) "VS" - Visa |
maskedPAN | 条件的 | String | 4 | 返回的掩码 PAN | "443322XXX1234" |
htr | 条件的 | String | 20 | 主机交易参考 | |
paymentMethod | 条件的 | Number | 2 | 客户选择的最终支付方式,以完成付款。 | "00" - KPOS 将显示所有可用的支付方式,客户可以选择他们的首选方式进行支付。 "01" - 卡支付 "04" - Duitnow QR 支付(商户呈现) "08" - Alipay+ QR 支付(商户呈现) |
advMsg | 可选 | String | 1000 | 来自 KPOS 的建议消息。 | "..." |
paymentType | 条件的 | String | 3 | 指定付款交易的类型,例如销售、预授权或销售完成。 | "PRE" - 预授权交易 |
mid | 是 | String | 15 | 商户 ID | "100000" |
tid | 是 | String | 8 | 终端 ID | "2000200" |
currency | 是 | Number | 3 | 此交易的 ISO 4217 数字货币代码。 | "458" |
amount | 是 | Number | 18 | 金额,交易。 支持货币的购买交易金额。 | "1000" |
visDetails | 条件的 | Object | VIS 交易的分期付款信息 | ||
receiptInfo | 条件的 | Object | 用于生成收据的附加信息。 注: 当 resultCode = "00000" 且 isPaymentReq = "Y" 时返回。 | ||
invoice | 条件的 | Object | 用于向 LHDN 提交的发票对象,以用于电子发票。 注: 当 billerType 为 "KP"(KPOS)且 callerDeviceType 为 "03"(自助服务亭)时返回。 |
Object: visDetails
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
numOfInstalment | 是 | Integer | 按指定频率分期付款的总期数。 | "10" | |
instalmentFrequency | 是 | String | 32 | 付款频率。 | "WEEKLY" - 每周付款一次 "BIWEEKLY" - 每两周付款一次 "MONTHLY" - 每月付款一次 "BIMONTHLY" - 每两个月付款一次 |
instalmentAmount | 是 | Number | 18 | 按指定频率应付的付款金额。 | "1000" |
mdrFee | 是 | Number | 18 | 此 VIS 交易的适用费用。 | "100" |
Object: receiptInfo
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
acqCode | 是 | String | 20 | 收单行代码。 注: 默认值为 FINEXUS。 | "FINEXUS" |
acqMid | 是 | String | 50 | 商户 ID(用于支付处理)。 | "XXXXXXXXXXX3169" |
acqTid | 是 | String | 30 | 收单行终端 ID。 | "XXXX3992" |
stan | 是 | Integer | 终端生成的系统跟踪审计号,用于标识交易。 | "000125" | |
rrn | 是 | String | 12 | 收单行生成的检索参考号,用于标识交易。 | "617683000125" |
authIdResp | 是 | String | 6 | 仅用于已批准交易的发卡行/银行授权码。消费者应将此代码作为已批准支付交易的参考。 | "11XXXX" |
aid | 条件的 | String | 32 | 用于识别卡支付应用的 应用标识符。 注: 当 paymentScheme 为 JC、MC、MD、UP 或 VS 时返回。 | "A000000004XXXX" |
appLabel | 条件的 | String | 64 | 用于识别卡支付应用的应用标签。 注: 当 paymentScheme 为 JC、MC、MD、UP 或 VS 时返回。 | "Debit Mastercard" |
arqc | 条件的 | String | 32 | 卡为特定交易生成的授权请求密文。 注: 当 paymentScheme 为 JC、MC、MD、UP 或 VS 时返回。 | "45DA8D7588XXXXXX" |
Object: invoice
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
invNo | 是 | String | 22 | 发票号码。 注意: 对于新发票提交请求,此字段应包含新发票号码。 对于取消或退款请求,此字段应包含退款或贷项通知单的新发票号码。 | "2024070712121200000001" |
oriInvNo | 条件的 | String | 22 | 原始发票号码。 注意: 对于取消或退款请求,此字段为必填项,以便 KPOS 将请求与正确的原始交易关联。 | "2024070712121200000001" |
invDt | 是 | Number | 8 | 发票日期。 注意: 格式:yyyymmdd | "20240707" |
invTm | 是 | Number | 6 | 发票时间。 注意: 格式:hhmmss | "121212" |
invCur | 是 | Number | 3 | 此交易的 ISO 4217 数字货币代码。 注意: 仅支持货币代码 458 | "458" |
taxCur | 是 | Number | 3 | 税务货币代码。 注意: 仅支持货币代码 458 | "458" |
billFreq | 可选 | String | 2 | 计费频率代码。 | "01" - 每日 "02" - 每周 "03" - 每两周 "04" - 每月 "05" - 每两月 "06" - 每季度 "07" - 每半年 "08" - 每年 "09" - 其他/不适用 |
billStartDt | 条件的 | String | 8 | 计费开始日期。 注意: 格式:yyyymmdd 当 billFreq 不为 09 时为必填项 | "20240701" |
billEndDt | 条件的 | String | 8 | 计费结束日期。 注意: 格式:yyyymmdd 当 billFreq 不为 09 时为必填项 | "20240731" |
totalNet | 是 | Number | 净额合计。 注意: 为 item.totalExclTax 之和 | "27800" | |
totalDisc | 可选 | Number | 折扣总额。 注意: 为 addAllowCharge.allowChargeAmt 之和 | "100" | |
totalFeeCharge | 可选 | Number | 费用/收费总额。 注意: 为 addAllowCharge.allowChargeAmt 之和 | "100" | |
totalExclTax | 是 | Number | 不含税总额。 注意: totalExclTax = totalNet – totalDisc + totalFeeCharge | "27800" | |
totalTax | 是 | Number | 税额合计。 注意: 为 item.taxAmt 之和 | "0" | |
totalInclTax | 是 | Number | 含税总额。 注意: totalInclTax = totalExclTax + totalTax | "27800" | |
pmtMode | 可选 | Number | 付款方式。 | "01" - 现金 "02" - 支票 "03" - 银行转账 "04" - 信用卡 "05" - 借记卡 "06" - 电子钱包/数字钱包 "07" - 数字银行 "08" - 其他 | |
supplierAcctNo | 可选 | String | 150 | 供应商账号。 | "SUPPLIER-ACC-001" |
prePmtAmt | 可选 | Number | 预付款金额。 | "100" | |
prePmtDt | 可选 | Number | 8 | 预付款日期。 注意: 格式:yyyyMMdd | "20240630" |
prePmtTm | 可选 | Number | 6 | 预付款时间。 注意: 格式:hhmmss | "120000" |
prePmtRefNo | 可选 | String | 150 | 预付款参考号。 | "PREPMT-REF-001" |
roundAmt | 可选 | Number | 舍入金额。 注意: 可为负值。 示例:若为负 MYR 0.10,则值为 -10 若为正 MYR 0.10,则值为 +10 | "-10" | |
totalPayable | 是 | Number | 应付总额。 注意: totalPayable = totalInclTax-prePmtAmt+roundAmt | "27800" | |
billRefNo | 可选 | String | 150 | 账单参考号。 | "BILL-REF-001" |
items | 是 | Array | 构成发票的各个发票项目。 | ||
addAllowCharge | 可选 | Array | 附加津贴/费用。 | ||
shippingRecipient | 可选 | Object | 收货人。 | ||
denyIndividualEInvoice | 可选 | String | 1 | 指示是否阻止客户请求个人电子发票。 注意: 可能值: "Y" - 阻止客户请求个人发票;客户可通过 FIDU 网页/应用查看发票。 "N" - 允许客户请求个人发票。 如果此字段不存在,默认值为 N。 | "N" |
eSignature | 条件的 | String | 512 | 电子签名。 注意: 详情请参阅 FINEXUS FIDU QR 规范。 提交发票且 denyIndividualEInvoice 不存在或为 'N' 时此字段为必填项 不适用于 getDocument 响应 | "AbCDefghijklmnop" |
pinCode | 条件的 | Number | 6 | 用于保护发票不被未经授权人员认领的 6 位 PIN 码。 注意: 详情请参阅 FINEXUS FIDU QR 规范。 提交发票且 denyIndividualEInvoice 不存在或为 'N' 时此字段为必填项 不适用于 getDocument 响应 | "000000" |
Object: invoice item
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
oriInvNo | 条件的 | String | 22 | 原始发票号码。 注意: 取消或退款请求时为必填项。 | "2024070712121200000001" |
classCde | 是 | String | 3 | 分类代码。 注意: 详情请参阅 附录 6。 | "038" - 体育设备、体育设施租赁/入场费或体育比赛注册 |
desc | 是 | String | 300 | 产品/服务描述。 | "Li-Ning Wind Lite" |
uom | 可选 | String | 3 | 计量单位。 | "MTR" - 米 "EA" - 件 "H87" - 个 "KGM" - 千克 "LTR" - 升 |
unitPrice | 是 | Number | 单价。 | "27800" | |
qty | 可选 | String | 31 | 数量。 注意: 允许值:数字和 "." | "1" |
subtotal | 是 | Number | 小计。 注意: subtotal = unitPrice*qty | "27800" | |
discRate | 可选 | Number | 折扣率。 注意: 折扣率百分比(满分 100) | "10" | |
discAmt | 条件的 | Number | 折扣金额。 注意: 当 discRate 不为空时为必填项 | "100" | |
feeRate | 可选 | Number | 费用/收费率。 | "5" | |
feeAmt | 条件的 | Number | 费用/收费金额。 注意: 当 feeRate 不为空时为必填项 | "100" | |
totalExclTax | 是 | Number | 不含税总额。 注意: totalExclTax = subtotal-discAmt+feeAmt | "27800" | |
taxTyp | 是 | String | 2 | 税种。 | "01" - 销售税 "02" - 服务税 "03" - 旅游税 "04" - 高价值商品税 "05" - 低价值商品销售税 "06" - 不适用 |
taxRate | 条件的 | Number | 税率。 注意: 当 taxTyp 不为 06 时为必填项 | "6" | |
taxExemptInd | 可选 | String | 1 | 免税指示符。 注意: 可能值: "Y" – 是 "N" – 否 [默认] | "N" |
taxExemptDtl | 条件的 | String | 300 | 免税详情。 注意: 当 taxExemptInd=Y 时为必填项 | "免税详情" |
taxExemptAmt | 条件的 | Number | 免税金额。 注意: 当 taxExemptInd=Y 时为必填项 | "100" | |
taxAmt | 条件的 | Number | 税额。 注意: 当 taxTyp 不为 06 时为必填项 | "100" | |
totalInclTax | 是 | Number | 含税总额。 | "27800" | |
prodTariffCde | 可选 | String | 12 | 产品关税代码。 | "TARIFF-001" |
oriCountry | 可选 | String | 3 | 原产国。 | "MYS" - 马来西亚 "SGP" - 新加坡 |
originSystemType | 可选 | String | 2 | 来源系统类型。 | "01" |
originSystem | 可选 | String | 50 | 来源系统。 | "POS" |
originModule | 可选 | String | 50 | 来源模块。 | "SALES" |
originBranch | 可选 | String | 50 | 来源分支机构。 | "HQ" |
originDept | 可选 | String | 50 | 来源部门。 | "RETAIL" |
originGLAccNo | 可选 | String | 20 | 来源总账账号。 | "4000-001" |
originGLType | 可选 | String | 1 | 来源总账类型。 | "R" |
originCustNo | 可选 | String | 20 | 来源客户编号。 | "CUST-001" |
originAcctNo | 可选 | String | 20 | 来源账户编号。 | "ACCT-001" |
originProdTyp | 可选 | String | 20 | 来源产品类型。 | "RETAIL" |
originTrxCde | 可选 | String | 20 | 来源交易代码。 | "SALE" |
givenItemId | 条件的 | String | 64 | 商户分配的项目标识符。 注意: 如果在 KBIZ 中配置了菜单项,则为必填项。 | "ITEM-038-001" |
Object: allowance charge
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
allowChargeTyp | 是 | String | 1 | 津贴/费用类型。 | "C" - 费用/收费 "D" - 折扣 |
allowChargeDesc | 是 | String | 100 | 津贴/费用描述。 | "配送费" |
allowChargeAmt | 条件的 | Number | 津贴/费用金额。 | "100" |
Object: shipping recipient
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
name | 可选 | String | 300 | 收货人姓名。 | "John Doe" |
addr1 | 是 | String | 150 | 收件人地址 1。 | "Lot 66" |
addr2 | 可选 | String | 150 | 收件人地址 2。 | "Bangunan Merdeka" |
addr3 | 可选 | String | 150 | 收件人地址 3。 | "Persiaran Jaya" |
state | 是 | String | 2 | 收件人州属。 注意: 详情请参阅 附录 7。 | "14" - 吉隆坡联邦直辖区 |
city | 是 | String | 50 | 收件人城市。 | "Kuala Lumpur" |
postcode | 可选 | String | 50 | 收件人邮政编码。 | "50480" |
country | 是 | String | 3 | 收件人国家。 注意: 仅接受值:MYS | "MYS" |
tin | 可选 | String | 16 | LHDN 系统分配的收货人 TIN。 | "C12345678900" |
idType | 可选 | String | 8 | NRIC、护照号码、商业注册号、军人证号。 注意: 可能值: - NRIC - PASSPORT - BRN - ARMY | "NRIC" |
idValue | 可选 | String | 64 | 与 idType 关联的 ID 值。 | "200228105338" |
必填/条件字段
| 字段名 | 是否必需 | 类型 | 长度 | 描述 | 示例 |
|---|---|---|---|---|---|
sequenceNo | 是 | String | 16 | 从请求回显的序列数字。 | "1726817309256" |
resultCode | 是 | String | 5 | 结果代码 | "00000" |
示例请求和响应主体
- 请求
- 请求
从主体中移除消息类型指示符 0025 并解密内容.
解密之前
0025eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsImtpZCI6ImU4NmQ0Y2ZiLTFkNzMtNDJkNi05MGVlLWRlNWJlNjcwMjVlOSIsIngiOiI0UmxIeDAzX3ZlTURWaGFaTl91TVppZ2YzV1dPWGlveG52Zy1rRXhyMzFrIiwieSI6ImcyU1VqNkJnVHdYakxWYWlTRnVobGtSWklrMndaWlNaMWJEWG1DSTZSVXcifSwia2lkIjoiMTIzIiwiZW5jIjoiQTI1NkNCQy1IUzUxMiIsImFsZyI6ImRpciJ9..UIzHIjrFX8fPX91SEUzZpA.9hmtgLHx_UZjYTwduAtdruZB60QPRPjvczVeJwSI7tomXmEU720zuokvMdf9VxQqHOh2PHvtTtqW8OZQuIqYyDmss06ii-fy73a897AJv2KXPARY6DduoiLSJwDCJKhBiJlnZkAMyRZdB5xGzJwXL21QaXbO86EF6_d9qzrOhQvrNlfkTOBQYnv5Mhnnetda0_zm59HRMW2mg-rEOGj1W0Q4U0I8ZZrXQSxO3MnalxuzWQ4oTU2uHZrFnsyL93PeKiG_RmIszQGXqG0bN8WsoJfL0BTd20rnxldLQcSZYNdxGJw0EBGwlSp7DTpcmP1kzd1v2PzLGISZiPa9zadcVuLaODBZQ5GdHoPgIi76pTRwDJrv1CuD8ugfuuu_L5DxFIErnqs5cTONqxhCQ23ZeCSbnuDJDJju9yyr2wYoFFKQQciZmPddPgi2phew31DRjju4y4Ab6H7Vv01gqk6h2b9clR7v54wZSvR0CVROLZj79nKM1eLDhEo8JEv6T5APb2EHMTaU-sIlT-XqENbwV-A5HSEuEdvU7K3fsgioU5qJWwk9SS1WWmyqHnvCK1Rl5azJcKbfyN07a7znZD66IAoSUoCHjsqmFC4bd6ckdLA.Q3Ys35PhzHsnNnlJQ3rzwR-RsfEmYeDxXDsw9h97Azo
移除消息类型指示符并解密后
{
"msgVer": "1.0",
"billerType": "KP",
"callerDeviceType": "KP",
"callerDeviceVer": "1",
"sequenceNo": "2022091511262185",
"mrn": "8e8c6e61-f9e4-40f0-a4a5-9e561579c901",
"resultCode": "000000",
"authIdResp": "484684",
"paymentScheme": "VS",
"maskedPAN": "443322XXX1234",
"htr": "",
"paymentMethod": "01",
"paymentType": "PRE",
"mid": "000010000012XXX",
"tid": "2000XXX",
"currency": "458",
"amount": "27800"
}
加密内容并在正文前添加消息类型指示符0026。
加密之前
{
"sequenceNo": "2022091511262185",
"resultCode": "00000"
}
加密后添加消息类型指示符
0026eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsImtpZCI6ImI0YjIxMmM5LTIyNjMtNDAxYi1hZjdkLTMwOWI3MjRlOTEzOSIsIngiOiJvYmx1ZFdKRy1TTWJlakVqY1hlY3Q2dl9zY19ZZExyTzUtWEV2ZGFZQjdNIiwieSI6Il9MaFdTUDRrUUMwSkpWc09GMkJndWpfamc3dFZSMlRRcTctVExoUFZOeFUifSwia2lkIjoiOGM0MDFlYWMtYjM0OS00MDIyLWJhYTItZWNhMmQ3M2I4NTc5IiwiZW5jIjoiQTI1NkNCQy1IUzUxMiIsImFsZyI6ImRpciJ9..L2N0tzgQbvbbqjTa5XFCeA.TIgLgaNOwqFEchw3r0ls75zFL74mWBCJjuQFm7e7a2Ahk83m_xoS47g6m-Y7AewFcGFWBKbb4i0aGKW1moH70g.4JNcfZMyJqQKcadQIfxb224fqiM3MoUQ5ytA7lUQ4Bw
示例消息
- 请求
- 响应
POST 请求
curl -X POST "https://xxx/xxx/paymentNotification" \
-H "Accept: application/json" \
-H "Content-Type: text/plain" \
-H "Signature: ..." \
-H "sourceSystem: ..." \
-d '0025eyJlcGsiOnsia3R5IjoiRUMiLCJ...'
POST 响应
0026eyJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsImtpZCI6ImI0YjIxMmM5LTIyNjMtNDAxYi1hZjdkLTMwOWI3MjRlOTEzOSIsIngiOiJvYmx1ZFdKRy1TTWJlakVqY1hlY3Q2dl9zY19ZZExyTzUtWEV2ZGFZQjdNIiwieSI6Il9MaFdTUDRrUUMwSkpWc09GMkJndWpfamc3dFZSMlRRcTctVExoUFZOeFUifSwia2lkIjoiOGM0MDFlYWMtYjM0OS00MDIyLWJhYTItZWNhMmQ3M2I4NTc5IiwiZW5jIjoiQTI1NkNCQy1IUzUxMiIsImFsZyI6ImRpciJ9..L2N0tzgQbvbbqjTa5XFCeA.TIgLgaNOwqFEchw3r0ls75zFL74mWBCJjuQFm7e7a2Ahk83m_xoS47g6m-Y7AewFcGFWBKbb4i0aGKW1moH70g.4JNcfZMyJqQKcadQIfxb224fqiM3MoUQ5ytA7lUQ4Bw