PAYATHON 2026

Refund a Transaction REST 不接受信用卡后4位

支付小周

结论

使用 refTransId 和信用卡后 4 位发起退款时,仍需提交 expirationDate,并将其设为 "XXXX"。如果缺少该字段,网关可能无法识别 cardNumber 是掩码卡号,并返回错误码 6:

The credit card number is invalid.

refTransId 用于传递原始交易的 transId。出现这个错误,通常不是字段名称有误,而是退款请求中的信用卡信息不完整。

正确的请求方式

请求中需要包含:

  • 原始交易的 transId,填写在 refTransId 中;
  • 原卡号后 4 位,填写在 payment.creditCard.cardNumber 中;
  • 固定值 "XXXX",填写在 payment.creditCard.expirationDate 中。

JSON 示例:

{
  "createTransactionRequest": {
    "merchantAuthentication": {
      "name": "API_LOGIN_ID",
      "transactionKey": "TRANSACTION_KEY"
    },
    "refId": "refund-001",
    "transactionRequest": {
      "transactionType": "refundTransaction",
      "amount": "10.00",
      "payment": {
        "creditCard": {
          "cardNumber": "1234",
          "expirationDate": "XXXX"
        }
      },
      "refTransId": "12345678901"
    }
  }
}

XML 示例:

<transactionRequest>
    <transactionType>refundTransaction</transactionType>
    <amount>10.00</amount>
    <payment>
        <creditCard>
            <cardNumber>1234</cardNumber>
            <expirationDate>XXXX</expirationDate>
        </creditCard>
    </payment>
    <refTransId>12345678901</refTransId>
</transactionRequest>

为什么完整卡号可以成功

提交完整信用卡号时,通常会同时提供真实的有效期,因此 creditCard 对象能够通过常规卡号校验。

如果只提交后 4 位,网关需要根据以下信息判断这是关联原交易的退款,而不是一张只有 4 位数字的无效信用卡:

refTransId + cardNumber 后 4 位 + expirationDate: "XXXX"

缺少 "XXXX" 时,这 4 位数字可能会被当作完整卡号校验,因长度或校验规则不符而触发错误码 6。

还需要检查的事项

如果加入 "expirationDate": "XXXX" 后仍然失败,请继续确认:

  1. refTransId 填写的是原始成功交易返回的 transId,而不是订单号、refId 或退款交易号。
  2. cardNumber 与原始交易实际使用卡号的后 4 位完全一致。
  3. 原始交易已经结算。对于尚未结算的交易,通常应执行 voidTransaction,而不是 refundTransaction。
  4. 退款金额没有超过原交易当前的可退余额。
  5. XML 请求中的元素顺序符合所用 API Schema。对于 JSON 请求,则需确认字段的嵌套层级正确。
  6. 原始交易仍在支付网关允许的关联退款期限内。具体期限可能因网关规则、账户配置或 API 版本而异,应以当前账户和官方文档为准。

需要修改的核心部分是:

"creditCard": {
  "cardNumber": "1234",
  "expirationDate": "XXXX"
}

备注:内容仅供参考。