Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 狂饮:罐头';无法捕获异常详细信息_Reactjs_Laravel_Guzzle_Paypal Rest Sdk - Fatal编程技术网

Reactjs 狂饮:罐头';无法捕获异常详细信息

Reactjs 狂饮:罐头';无法捕获异常详细信息,reactjs,laravel,guzzle,paypal-rest-sdk,Reactjs,Laravel,Guzzle,Paypal Rest Sdk,我用PayPal API模拟负面响应,以便在客户通过onApprove方法批准付款时,获得响应并正确处理付款的关键部分 我正在使用GuzzleHttp+Laravel来获取客户的批准。我在complete对象中获得COMPLETED状态。因此,请求工作正常 $client = new \GuzzleHttp\Client(); return $response = $client->request( 'POST', 'https://api-m.sandbox.paypa

我用PayPal API模拟负面响应,以便在客户通过
onApprove
方法批准付款时,获得响应并正确处理付款的关键部分

我正在使用
GuzzleHttp
+
Laravel
获取客户的批准。我在complete对象中获得
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"]),
        ],
    ],
);
我通过在
标题中添加一个
=>
'PayPal-Mock-response'=>json\u encode([“Mock\u application\u codes”=>“INSTRUMENT\u densed”])
来模拟响应错误,当然,如果不在
try catch
块中,它将中断代码

这是请求没有try-catch时Laravel的输出:

      "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,
这是预期的错误。因为我用
模拟响应
标题强制它

当我在
try catch
块中插入代码时,“问题”就出现了。我获得了预期的
异常
,但无法从
响应中获得任何详细信息

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', 'error' => $e->getResponse()], 400);
    }
    return response()->json([
        'msg' => 'Client Error',
        'request' => $e->getRequest(),
        $e->hasResponse() ? $e->getResponse() : ""
    ]);
    // return response()->json(['msg' => 'Server Error', 'error' => report($e)]);
}
catch (BadResponseException $e){
    return response()->json(['error' => $e]);
}
这是
客户端异常的输出:

{
    "msg": "Server Error",
    "error": {} // also empty
}
错误:请求失败,状态代码为400

如果我强制执行
服务器异常

{
    "msg": "Server Error",
    "error": {} // also empty
}
将抛出
异常
,但是,这肯定不足以正确处理错误。我需要从
响应中获取详细信息

前端,以防有人想看到它:

const onApprove = (data, actions) => {
    console.log("payment approved by user", data);
    const orderID = data.orderID;

    return axios
        .post("/paypal/rest-api/capture-order", {
            orderID: orderID,
        })
        .then((res) => {
            console.log("success creating order", res.data);
        })
        .catch((err) => {
            console.error(err);
        });
};

异常应该是具有getResponse方法的BadResponseException的实例。然后可以将响应主体强制转换为字符串

$response = json_decode($ex->getResponse()->getBody()->getContents(), true);