我一直在努力嘲笑'INSTRUMENT_DECLINED'问题,根据Paypal的说法,这是在试图捕获订单(https://developer.paypal.com/demo/checkout/#/pattern/server)后常见的错误。
正确设置头以模拟响应将帮助我模拟来自docs https://developer.paypal.com/docs/business/test-and-go-live/simulation-tests/#orders的其他错误。
我用的是拉拉维尔的后端和反应前端。
我已经得到了使用axios并调用前端的预期模拟响应:
return axios
.post(
`https://api-m.sandbox.paypal.com/v2/checkout/orders/${orderID}/capture`,
{},
{
headers: {
"Content-Type": "application/json",
Authorization: "Bearer " + accessToken,
"PayPal-Mock-Response":
'{"mock_application_codes":"INSTRUMENT_DECLINED"}',
},
}
)
.then((res) => {
console.log(res);
})但是,我不想将accessToken暴露到前端,我更愿意在后端使用GuzzleHtttp完成所有事情。
我已经得到了积极的响应--使用'status': 'COMPLETED'而没有添加像这样的PayPal-Mock-Response头:
$client = new \GuzzleHttp\Client();
$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" => "INSTRUMENT_DECLINED"]),
// 'PayPal-Mock-Response' => "['mock_application_codes':'INSTRUMENT_DECLINED]",
],
],
);
$data = json_decode($response->getBody(), true);但是,当添加如上面注释的代码所示的PayPal-Mock-Response头时,两个调度都返回了这个异常:
"C:\xampp\htdocs\react\React-Laravel\vinos-gdl\vendor\guzzlehttp\guzzle\src\Exception\RequestException.php",:
"message":"Client error:
POST https://api-m.sandbox.paypal.com/v2/checkout/orders/9HG50866FU785784C/capture导致了404 Not Found响应“,"exception":"GuzzleHttp\Exception\ClientException",”POST https://api-m.sandbox.paypal.com/v2/checkout/orders/9HG50866FU785784C/capture“:
这个异常,我肯定要按照我将PayPal-Mock-Response头传递到Guzzle http调用的方式来做,但是我找不到正确的方法。
任何帮助都是非常感谢的。
更新解决了**
现在的方法是发送header,如下所示:
'PayPal-Mock-Response' => json_encode(["mock_application_codes" => "INSTRUMENT_DECLINED"]),
我不知道我是否有打字错误,但我终于收到了。我还使用INTERNAL_SERVER_ERROR从服务器获得一个500 response,并为每种情况构建了一个catch:
} catch (ClientException $e) {
if ($e->hasResponse()) {
return response()->json([
'msg' => 'Client Exception',
'error' => json_decode($e->getResponse()->getBody()),
], 400);
}
return response()->json([
'msg' => 'Client Exception',
'request' => $e->getRequest(),
$e->hasResponse() ? $e->getResponse() : ""
]);
// return response()->json(['msg' => 'Server Error', 'error' => report($e)]);
} catch (BadResponseException $e) {
if ($e->hasResponse()) {
return response()->json([
'msg' => 'Uknown Exception',
'error' => json_decode($e->getResponse()->getBody()),
], 500);
}
return response()->json([
'msg' => 'Uknown Exception',
'request' => $e->getRequest(),
$e->hasResponse() ? $e->getResponse() : ""
]);
}谢谢你的评论。
发布于 2021-03-30 09:26:37
"PayPal-Mock-Response":
'{"mock_application_codes":"INSTRUMENT_DECLINED"}',..。
// 'PayPal-Mock-Response' => "['mock_application_codes':'INSTRUMENT_DECLINED]",在{} (JSON对象)和[] (JSON数组)之间有一个区别。
括号中的内容不是数组,因此它的语法无效。它没有映射到PayPal所期望的任何东西,因此产生了404。
https://stackoverflow.com/questions/66864405
复制相似问题