Laravel 5 从 PayPal API 捕获 400 响应

Posted

技术标签:

【中文标题】Laravel 5 从 PayPal API 捕获 400 响应【英文标题】:Laravel 5 catching 400 response from PayPal API 【发布时间】:2017-10-30 16:34:59 【问题描述】:

我在这里问了一个非常具体的问题:Laravel 5 catching PayPal php API 400 errors on localhost:8000

由于没有人能帮上忙,我想提出一个关于从 PayPal API 捕获 400 错误的更开放的问题。

我正在向 PayPal 发出请求,当请求成功后,一切正常,我得到一个可爱的响应对象,我可以使用它并采取相应的行动。

例如,当输入了错误的卡详细信息时,Laravel 会抛出 400 错误,并且无法捕捉到错误让我采取相应的行动。

片段:

try 
    // ### Create Payment
    // Create a payment by posting to the APIService
    // using a valid ApiContext
    // The return object contains the status;

    $payment->create($this->_apiContext);

//will not catch here :( throws Laravel 400 error! want to redirect with message!
 catch (\PPConnectionException $ex) 
    return Redirect::back()->withErrors([$ex->getMessage() . PHP_EOL]);


//if we get an approved payment ! This fires perfectly when succesful!!! woo!!
if($payment->state == 'approved') 
    //if success we hit here fine!!!
 else 
    //won't get here, dies before catch.

这是 Laravel 调试模式下的错误:

当我查看 PayPal API 沙箱日志时,我应该会得到一个不错的对象,以便我可以采取相应的行动。


    "status": 400,
    "duration_time": 60,
    "body": 
        "message": "Invalid request. See details.",
        "information_link": "https://developer.paypal.com/webapps/developer/docs/api/#VALIDATION_ERROR",
        "details": [
            
                "field": "payer.funding_instruments[0].credit_card.number",
                "issue": "Value is invalid."
            
        ],
        "name": "VALIDATION_ERROR",
        "debug_id": "XXXXXXXXXXXXXX"
    ,
    "additional_properties": ,
    "header": 
        "Date": "Thu, 25 May 2017 14:44:43 GMT",
        "paypal-debug-id": "2f88f18d519c3",
        "APPLICATION_ID": "APP-XXXXXXXXXXXX",
        "Content-Language": "*",
        "CALLER_ACCT_NUM": "XXXXXXXXXXXXX"
    

如果有任何 Laravel 向导可以帮助你,那我就是我的英雄。

尼克。

【问题讨论】:

这对你有帮助吗? github.com/paypal/PayPal-PHP-SDK/wiki/… 感谢@rchatburn 的回复!我遇到了那个链接,我相信它会帮助很多人,但在我的情况下,它无法再次捕获:(如果状态为 400,我的应用程序似乎会失败,因为它会发出这个调用:$payment->create($this->_apiContext);。没有什么能超越它如果 PayPal 抛出任何形式的错误,则行。 【参考方案1】:

对的人,

Laravel 的默认 Exception 方法似乎干扰了 PayPal API PayPalConnectionException。所以我修改了代码以仅捕获一般的Exception 错误,因为它包含所有必需的错误对象。 Exception 之前的 \ 很关键!因为它需要正确的命名空间(无论如何,在我的情况下,您的应用程序可能会有所不同)。

try 
    // ### Create Payment
    // Create a payment by posting to the APIService
    // using a valid ApiContext
    // The return object contains the status;
    $payment->create($this->_apiContext);

 catch (\Exception $ex) 
    return Redirect::back()->withErrors([$ex->getData()])->withInput(Input::all());

@rchatburn 发布的这个link 非常有用,一旦我正确命名了所有内容,该应用程序似乎总是能捕捉到\Exception 而不是\PayPalConnectionException

在我的调查中,我遇到了app/Exceptions/Handler.php。在这里,您可以扩展 render 方法以获取 PayPalConnectionException 并针对该特定异常处理错误。见代码:

//Be sure to include the exception you want at the top of the file
use PayPal\Exception\PayPalConnectionException;//pull in paypal error exception to work with

public function render($request, Exception $e)

    //check the specific exception
    if ($e instanceof PayPalConnectionException) 
        //return with errors and with at the form data
        return Redirect::back()->withErrors($e->getData())->withInput(Input::all());
    

    return parent::render($request, $e);
 

两者都工作得很好,但对我来说,将 catch 方法更改为寻找一般 Exception 感觉更简洁,我正在测试付款是否成功。

希望这可以帮助任何面临类似问题的人:D!!!

尼克。

【讨论】:

使用 catch (\Exception $ex) 而不是 catch (Exception $ex) 对我有用..它节省了我很多时间..谢谢.. @DharaParmar 很高兴为您提供帮助!

以上是关于Laravel 5 从 PayPal API 捕获 400 响应的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Paypal API 单笔支付

Laravel 没有收到 paypal webhook 事件

为啥不能在 Laravel 5.7 中捕获我定义的 Route 请求的文件 URI?

捕获后是不是有更多的 paypal api 可以调用?

使用 paypal/rest-api-sdk-php 的 laravel paypal 集成错误

Laravel 从 5.5 升级到 5.6 到 5.7:未捕获 ReferenceError: axios is not defined