问题描述
当客户通过 IPropertiesForFoo
方法批准付款时,我正在使用 PayPal API 模拟否定响应,以便获得响应并正确处理付款的关键部分。
我正在使用 onApprove
+ GuzzleHttp
来Laravel
获得客户的批准。我在完整对象中获得 capture
状态。所以请求工作正常。
COMPLETED
我通过添加 $client = new \GuzzleHttp\Client();
return
$response = $client->request(
'POST','https://api-m.sandBox.paypal.com/v2/checkout/orders/' . $paypalOrderId . '/capture',[
'headers' => [
'Content-Type' => 'application/json','Authorization' => 'Bearer ' . $access_token,// 'PayPal-Mock-Response' => json_encode(["mock_application_codes" => "INTERNAL_SERVER_ERROR"]),'PayPal-Mock-Response' => json_encode(["mock_application_codes" => "INSTRUMENT_DECLINED"]),],);
=> header
来模拟响应错误,如果不在 'PayPal-Mock-Response' => json_encode(["mock_application_codes" => "INSTRUMENT_DECLINED"])
块内,这当然会破坏代码。
这是当请求没有 try-catch 时 Laravel 的输出:
try-catch
此错误是意料之中的。因为我用 "message": "Client error: `POST https://api-m.sandBox.paypal.com/v2/checkout/orders/6JE880117B631364H/capture` resulted in a `422 Unprocessable Entity`
response:\n{\n \"name\": \"UNPROCESSABLE_ENTITY\",\n \"details\": [\n {\n \"issue\": \"INSTRUMENT_DECLINED\",\n \"description\": \"The (truncated...)\n","exception": "GuzzleHttp\\Exception\\ClientException","file": "C:\\xampp\\htdocs\\react\\React-Laravel\\vinos-gdl\\vendor\\guzzlehttp\\guzzle\\src\\Exception\\RequestException.PHP","line": 113,
标题强制它。
当我在 Mock-Response
块中插入代码时出现“问题”。我得到了预期的 try-catch
,但我无法从 Exception
中获得任何详细信息:
response
这是 catch (ServerException $e) {
if ($e->hasResponse()) {
return response()->json(['msg' => 'Server Error','error' => $e->getResponse()],500);
}
return response()->json([
'msg' => 'Server Error','request' => $e->getRequest(),$e->hasResponse() ? $e->getResponse() : ""
]);
// return response()->json(['msg' => 'Client Error','error' => $e->getRequest()]);
} catch (ClientException $e) {
if ($e->hasResponse()) {
return response()->json(['msg' => 'Client Error',400);
}
return response()->json([
'msg' => 'Client Error',$e->hasResponse() ? $e->getResponse() : ""
]);
// return response()->json(['msg' => 'Server Error','error' => report($e)]);
}
catch (BadResponseException $e){
return response()->json(['error' => $e]);
}
的输出:
错误:请求失败,状态码为 400
ClientException
如果我强制{
"msg": "Client Error","error": {} // empty!!!
}
:
ServerException
{
"msg": "Server Error","error": {} // also empty
}
被抛出,但是,这肯定不足以正确处理错误。我需要从 Exceptions
获取详细信息。
前端以防有人想看到它:
response
解决方法
异常应该是 BadResponseException 的一个实例,它有一个 getResponse 方法。然后,您可以将响应正文转换为字符串。
$response = json_decode($ex->getResponse()->getBody()->getContents(),true);