Laravel 5从PayPal API获得400回应

时间:2017-05-30 09:18:11

标签: php laravel laravel-5 paypal paypal-sandbox

我在这里问了一个非常具体的问题: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调试模式中的错误:

enter image description here

当我查看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向导可以帮助你,那么你将成为我的英雄。

尼克。

1 个答案:

答案 0 :(得分: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 !!!

尼克。