更新日期:2026-07-15
适用对象:客户技术团队、支付/风控/售后系统负责人
PSP 辅助说明:Stripe、Checkout.com、CyberSource、Worldpay、Adyen
预警来源:TrustDecision Ethoca Dispute Notification API
文档边界:第 1~3 节定义 TrustDecision Ethoca 对接契约;第 4~7 节为交易匹配和 PSP 实施建议,不构成 TrustDecision 或 PSP 的完整 API 规范。实施前应以客户实际开通的环境、API 版本、账号权限和服务端联调结果为准。
本文档说明客户如何对接 TrustDecision Ethoca API,包括接收 Ethoca 拒付预警、理解预警字段、调用更新接口反馈处置结果。文档中补充的 PSP API 字段和退款接口说明,仅用于辅助客户在本地系统中完成交易匹配、退款确认和结果反馈,不作为完整 PSP 接入规范。
客户通常需要完成以下对接:
Confirmed Fraud 或 Customer Dispute 预警。outcome、refunded、amountStopped、actionTimestamp 等结果。核心要求:
in_progress、shipper_contacted 仅适用于 Confirmed Fraud,且不应停留超过 24 小时。refunded 或 not settled,不能只更新 Ethoca 状态而不执行资金动作。推荐客户按以下流程建设:
POST JSON 推送给客户。ethocaId 幂等落库。200 和 { "code": 200, "message": "" }。该响应只表示已接收,不代表已完成退款;其他响应可能触发 TrustDecision 按配置重试。cardBin 只能与 cardLast4 同时使用,不得单独参与匹配。客户需要提供一个 HTTPS RESTful 接口,用于接收 TrustDecision 推送的 Ethoca 预警。一次推送可以包含一个或多个预警。
客户开发接收接口后,需要先在 TrustDecision 门户完成订阅配置,TrustDecision 才会把 Ethoca 预警推送到客户指定地址。
操作路径和配置项如下:
Access Key、Access Secret 和操作入口。客户服务端需要使用 Access Secret 校验 TrustDecision 推送请求签名。Ethoca 预警订阅服务配置示意


