Paypal 客户纠纷 API - 始终提供证据 returns MISSING_OR_INVALID_REQUEST_BODY
Paypal Customer Dispute API - Provide Evidence always returns MISSING_OR_INVALID_REQUEST_BODY
我在向 Paypal Disputes in the Claim Stage after verifying that the dispute case has the /provide-evidence
on its HATEOAS links 提供证据时一直在尝试上传 pdf 文件,下面的 curl 代码在 CLI 中有效:
$ curl -v -X POST https://api.sandbox.paypal.com/v1/customer/disputes/PP-D-12345/provide-evidence \
-H "Content-Type: multipart/related" \
-H "Authorization: Bearer {AccessToken}" \
-F 'input={"evidences":[{"evidence_type": "PROOF_OF_FULFILLMENT", "evidence_info": {"tracking_info": [{"carrier_name": "FEDEX", "tracking_number": "123456789"}]}, "notes": "Test"}]};type=application/json' \
-F 'file1=@D:\Sample\storage\app\paypal\sample.pdf'
然而,当转换为 PHP 时,使用 curl
或 guzzle
时 API returns VALIDATION_ERROR - MISSING_OR_INVALID_REQUEST_BODY
,我几乎尝试了所有可能的方法,但错误是一致的。
使用 Guzzle:(尝试尽可能多地复制上面的工作卷曲,因为 Guzzle 无法发送 multipart/related
请求,我不得不 modify the content-type manually).
$pdf = 'D:\Sample\storage\app\paypal\sample.pdf';
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]
],
'notes' => 'Test',
],
]
];
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://api.sandbox.paypal.com',
'timeout' => 2.0,
'version' => 1.1
]);
$options = [
'headers' => [
'Authorization' => "Bearer $token",
],
'multipart' => [
[
'name' => 'input',
'contents' => json_encode($input),
'headers' => ['Content-Type' => 'application/json']
],
[
'name' => 'file1',
'contents' => fopen($pdf, 'r'),
'filename' => 'sample.pdf',
'headers' => ['Content-Type' => 'application/pdf']
],
]
];
$url = '/v1/customer/disputes/'.$disputeId.'/provide-evidence';
$headers = isset($options['headers']) ? $options['headers'] : [];
$body = new \GuzzleHttp\Psr7\MultipartStream($options['multipart']);
$request = new \GuzzleHttp\Psr7\Request('POST', $url, $headers, $body, '1.1');
$modify['set_headers']['Content-Type'] = 'multipart/related; boundary=' . $request->getBody()->getBoundary();
$request = \GuzzleHttp\Psr7\modify_request($request, $modify);
$response = $client->send($request);
上面的 guzzle 代码仍然是 return {VALIDATION_ERROR - MISSING_OR_INVALID_REQUEST_BODY}
,当我只是做一个正常的 multipart/form-data 请求时,结果相同。
可能是什么问题?任何想法或建议都会非常有帮助,谢谢。
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]
],
'notes' => 'Test',
],
]
];
这是你的 $input,如果你 json_encode()
它,你会得到
{
"evidences":
[
{
"evidence_type":"PROOF_OF_FULFILLMENT",
"evidence_info":{
"tracking_info":{
"carrier_name":"FEDEX",
"tracking_number":"122533485"
}
},
"notes":"Test"
}
]
}
与您的请求正文不匹配,
我已经通过插入另一个方括号更改了你的 $input,
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [[
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]]
],
'notes' => 'Test',
],
]
];
现在它符合您的 curl 请求,
{
"evidences":
[
{
"evidence_type":"PROOF_OF_FULFILLMENT",
"evidence_info":
{
"tracking_info":
[
{
"carrier_name":"FEDEX",
"tracking_number":"122533485"
}
]
},
"notes":"Test"
}
]
}
希望对您有所帮助。如果它不起作用,那么问题可能出在其他地方,但请求正文将匹配,您可以先尝试 guzzle 调用。
我在向 Paypal Disputes in the Claim Stage after verifying that the dispute case has the /provide-evidence
on its HATEOAS links 提供证据时一直在尝试上传 pdf 文件,下面的 curl 代码在 CLI 中有效:
$ curl -v -X POST https://api.sandbox.paypal.com/v1/customer/disputes/PP-D-12345/provide-evidence \
-H "Content-Type: multipart/related" \
-H "Authorization: Bearer {AccessToken}" \
-F 'input={"evidences":[{"evidence_type": "PROOF_OF_FULFILLMENT", "evidence_info": {"tracking_info": [{"carrier_name": "FEDEX", "tracking_number": "123456789"}]}, "notes": "Test"}]};type=application/json' \
-F 'file1=@D:\Sample\storage\app\paypal\sample.pdf'
然而,当转换为 PHP 时,使用 curl
或 guzzle
时 API returns VALIDATION_ERROR - MISSING_OR_INVALID_REQUEST_BODY
,我几乎尝试了所有可能的方法,但错误是一致的。
使用 Guzzle:(尝试尽可能多地复制上面的工作卷曲,因为 Guzzle 无法发送 multipart/related
请求,我不得不 modify the content-type manually).
$pdf = 'D:\Sample\storage\app\paypal\sample.pdf';
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]
],
'notes' => 'Test',
],
]
];
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://api.sandbox.paypal.com',
'timeout' => 2.0,
'version' => 1.1
]);
$options = [
'headers' => [
'Authorization' => "Bearer $token",
],
'multipart' => [
[
'name' => 'input',
'contents' => json_encode($input),
'headers' => ['Content-Type' => 'application/json']
],
[
'name' => 'file1',
'contents' => fopen($pdf, 'r'),
'filename' => 'sample.pdf',
'headers' => ['Content-Type' => 'application/pdf']
],
]
];
$url = '/v1/customer/disputes/'.$disputeId.'/provide-evidence';
$headers = isset($options['headers']) ? $options['headers'] : [];
$body = new \GuzzleHttp\Psr7\MultipartStream($options['multipart']);
$request = new \GuzzleHttp\Psr7\Request('POST', $url, $headers, $body, '1.1');
$modify['set_headers']['Content-Type'] = 'multipart/related; boundary=' . $request->getBody()->getBoundary();
$request = \GuzzleHttp\Psr7\modify_request($request, $modify);
$response = $client->send($request);
上面的 guzzle 代码仍然是 return {VALIDATION_ERROR - MISSING_OR_INVALID_REQUEST_BODY}
,当我只是做一个正常的 multipart/form-data 请求时,结果相同。
可能是什么问题?任何想法或建议都会非常有帮助,谢谢。
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]
],
'notes' => 'Test',
],
]
];
这是你的 $input,如果你 json_encode()
它,你会得到
{
"evidences":
[
{
"evidence_type":"PROOF_OF_FULFILLMENT",
"evidence_info":{
"tracking_info":{
"carrier_name":"FEDEX",
"tracking_number":"122533485"
}
},
"notes":"Test"
}
]
}
与您的请求正文不匹配,
我已经通过插入另一个方括号更改了你的 $input,
$input = [
'evidences' => [
[
'evidence_type' => 'PROOF_OF_FULFILLMENT',
'evidence_info' => [
'tracking_info' => [[
'carrier_name' => "FEDEX",
'tracking_number' => '122533485'
]]
],
'notes' => 'Test',
],
]
];
现在它符合您的 curl 请求,
{
"evidences":
[
{
"evidence_type":"PROOF_OF_FULFILLMENT",
"evidence_info":
{
"tracking_info":
[
{
"carrier_name":"FEDEX",
"tracking_number":"122533485"
}
]
},
"notes":"Test"
}
]
}
希望对您有所帮助。如果它不起作用,那么问题可能出在其他地方,但请求正文将匹配,您可以先尝试 guzzle 调用。