显示braintree_php的用户友好网关错误?

问题描述

我已经在一个电子商务网站上使用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 语句来捕获代码并提供更清晰的消息。