推送请求概要:
鉴权参数应放在 URL query 中,timestamp 使用毫秒时间戳。
推送外层结构:
请求体根节点为 JSON 数组,数组内每个元素代表一种预警类型及其预警明细。
Confirmed Fraud 和 Customer Dispute 的 parameters 字段并不完全一致。客户解析时应先根据外层 type 判断预警类型,再按对应字段表处理。除外层 type、parameters 以及已由联调确认的字段外,客户端应允许明细字段缺失或为空,不应因单个非关键字段缺失而拒绝整批预警。
Confirmed Fraud 是已确认欺诈预警,主要用于提示客户尽快停止履约、取消订单、退款或标记无法处理。该类型通常不包含拒付原因、拒付金额等 chargeback 字段。
[
{
"type": "Confirmed Fraud",
"parameters": [
{
"ethocaId": "1E7543HNEG001VOURNV96Q857",
"alertTimestamp": 1720592944328,
"age": 13,
"issuer": "TestIssuer",
"cardNumber": "888888******2108",
"cardBin": "888888",
"cardLast4": "2108",
"arn": "435HJ7674346895HJ767434",
"authCode": "24545564",
"transactionTimestamp": "2024-06-10T16:13:04.328Z",
"merchantDescriptor": "TONGDUNTEST",
"partnerMerchantId": "TRUST_DEC_1",
"ethocaMerchantId": 9088,
"mcc": "3000",
"amount": 37.55,
"currency": "USD",
"amountUsd": 37.55,
"transactionType": "swiped",
"initiatedBy": "cardholder",
"liability": "no",
"source": "IssuingOrganisation",
"merchantName": "Tongdun Sub Merchant"
}
]
}
]Customer Dispute 是客户争议预警。除交易基础字段外,该类型会返回拒付/争议相关字段,例如拒付原因、拒付金额、拒付币种,客户可用于判断是全额退款、部分退款还是转人工争议。
[
{
"type": "Customer Dispute",
"parameters": [
{
"ethocaId": "1D7543HNEG001VOURNV96Q857",
"alertTimestamp": "2024-06-10T16:13:04.328Z",
"age": 19,
"issuer": "MerchantBank",
"transactionTimestamp": "2023-03-10T16:13:04.328Z",
"amount": 121.10,
"currency": "CAD",
"cardBin": "555456",
"cardLast4": "1240",
"cardNumber": "555456******1240",
"arn": "435HJ7674346895HJ767434",
"authCode": "21HJ767",
"merchantDescriptor": "TONGDUNTEST",
"partnerMerchantId": "demo_prod001",
"ethocaMerchantId": 3001,
"mcc": "3000",
"amountUsd": 88.51,
"transactionType": "swiped",
"initiatedBy": "cardholder",
"liability": "no",
"source": "IssuingOrganisation",
"merchantName": "Tongdun Sub Merchant",
"transactionId": "875HJ767434121",
"chargebackReasonCode": "10.1",
"chargebackReason": "EMV Liability Shift Counterfeit Fraud",
"chargebackAmount": 121.10,
"chargebackCurrency": "CAD"
}
]
}
]两类预警分别建模。不要先读取“公共字段”再拼接“差异字段”;客户应根据外层 type,直接使用对应的完整字段表解析。不同发卡行可能不提供部分明细字段,因此除已联调确认的必传字段外,客户端应允许字段缺失或为空,并保存完整原始报文。
外层 type 固定为 Confirmed Fraud。该类型以匹配原交易、停止履约和阻止损失为主,通常不返回拒付原因、拒付金额等 Customer Dispute 字段。
如果没有匹配到交易,建议按 arn、authCode、cardLast4、金额、币种和交易时间窗口逐级降级匹配。若使用 cardBin,必须同时命中 cardLast4;无法确认唯一交易时必须转人工复核。
外层 type 固定为 Customer Dispute。除交易识别字段外,该类型还可能包含 transactionId、拒付原因、拒付金额和拒付币种。
chargebackAmount 不一定等于原交易 amount。自动退款前应同时校验 PSP 可退余额、客户退款策略、原交易金额和预警金额,避免超额退款或重复退款。
退款、停止结算或人工处理完成后,客户需要调用 TrustDecision Ethoca 更新接口反馈结果。单次请求仅允许一个更新事件。
建议客户先看本节的“请求体字段表”,再看后面的枚举说明和样例。重复预警场景下,历史预警 ID 放在请求对象同一层的 historicalEthocaId 字段中。
请求概要:
URL query 参数:
请求体字段:
请求体是 JSON 数组;下表字段均放在数组内单个更新对象中。重复预警时,historicalEthocaId 与 ethocaId、matchTransactionResult 平级。
以下样例表示当前预警 2JFG5ULCLB8OQMWHQ7OAY7G7D 是重复预警,历史上已经处理过 1E7543HNEG001VOURNV96Q857。注意:
matchTransactionResult 必须传 Duplicate alert,中间使用空格。historicalEthocaId 放在请求对象同一层,和 ethocaId、outcome、comments 平级。comments;本例不是 other / Other 场景,所以传空字符串。curl -X POST "https://sg.apitd.net/api/ethoca/alert/update?partner_code=xxx&partner_key=xxx" \
-H "Content-Type: application/json" \
-d '[
{
"ethocaId": "2JFG5ULCLB8OQMWHQ7OAY7G7D",
"outcome": "stopped",
"refunded": "refunded",
"firstPartyFraud": "no",
"amountStopped": 37.55,
"actionTimestamp": "2024-06-10T18:33:04.328Z",
"comments": "",
"matchTransactionResult": "Duplicate alert",
"historicalEthocaId": "1E7543HNEG001VOURNV96Q857"
}
]'客户端必须同时检查 HTTP 状态、顶层 code 和 alertUpdateResponses[].status。即使顶层 code=200,单条更新仍可能是 failed。
成功响应样例:
{
"code": 200,
"message": "Success",
"alertUpdateResponses": [
{
"ethocaId": "2JFG5ULCLB8OQMWHQ7OAY7G7D",
"status": "success"
}
]
}单条更新失败样例:
{
"code": 200,
"message": "Success",
"alertUpdateResponses": [
{
"ethocaId": "2JFG5ULCLB8OQMWHQ7OAY7G7D",
"status": "failed",
"updateEventErrors": [
{
"code": "6",
"description": "OutcomeQueueItem outcome should be valid value and not null"
}
]
}
]
}顶层异常样例:
{
"code": 9400,
"message": "System Error"
}原始文档列出了 200、001、9400、9401、9403 等业务码,但原表存在排版和含义不一致。正式上线前,应由 TrustDecision 提供完整错误码表;客户端不得只对 200 编码,其余未知业务码均应按失败处理并记录完整响应。
下表是接口允许的组合,不是推荐值。表外组合可能导致更新失败。
Confirmed Fraud 合法组合:
Customer Dispute 合法组合:
in_progress和shipper_contacted仅属于Confirmed Fraud。原始规范说明:如果客户对Customer Dispute发送 Confirmed Fraud outcome,Ethoca 可能执行自动映射,例如stopped → resolved、in_progress → other。新接入不应依赖该兼容行为,应直接发送与预警类型对应的 outcome。
refunded 可用取值:
matchTransactionResult 是已上线接口枚举,必须严格按下表传值,不要改大小写、空格或下划线。
匹配流程只分为两种情况:arn 匹配,以及 arn 缺失时的组合字段匹配。
arn 匹配#当 Ethoca 预警包含 arn 时,使用 arn 与 PSP 原交易进行完全一致匹配:
arn 完全一致:视为完全匹配,建议退款。arn 不一致或查询到多个候选:不得继续按弱字段自动匹配,建议人工复核。arn 完全匹配可以免除后续组合字段匹配,但实际退款仍须通过第 4.3 节的交易状态、可退余额、幂等和权限校验。
arn 缺失时的匹配#只有当 Ethoca 预警未返回 arn 时,才使用 transactionTimestamp、authCode、cardBin、cardLast4 和 amount 组合匹配。
transactionTimestamp ±72 小时查询 PSP 候选交易。transactionTimestamp 为 UTC+0。商户必须将本地系统或 PSP 返回的交易时间转换到 UTC+0,或将双方转换到同一时区后再比较。amount 与 PSP 原交易金额的偏差必须在 ±5% 内。匹配限制:
cardBin 不能单独使用,必须和 cardLast4 同时匹配。transactionId、PSP transaction ID、network transaction ID、payment ID、客户 order ID 和 reference 均不参与匹配。amount,不使用 amountUsd 或 chargebackAmount。下表按匹配置信度从高到低排序。参考分值用于表达相对置信度,不属于 Ethoca 接口规范,客户可根据历史回放结果调整。除 arn 规则外,其余规则仅在 arn 缺失时执行。
transactionTimestamp 表示 UTC+0 时间窗口 ±72 小时;amount 表示同币种直接比较 ±5%,或跨币种换算后比较 ±5%。
执行要求:
arn 完全一致时直接采用优先级 1,不再执行后续组合。arn 缺失时,从优先级 2 开始依次判断;某条规则唯一命中时停止后续规则。cardBin 必须与 cardLast4 同时使用,不能单独参与匹配。仅当客户明确启用自动退款且以下条件全部满足时,系统才可以执行自动退款:
ethoca_id + provider_payment_id + amount 不存在成功或进行中的退款任务。不是所有 PSP 都稳定返回完整 arn、authCode 等信息。客户在支付创建和支付成功时应保存以下数据,用于候选交易筛选、退款执行、对账和审计。保存某个字段不代表该字段可以直接参与 Ethoca 匹配;匹配字段和组合必须遵循第 4 节。
transactionId 直接匹配。官方文档:
authorization_code: https://docs.stripe.com/changelog/acacia/2024-09-30/displays-authorization-code-for-chargesnetwork_transaction_id: https://docs.stripe.com/changelog/acacia/2024-12-18/charge-display-network-transaction-id优先同步 PaymentIntent 获取订单级状态,再同步或 expand Charge 获取卡、退款、争议和网络字段。
curl -G https://api.stripe.com/v1/payment_intents \
-u sk_live_xxx: \
-d "created[gte]=1782748800" \
-d "created[lte]=1782835199" \
-d "limit=100"
分页使用 has_more 和 starting_after。建议保存 5-10 分钟重叠窗口,避免边界漏单。
在 Stripe 中,客户人工从后台找这些字段不直观,系统对接时应直接从 Charge 对象读取。推荐优先级:
transactionId 与 Stripe network_transaction_id、Charge ID、PaymentIntent ID 或订单号直接匹配。authorization_code 时,优先使用授权码,并结合 last4、金额、币种和时间窗口匹配。last4 + 金额 + 币种 + 时间窗口 筛选唯一候选,并进入人工复核。last4。destination_details.card.reference 是退款引用号,不得用于匹配原始付款。该引用号还可能在退款发起后延迟生成。Charge 对象中建议保存的字段示例:
{
"id": "ch_xxx",
"payment_intent": "pi_xxx",
"amount": 12110,
"currency": "cad",
"created": 1718029984,
"payment_method_details": {
"card": {
"brand": "visa",
"last4": "1240",
"authorization_code": "21HJ767"
}
}
}curl https://api.stripe.com/v1/refunds \
-u sk_live_xxx: \
-H "Idempotency-Key: refund:stripe:acct_123:pi_xxx:ethoca_123:1000" \
-d payment_intent=pi_xxx \
-d amount=1000 \
-d reason=fraudulent \
-d "metadata[ethoca_id]=1E7543HNEG001VOURNV96Q857"要点:
amount 是最小货币单位。payment_intent 或 charge,建议保存两者。refund.updated、charge.refunded、charge.dispute.created,并定时对账。Confirmed Fraud 且客户策略确认欺诈,可用 reason=fraudulent,但需客户确认这会影响风控拦截名单策略。官方文档:
使用 Payment Search API 查询交易。该接口需要 payments:search scope。以下使用官方已给出的 payment ID 查询语法演示请求结构;批量同步时应按 Checkout.com 当前支持的可搜索字段构造 query,并配合 from/to 限制时间窗口。
curl https://{prefix}.api.checkout.com/payments/search \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"query": "id:'pay_mbabizu24mvu3mela5njyhpit4'",
"from": "2026-06-01T00:00:00Z",
"to": "2026-06-02T00:00:00Z",
"limit": 100
}
JSONquery 是必填字符串,最大 1024 字符;limit 范围为 1~1000。当前 Payment Search 请求体不支持 sort 字段。分页使用响应中的 _links.next.href,不要自行拼接下一页 URL。
Checkout.com 的强匹配字段通常在 payment actions 中更完整,建议对候选交易调用 Get payment actions。
reference、metadata、RRN、acquirer_transaction_id 和 payment ID 可以用于客户内部查询、退款执行和审计,但不得与 Ethoca transactionId 或客户订单号组合成 Ethoca 直接匹配规则。
curl -X POST https://{prefix}.api.checkout.com/payments/pay_xxx/refunds \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-H "Cko-Idempotency-Key: refund:checkout:pay_xxx:ethoca_123:1000" \
-d '{
"amount": 1000,
"reference": "ethoca_1E7543HNEG001VOURNV96Q857",
"metadata": {
"ethoca_id": "1E7543HNEG001VOURNV96Q857"
}
}'capture_action_id 目前仅适用于 Checkout.com 文档明确支持的 PayPal 和 Riverty 场景,不应作为普通卡支付多 capture 的通用退款参数。
Checkout.com 的 actions 中常能取得 auth_code 和 ARN;匹配仍须遵循第 4 节约束。退款成功后反馈:
Confirmed Fraud:outcome=stopped,refunded=refunded。Customer Dispute:本次预警后退款用 outcome=resolved;仅在预警到达前已经退款时使用 outcome=previously_refunded。两者的 refunded 均按实际退款状态填写。matchTransactionResult=Payment declined,refunded=not refunded。官方文档:
使用 Transaction Search API 按 submitTimeUtc 查询。查询接口支持多种 PSP 内部字段,但 Ethoca 匹配仅使用本文明确允许的金额、币种、时间、卡尾号、BIN+尾号、ARN 和授权码组合。
curl -X POST https://api.cybersource.com/tss/v2/searches \
-H "v-c-merchant-id: your_merchant_id" \
-H "Content-Type: application/json" \
-H "Date: Mon, 06 Jul 2026 10:00:00 GMT" \
-H "Digest: SHA-256=..." \
-H "Signature: ..." \
-d '{
"query": "submitTimeUtc:[2026-06-01T00:00:00Z TO 2026-06-02T00:00:00Z]",
"offset": 0,
"limit": 100,
"sort": "submitTimeUtc:asc"
}'分页递增 offset 并以账号实际允许的 limit 为准。不要未经验证直接使用超大页长;Transaction Search/Details 可能存在数据延迟,不应作为唯一实时交易状态来源。
批量对账可补充使用 Reporting API,例如 purchase/refund 明细报表。
clientReferenceInformation.code、RRN、processorInformation.networkTransactionId 和 PSP id 可用于客户内部查询、退款执行和审计,但不参与 Ethoca transactionId/order ID 匹配。
curl -X POST https://api.cybersource.com/pts/v2/payments/6281765770796275003009/refunds \
-H "v-c-merchant-id: your_merchant_id" \
-H "Content-Type: application/json" \
-H "Date: Mon, 06 Jul 2026 10:00:00 GMT" \
-H "Digest: SHA-256=..." \
-H "Signature: ..." \
-d '{
"clientReferenceInformation": {
"code": "ethoca_1E7543HNEG001VOURNV96Q857"
},
"orderInformation": {
"amountDetails": {
"totalAmount": "10.00",
"currency": "USD"
}
}
}'注意:CyberSource 退款金额通常传 decimal 字符串,不是 minor unit。
approvalCode、card prefix + suffix 或 suffix、UTC 时间窗口和金额容差;card prefix 不得单独使用。Confirmed Fraud 使用 stopped + refunded,Customer Dispute 使用 resolved + refunded。找不到交易时,两类预警均使用 notfound + not refunded。官方文档:
Worldpay Access Payment Queries 支持按日期范围查询卡支付,并返回交易、支付工具、事件和可执行操作链接。
curl "https://try.access.worldpay.com/paymentQueries/payments?startDate=2026-06-01T00:00:00Z&endDate=2026-06-02T00:00:00Z&pageSize=300" \
-u "username:password" \
-H "Accept: application/vnd.worldpay.payment-queries-v1.hal+json"可用过滤包括 entityReferences、currency、minAmount、maxAmount、last4Digits、receivedEvents。该服务是数据聚合服务,通常会有短暂延迟,不应作为唯一实时来源。
scheme.reference、transactionReference 和 Worldpay payment ID 可用于客户内部查询、退款执行和审计,但不得与 Ethoca transactionId 或客户 order ID/reference 直接匹配。
Worldpay 不建议硬编码退款 URL。应使用 payment/sale/settlement 响应中的 action link。
全额退款:
curl -X POST "https://try.access.worldpay.com/payments/settlements/refunds/full/{linkData}" \
-u "username:password" \
-H "Accept: application/vnd.worldpay.payments-v5+json" \
-H "Content-Type: application/vnd.worldpay.payments-v5+json"部分退款:
curl -X POST "https://try.access.worldpay.com/payments/settlements/refunds/partials/{linkData}" \
-u "username:password" \
-H "Accept: application/vnd.worldpay.payments-v5+json" \
-H "Content-Type: application/vnd.worldpay.payments-v5+json" \
-d '{
"value": {
"amount": 1000,
"currency": "USD"
},
"reference": "ethoca_1E7543HNEG001VOURNV96Q857"
}'payments:refund 或 payments:partialRefund,说明 PSP 当前提供可执行退款动作。not settled。官方文档:
Adyen 标准 Online Payments 没有一个面向普通商户的实时“按日期列出全部支付”API。推荐组合:
AUTHORISATION、CAPTURE、REFUND、REFUND_FAILED、CHARGEBACK、NOTIFICATION_OF_CHARGEBACK 等。pspReference、merchantReference 和 Network Transaction Reference 可用于客户内部查询、退款执行和审计,但不得与 Ethoca transactionId 或客户 order ID/reference 直接匹配。
curl -X POST "https://checkout-live.adyenpayments.com/checkout/v72/payments/PSP_REFERENCE/refunds" \
-H "X-API-Key: ADYEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"merchantAccount": "YourMerchantAccount",
"amount": {
"value": 1000,
"currency": "USD"
},
"reference": "ethoca_1E7543HNEG001VOURNV96Q857",
"merchantRefundReason": "FRAUD"
}'退款结果异步确认。收到 response 后记录退款 pspReference,最终以 REFUND、REFUND_FAILED、REFUNDED_REVERSED webhook 或 Payment accounting report 为准。
Acquirer Reference 已确认就是原交易 ARN 且完全一致时,视为完全匹配。ARN 缺失时,必须按第 4.2 节组合 Authorisation Code、前六后四或后四位、UTC 时间窗口和金额容差。以下反馈必须按预警类型分别生成,禁止把斜杠表达式直接写入请求。
Ethoca FAQ 建议:如果确认是正确交易,为了更好阻止拒付,通常应全额退款,让发卡行看到全额退款。系统可支持三种客户配置:
以下项目尚不能仅凭现有原始文档唯一确定,必须通过 TrustDecision 服务端说明或 Sandbox 联调确认:
timestamp 允许偏差、过期策略和重放保护规则。200 和响应体 code=200。alertTimestamp 在两类预警中的真实类型,以及是否长期兼容毫秒时间戳和 ISO 8601。ethocaMerchantId 的稳定 JSON 类型。comments 是否接口必传,是否允许中文,以及 other/Other 时是否强制非空。actionTimestamp 的必传条件。上线前至少完成以下 Sandbox 用例:
ethocaId 重复推送,确认接收端幂等且不会重复退款。outcome + refunded 组合。code=200 但 alertUpdateResponses[].status=failed。authorization_code: https://docs.stripe.com/changelog/acacia/2024-09-30/displays-authorization-code-for-chargesnetwork_transaction_id: https://docs.stripe.com/changelog/acacia/2024-12-18/charge-display-network-transaction-id