Dispute API
概述
Dispute API 为商户提供争议案件查询、抗辩材料提交以及平台异步通知接受能力。本文档覆盖争议处理的两类业务场景,两者共用同一套异步通知机制,但业务流程与商户处理方式不同,请商户结合自身业务场景区分对接:
争议拒付(Chargeback Dispute):发卡行对某笔交易正式发起拒付。商户需通过本 API 查询争议案件、提交抗辩材料、接受争议结果。
拒付预警(Dispute Alert):基于 Ethoca 的拒付预警服务。发卡行确认欺诈或持卡人发起争议时,平台推送预警通知,并视情况自动退款或转入人工退款流程。商户仅需接收通知,无需主动查询或抗辩。
一、争议类型总览
两类业务均由平台通过异步通知推送给商户,事件码统一为 "Dispute",但通知内容与商户动作不同。对接前请先确认当前通知属于哪类业务:
| 对比项 | 争议拒付(Chargeback Dispute) | 拒付预警(Dispute Alert) |
|---|---|---|
| 触发来源 | 发卡行正式发起拒付(Chargeback) | Ethoca 告警:确认欺诈(Confirmed Fraud)或客户争议(Customer Dispute) |
| 商户交互 | 查询(dispute.query)、提交/更新抗辩(dispute.defend) | 仅接收异步通知,回复 SUCCESS |
| 涉及接口 | 异步通知 + dispute.query + dispute.defend | 仅异步通知 |
快速判断:通知中
disputeType为Dispute Alert的,属于拒付预警;disputeType为Chargeback的属于争议拒付。
二、异步通知
2.1 通知机制(两类业务通用)
平台主动向商户配置的回调地址推送通知。商户必须返回字符串 SUCCESS 以确认收到。
2.2 争议拒付通知(Chargeback Dispute)
通知类型由 disputeInfo.disputeMode 决定。
| disputeMode | 说明 |
|---|---|
DISPUTE_NOTIFICATION | 有新的争议针对商户提出 |
DOCUMENT_ERROR_NOTIFICATION | 已提交的抗辩文件存在问题,需重新上传 |
DISPUTE_NOTIFICATION:
{
"eventCode": "Dispute",
"action": {
"type": "accept",
"suggestion": "A cardholder is claiming that they did not authorize or participate in a transaction that you processed. ..."
},
"disputeInfo": {
"ARN": "74678814244000020091002",
"caseNo": "2025051518140410700026",
"disputeAmount": {"currency": "USD", "value": "44.99"},
"disputeCode": "10.4",
"disputeEndtime": "2024-09-18T19:00:00Z",
"disputeMessage": "Other Fraud - Card- Absent Environment",
"disputeMode": "DISPUTE_NOTIFICATION",
"disputeSettlementAmount": {"currency": "USD", "value": "44.99"},
"disputeType": "Chargeback",
"paymentBrand": "VIS",
"recordTime": "2025-05-15T10:14:04Z",
"status": "notified"
},
"merchantTransInfo": {
"merchantTransID": "T505141747192201380",
"merchantTransTime": "2025-05-14T11:10:01+08:00"
},
"storeInfo": {
"merName": "集团号唯一性测试",
"storeName": "xzsGroupTest1"
},
"transAmount": {"currency": "CNY", "value": "1.00"}
}DOCUMENT_ERROR_NOTIFICATION:
{
"eventCode": "Dispute",
"disputeInfo": {
"caseNo": "2025052015150461400351",
"disputeMode": "DOCUMENT_ERROR_NOTIFICATION",
"documentErrorRemarks": "test",
"status": "uploadNeeded"
}
}通知体字段
| 参数 | 类型 | 说明 |
|---|---|---|
eventCode | String | 始终为 "Dispute"(争议相关通知) |
action | Object | 卡组织建议的操作(DISPUTE_NOTIFICATION 时出现) |
action.type | String | 操作类型,如 accept |
action.suggestion | String | 卡组织的详细建议 |
disputeInfo | Object | 争议核心信息 |
disputeInfo.caseNo | String | 争议案件唯一编号 |
disputeInfo.disputeMode | String | 通知类型:DISPUTE_NOTIFICATION 或 DOCUMENT_ERROR_NOTIFICATION |
disputeInfo.status | String | 当前争议状态 |
disputeInfo.ARN | String | 收单方参考号(通知中为大写;查询中为小写 arn) |
disputeInfo.disputeCode | String | 争议原因码 |
disputeInfo.disputeMessage | String | 争议原因描述 |
disputeInfo.disputeType | String | 争议类别,如 Chargeback拒付预警场景为 Dispute Alert |
disputeInfo.disputeAmount | Object | 争议金额 |
disputeInfo.disputeAmount.currency | String | ISO 4217 货币代码 |
disputeInfo.disputeAmount.value | String | 金额值(两位小数字符串) |
disputeInfo.disputeSettlementAmount | Object | 结算金额 |
disputeInfo.disputeSettlementAmount.currency | String | ISO 4217 货币代码 |
disputeInfo.disputeSettlementAmount.value | String | 金额值(两位小数字符串) |
disputeInfo.disputeEndtime | String | 争议截止时间(ISO 8601 UTC) |
disputeInfo.recordTime | String | 通知创建时间(ISO 8601 UTC) |
disputeInfo.paymentBrand | String | 支付网络,如 VIS |
disputeInfo.documentErrorRemarks | String | 错误说明(仅 DOCUMENT_ERROR_NOTIFICATION) |
merchantTransInfo | Object | 原始商户交易详情 |
merchantTransInfo.merchantTransID | String | 商户交易 ID |
merchantTransInfo.merchantTransTime | String | 商户交易时间(ISO 8601 含时区),如 2025-05-14T11:10:01+08:00 |
storeInfo | Object | 门店信息 |
storeInfo.merName | String | 商户名称 |
storeInfo.storeName | String | 门店名称 |
transAmount | Object | 原始交易金额 |
transAmount.currency | String | ISO 4217 货币代码 |
transAmount.value | String | 交易金额(两位小数字符串) |
2.3 拒付预警通知(Dispute Alert)
通知类型由 disputeInfo.status 决定,告警来源由 disputeInfo.alertType 区分:
| 字段 | 取值 | 说明 |
|---|---|---|
disputeInfo.status | received | 已受理 Ethoca 告警,告警接入成功 |
disputeInfo.status | manual_pending | 该告警需人工退款,已进入人工处理流程 |
disputeInfo.status | refunded | 该告警已自动完成全额退款 |
disputeInfo.alertType | Confirmed Fraud | 确认欺诈告警 |
disputeInfo.alertType | Customer Dispute | 客户争议告警 |
merchantTransInfo 可用性说明
拒付预警通知中,原始商户交易信息 merchantTransInfo(含 merchantTransID、merchantTransTime)仅在 manual_pending / refunded 状态的通知中返回,received 通知不含该字段。
示例:
{
"eventCode": "Dispute",
"disputeInfo": {
"alertType": "Confirmed Fraud",
"caseNo": "6acc54459a35987b70edeef4",
"disputeAmount": {"currency": "HKD", "value": "100.00"},
"disputeMode": "DISPUTE_NOTIFICATION",
"disputeType": "Dispute Alert",
"recordTime": "2026-10-12T11:40:41+08:00",
"remarks": "API for Ethoca",
"status": "refunded"
},
"merchantTransInfo": {
"merchantTransID": "pay-2609161412010002000041603719",
"merchantTransTime": "2026-09-16T14:11:59+08:00"
},
"storeInfo": {
"storeID": "S005317",
"storeName": "E3 EVONET Test"
},
"transAmount": {"currency": "HKD", "value": "100.00"}
}三、争议查询(dispute.query)
dispute.query)3.1 接口信息
| 字段 | 值 |
|---|---|
| 请求方式 | GET |
| 路径 | /g2/v1/settlement/mer/{SID}/dispute.query |
通过案件编号或日期范围查询争议。传入 caseNo 返回指定争议,否则返回日期范围内的全部争议。
3.2 请求参数
- 按案件编号查询:
| 参数 | 类型 | 必填 | 最大长度 | 说明 |
|---|---|---|---|---|
caseNo | String(64) | 是 | 64 | 争议案件编号 |
- 按日期范围查询:
| 参数 | 类型 | 必填 | 最大长度 | 说明 |
|---|---|---|---|---|
startDate | String(8) | 是 | 8 | 起始日期,格式 YYYYMMDD |
endDate | String(8) | 是 | 8 | 截止日期,格式 YYYYMMDD。必须晚于 startDate |
3.3 请求示例
- 按案件编号:
GET /g2/v1/settlement/mer/{SID}/dispute.query
{
"caseNo": "2025052015150461400351"
}- 按日期范围:
GET /g2/v1/settlement/mer/{SID}/dispute.query
{
"startDate": "20250514",
"endDate": "20250521"
}3.4 响应参数
| 参数 | 类型 | 说明 |
|---|---|---|
result | Object | 处理结果 |
result.code | String | 结果码。S0000 表示成功;不以 S 前缀开头的均为失败 |
result.message | String | 结果描述 |
listItems | String | 返回的争议记录总数(字符串形式的整数) |
data | Array | 争议记录列表 |
data[].disputeInfo | Object | 争议核心信息 |
data[].disputeInfo.caseNo | String | 争议案件唯一编号 |
data[].disputeInfo.disputeMode | String | 查询时的模式,如 DEFENSE_INFO |
data[].disputeInfo.status | String | 当前状态。详见状态流转 |
data[].disputeInfo.result | String | 争议结果类别,如 newChargeback |
data[].disputeInfo.disputeType | String | 争议类别,如 Chargeback |
data[].disputeInfo.disputeCode | String | 争议原因码,如 10.4(欺诈)、13.7(已取消商品/服务) |
data[].disputeInfo.disputeMessage | String | 争议原因描述 |
data[].disputeInfo.suggestion | String | 卡组织给出的建议 |
data[].disputeInfo.disputeEndTime | String | 争议截止时间(ISO 8601 UTC),如 2024-09-18T19:00:00Z |
data[].disputeInfo.recordTime | String | 争议创建时间(ISO 8601 UTC),如 2025-05-15T10:14:04Z |
data[].disputeInfo.paymentBrand | String | 支付网络,如 VIS |
data[].disputeInfo.disputeAmount | Object | 争议金额 |
data[].disputeInfo.disputeAmount.currency | String | ISO 4217 货币代码 |
data[].disputeInfo.disputeAmount.value | String | 金额值(两位小数字符串) |
data[].disputeInfo.disputeSettlementAmount | Object | 争议结算金额 |
data[].disputeInfo.disputeSettlementAmount.currency | String | ISO 4217 货币代码 |
data[].disputeInfo.disputeSettlementAmount.value | String | 金额值(两位小数字符串) |
data[].disputeInfo.arn | String | 收单方参考号(查询中为小写 arn,通知中为大写 ARN) |
data[].merchantTransInfo | Object | 原始商户交易详情(可能为空对象 {}) |
data[].merchantTransInfo.merchantTransID | String | 商户交易 ID |
data[].merchantTransInfo.merchantTransTime | String | 商户交易时间(ISO 8601 含时区),如 2025-05-14T11:10:01+08:00 |
data[].storeInfo | Object | 门店信息(可能为空对象 {}) |
data[].storeInfo.merName | String | 商户名称 |
data[].storeInfo.storeName | String | 门店名称 |
data[].transAmount | Object | 原始交易金额(可能为空对象 {}) |
data[].transAmount.currency | String | ISO 4217 货币代码 |
data[].transAmount.value | String | 交易金额(两位小数字符串) |
3.5 响应示例
{
"result": {
"code": "S0000",
"message": "Success"
},
"listItems": "1",
"data": [
{
"disputeInfo": {
"caseNo": "2025052015150461400351",
"disputeMode": "DEFENSE DOCUMENT_UPDATE",
"status": "uploadNeeded",
"result": "newChargeback",
"disputeType": "Chargeback",
"disputeCode": "10.4",
"disputeMessage": "Other Fraud - Card- Absent Environment",
"suggestion": "A cardholder is claiming that they did not authorize or participate in a transaction that you processed. ...",
"disputeEndTime": "2024-09-18T19:00:00Z",
"recordTime": "2025-05-20T07:15:04Z",
"paymentBrand": "VIS",
"disputeAmount": {
"currency": "USD",
"value": "44.99"
},
"disputeSettlementAmount": {
"currency": "USD",
"value": "44.99"
},
"arn": "74678814244000020091001"
},
"merchantTransInfo": {
"merchantTransID": "T505141747192201380",
"merchantTransTime": "2025-05-14T11:10:01+08:00"
},
"storeInfo": {
"merName": "集团号唯一性测试",
"storeName": "xzsGroupTest1"
},
"transAmount": {
"currency": "CNY",
"value": "1.00"
}
}
]
}{
"result": {
"code": "S0000",
"message": "Success"
},
"listItems": "5",
"data": [
{
"disputeInfo": {
"caseNo": "2025051518140406000018",
"disputeMode": "DISPUTE_NOTIFICATION",
"status": "End",
"disputeType": "Chargeback",
"disputeCode": "10.4",
"disputeMessage": "Other Fraud - Card- Absent Environment",
"suggestion": "A cardholder is claiming that they did not authorize...",
"disputeEndTime": "2024-09-18T19:00:00Z",
"recordTime": "2025-05-15T10:14:04Z",
"paymentBrand": "VIS",
"disputeAmount": {"currency": "USD", "value": "44.99"},
"disputeSettlementAmount": {"currency": "USD", "value": "44.99"},
"arn": "74678814244000020091000"
},
"merchantTransInfo": {
"merchantTransID": "T505141747192201380",
"merchantTransTime": "2025-05-14T11:10:01+08:00"
},
"storeInfo": {
"merName": "集团号唯一性测试",
"storeName": "xzsGroupTest1"
},
"transAmount": {"currency": "CNY", "value": "1.00"}
},
{
"disputeInfo": {
"caseNo": "2025051518140406800019",
"disputeMode": "DEFENSE_INFO",
"status": "caseCompleted",
"disputeType": "Chargeback",
"disputeCode": "13.7",
"disputeMessage": "Cancelled Merchandise/Services",
"disputeEndTime": "2021-07-01T19:00:00Z",
"recordTime": "2025-05-15T10:14:04Z",
"paymentBrand": "VIS",
"disputeAmount": {"currency": "THB", "value": "1798.00"},
"disputeSettlementAmount": {"currency": "THB", "value": "1798.00"},
"arn": "74678811156000010061000"
},
"merchantTransInfo": {},
"storeInfo": {},
"transAmount": {}
}
]
}注意:当相关数据不可用时,
merchantTransInfo、storeInfo、transAmount可能为空对象{}。
四、抗辩操作(dispute.defend)
dispute.defend)4.1 接口信息
| 字段 | 值 |
|---|---|
| 请求方式 | POST |
| 路径 | /g2/v1/settlement/mer/{SID}/dispute.defend |
针对争议提交抗辩操作,包括接受结果、上传初始抗辩文件或更新已提交的文件。
4.2 请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
disputeInfo.disputeMode | String | 是 | 抗辩模式。ACCEPT_DISPUTE_RESULT:接受争议结果,放弃抗辩。状态变为 finished;DEFENSE_DOCUMENT:提交抗辩文件(首次)。状态变为 uploadNeeded;DEFENSE_DOCUMENT_UPDATE:更新已提交的抗辩文件。状态变为 continueDefensing |
disputeInfo.caseNo | String | 是 | 争议案件编号 |
disputeInfo.fileMetaData | Array | 条件必填 | 文件列表。当 disputeMode 为 DEFENSE_DOCUMENT 或 DEFENSE_DOCUMENT_UPDATE 时必填 |
disputeInfo.fileMetaData[].fileName | String | 是 | 含扩展名的文件名,如 receipt.PDF |
disputeInfo.fileMetaData[].file | String | 是 | Base64 编码的文件内容。编码前单文件最大 10 MB |
4.3 请求示例
POST /g2/v1/settlement/mer/{SID}/dispute.defend
{
"disputeInfo": {
"disputeMode": "ACCEPT_DISPUTE_RESULT",
"caseNo": "2025052015150461400351"
}
}POST /g2/v1/settlement/mer/{SID}/dispute.defend
{
"disputeInfo": {
"disputeMode": "DEFENSE_DOCUMENT_UPDATE",
"caseNo": "2025052015150461400351",
"fileMetaData": [
{
"fileName": "123.PDF",
"file": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBl..."
}
]
}
}注意:首次提交(
DEFENSE_DOCUMENT)的fileMetaData结构与DEFENSE_DOCUMENT_UPDATE相同。
4.4 响应参数
| 参数 | 类型 | 说明 |
|---|---|---|
result | Object | 处理结果 |
result.code | String | 结果码。S0000 表示成功 |
result.message | String | 结果描述 |
disputeInfo | Object | 更新后的争议信息 |
disputeInfo.caseNo | String | 争议案件编号 |
disputeInfo.disputeMode | String | 使用的抗辩模式 |
disputeInfo.status | String | 更新后的争议状态 |
4.5 响应示例
{
"result": {
"code": "S0000",
"message": "Success"
},
"disputeInfo": {
"caseNo": "2025052210165183500384",
"disputeMode": "ACCEPT_DISPUTE_RESULT",
"status": "finished"
}
}{
"result": {
"code": "S0000",
"message": "Success"
},
"disputeInfo": {
"caseNo": "2025052015150461400351",
"disputeMode": "DEFENSE_DOCUMENT_UPDATE",
"status": "continueDefensing"
}
}{
"result": {
"code": "B0014",
"message": "Invalid transaction status uploadNeeded to complete the request"
}
}Updated about 17 hours ago
