首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >口香糖:无法捕捉异常细节

口香糖:无法捕捉异常细节
EN

Stack Overflow用户
提问于 2021-04-02 23:12:07
回答 1查看 1.1K关注 0票数 2

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

我正在使用GuzzleHttp + Laravelcapture客户端的批准。我在完整对象中获得COMPLETED状态。所以请求正常工作了。

代码语言:javascript
复制
$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块中,这将是-of过程--破坏代码。

当请求没有尝试捕获时,这是Laravel的输出:

代码语言:javascript
复制
      "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获得任何细节

代码语言:javascript
复制
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]);
}

这是一个ClientException的输出

错误:状态代码400的请求失败

代码语言:javascript
复制
{
    "msg": "Client Error",
    "error": {} // empty!!!
}

如果我强迫ServerException

代码语言:javascript
复制
{
    "msg": "Server Error",
    "error": {} // also empty
}

但是,抛出Exceptions肯定不足以正确处理错误。我需要从response那里得到详细信息。

如果有人想看到它的前端:

代码语言:javascript
复制
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);
        });
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-03 00:22:38

异常应该是BadResponseException的一个实例,它有一个getResponse方法。然后,可以将响应体转换为字符串。

代码语言:javascript
复制
$response = json_decode($ex->getResponse()->getBody()->getContents(), true);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66926270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档