【问题标题】:Showing User Friendly Gateway Errors with braintree_php?使用braintree_php 显示用户友好的网关错误?
【发布时间】:2020-09-16 15:03:52
【问题描述】:

我已经在电子商务网站上使用 Braintree 大约一年了,我经常听到客户说他们无法弄清楚为什么他们的付款被拒绝。当交易被拒绝时,我会显示 Braintree 返回的错误消息(通过 Braintree_php 5.x),通常看起来像“Gateway Rejected: 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 information and try again.';
            break;
    }

}

这是可行的,但感觉是错误的方法。例如,如果 Braintree 修改了 $result->message 文本怎么办?为什么我没有收到错误代码?我认为这是几乎每个使用 Braintree_php 的人都会遇到的问题,但我找不到任何提及它或任何代码演示处理错误的替代方法。

对于我的工作及其替代方案的任何反馈,我将不胜感激! (如果这实际上是处理这些错误的最佳方法,我将在这里为其他人记录我的方法。)

【问题讨论】:

    标签: braintree


    【解决方案1】:

    您应该会收到错误代码。尝试捕捉您指出的消息是一个坏主意,因为您(和他们)提到它们会更改文本。

    错误代码在这里 - 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 语句来捕获代码并给出更清晰的消息。

    【讨论】:

    • 感谢您的回复!当我使用 Braintree 提供的测试卡(例如 Visa 4000111111111115、CVV 200、邮政编码 20000)模拟失败的交易时,结果中缺少这些错误。
    • @Libertie。我认为由于返回了事务,因此它没有错误数组。您可以使用$result->transaction->gatewayRejectionReason,而不是像现在这样匹配整个字符串,这可能不太可能改变。
    • 我真的不明白为什么结果不允许一致的错误处理,但你的建议是一个很好的建议。谢谢!
    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2010-10-14
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多