问题描述
我已经在一个电子商务网站上使用Braintree大约一年了,我经常听到客户说他们不知道为什么拒绝付款。当交易被拒绝时,我会显示Braintree返回的错误消息(通过braintree_PHP 5.x),该错误消息通常看起来像“网关被拒绝:avs”(我的客户不知道这些词的含义)。
烦恼的是,这些错误似乎并没有伴随错误代码。这是(缩写的)响应对象:
object(Braintree\Result\Error) {
success => false
[protected] _attributes => [
'errors' => object(Braintree\Error\ErrorCollection) {
[private] _errors => object(Braintree\Error\ValidationErrorCollection) {
[protected] _collection => []
[private] _errors => []
[private] _nested => []
}
},[...]
'message' => 'Gateway Rejected: avs',[...]
'creditCardVerification' => null,'subscription' => null,'merchantAccount' => null,'verification' => null
]
}
因此,为了捕获这些网关错误并将其以可理解的方式传达给我的客户,我不得不依靠对$ result-> message消息的检查。我的代码看起来像这样:
$result = $this->gateway->transaction()->sale([...]);
if (!$result->success) {
switch ($result->message) {
case 'Gateway Rejected: avs':
$error = 'The billing postal code you provided Failed validation. Please try again.';
break;
case 'Gateway Rejected: avs_and_cvv':
$error = 'The postal code and/or CVV you provided Failed validation. Please try again.';
break;
case 'Gateway Rejected: cvv':
$error = 'The CVV you provided Failed validation. Please try again.';
break;
case 'Gateway Rejected: duplicate':
$error = 'Payment rejected as duplicate. If you feel this is in error,please contact us.';
break;
case 'Gateway Rejected: fraud':
$error = 'Payment rejected. Please try another payment method.';
break;
case 'Gateway Rejected: risk_threshold':
$error = 'Payment rejected. Please try another payment method.';
break;
default:
$error = $result->message ?? 'Payment Failed. Please check your payment @R_250_4045@ion and try again.';
break;
}
}
这是可行的,但是感觉像是错误的方法。例如,如果Braintree修改$ result-> message文本怎么办?为什么我没有得到错误代码?我认为这几乎是每个使用braintree_PHP的人都会遇到的问题,但是我找不到任何提及或任何代码来演示处理错误的替代方法。
非常感谢您提供有关我的工作及其替代方法的反馈! (并且有可能这实际上是处理这些错误的最佳方法,我正在这里为其他人记录我的方法。)
解决方法
您应该会收到错误代码。尝试捕捉您指出的消息是一个坏主意,因为您(和他们)提到他们更改了文本。
错误代码在这里 - https://developer.paypal.com/braintree/docs/reference/general/validation-errors/all/php#transaction
这就是我为捕获代码并显示消息所做的工作。我返回了一系列错误,但您可以做任何适合您的事情。
$error_array = [];
if ($result->success) {
//Process Transaction
} elseif (!is_null($result->transaction)){
$error_array[] = "Transaction status - " . $result->transaction->status;
} else {
foreach($result->errors->deepAll() as $error) {
switch($error->code){
case 91569:
case 81725:
$error_array[] = 'Payment method is not valid';
break;
default:
$error_array[] = $error->message;
}
}
}
他们的某些消息文本对用户不友好,因此您需要使用 switch 语句来捕获代码并提供更清晰的消息。