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" 后仍然失败,请继续确认:
refTransId填写的是原始成功交易返回的transId,而不是订单号、refId或退款交易号。cardNumber与原始交易实际使用卡号的后 4 位完全一致。- 原始交易已经结算。对于尚未结算的交易,通常应执行
voidTransaction,而不是refundTransaction。 - 退款金额没有超过原交易当前的可退余额。
- XML 请求中的元素顺序符合所用 API Schema。对于 JSON 请求,则需确认字段的嵌套层级正确。
- 原始交易仍在支付网关允许的关联退款期限内。具体期限可能因网关规则、账户配置或 API 版本而异,应以当前账户和官方文档为准。
需要修改的核心部分是:
"creditCard": {
"cardNumber": "1234",
"expirationDate": "XXXX"
}
备注:内容仅供参考。
