我在这里问了一个非常具体的问题: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向导可以帮助你,那么你将成为我的英雄。
尼克。
答案 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 !!!
尼克。