Paypal API,Curl 不返回任何输出
Posted
技术标签:
【中文标题】Paypal API,Curl 不返回任何输出【英文标题】:Paypal API, Curl not returning any output 【发布时间】:2013-10-14 10:14:55 【问题描述】:我正在尝试找出 paypal API,并且我有以下代码,它应该进行调用,获取访问令牌,然后进行 API 调用。第一部分有效(直到$accesstoken
行),并正确返回访问令牌,但第二部分不返回任何内容。这应该模仿的代码可以在这里找到:Make Your First Call
$url = "https://api.sandbox.paypal.com/v1/oauth2/token";
$headers = array(
'Accept' => 'application/json',
'Accept-Language' => 'en_US',
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=client_credentials');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERPWD, $clientID . ':' . $clientSecret);
$curl = curl_exec($ch);
$x = json_decode($curl, TRUE);
print_r($x);
$accesstoken = $x['access_token'];
$headers2 = array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer' . $accesstoken
);
$data = array(
"intent" => "sale",
"redirect_urls" => array(
"return_url" => "http://example.com/your_redirect_url/",
"cancel_url" => "http://example.com/your_cancel_url/"
),
"payer" => array(
"payment_method" => "paypal"
),
"transactions" => array(
"transactions" => array(
"total" => ".99",
"currency" => "USD"
)
)
);
$saleurl = "https://api.sandbox.paypal.com/v1/payments/payment";
$sale = curl_init();
curl_setopt($sale, CURLOPT_URL, $saleurl);
curl_setopt($sale, CURLOPT_VERBOSE, TRUE);
curl_setopt($sale, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($sale, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($sale, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($sale, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($sale, CURLOPT_HTTPHEADER, $headers2);
$finalsale = curl_exec($sale);
$verb = json_decode($finalsale, TRUE);
print_r($verb);
Curl 对我来说并不完全有意义,我们将不胜感激。
更新: 我将标题的格式更改为:
$headers2 = array(
'Content-Type: application/json',
'Authorization: Bearer ' . $accesstoken
);
根据其中一个答案。现在它正在显示:
[name] => MALFORMED_REQUEST
[message] => Incoming JSON request does not map to API request
[information_link] => https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST
[debug_id] => f53a882702a04
【问题讨论】:
在您的生产代码中始终验证对等节点并验证主机以确保安全:docforge.com/wiki/php/Curl 永远不要假设外部调用成功。您没有检查 curl_exec() 的任一返回值是否为布尔值 false,这表明失败。您只需获取返回的值并尝试对其进行 json_decode 即可。至少你应该有更像if (($result = $curl_exec($handle) === FALSE) die(curl_error($handle));
@Matt,我现在正在测试,当然,一旦我上线,SSL 是必须的。
@Marc 我试过了: if (($result = curl_exec($sale)) === FALSE) echo "Error.";死(curl_error($sale)); 但它没有触发。我现在正在研究 curl 调试命令。
(无耻插件)如果您通过 Runscope 运行它,您可以更轻松地看到 API 返回的内容。 runscope.com/provider-guide/troubleshooting-api-requests
【参考方案1】:
您没有正确设置标题...
$headers = array(
'Accept: application/json',
'Accept-Language: en_US'
);
和
$headers2 = array(
'Content-Type: application/json',
'Authorization: Bearer ' . $accesstoken
);
格式是否正确。
还要注意 $accesstoken 之间 Bearer 后面的(空格)
编辑:更新您的 JSON(我认为这是正确的,但将其回显并对照参考进行检查,我可能有一对多数组()
$data = array(
"intent" => "sale",
"redirect_urls" => array(
"return_url" => "http://example.com/your_redirect_url/",
"cancel_url" => "http://example.com/your_cancel_url/"
),
"payer" => array(
"payment_method" => "paypal"
),
"transactions" => array(array(
"amount" => array(
"total" => ".99",
"currency" => "USD"
)
)
)
);
【讨论】:
现在它给出了关于格式错误的请求的错误,“传入的 JSON 请求未映射到 API 请求” 现在它给了我:“货币金额必须是非负数,可以选择包含精确的 2 位小数,用 '.' 分隔,可选千位分隔符 ',',限制为小数点前 7 位点” 添加 0(0.99 vs .99)修复了这个问题。【参考方案2】:你需要一个空间
$headers2 = array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $accesstoken // Added a space after Bearer
);
看看现在能不能用
【讨论】:
这似乎并没有改变任何东西,虽然你对空间的看法是正确的,但我打算将它包括在内。【参考方案3】:改变 curl_setopt($sale, CURLOPT_POSTFIELDS, json_encode($data));
到 curl_setopt($sale, CURLOPT_POSTFIELDS, $data);
json 编码函数破坏了它
【讨论】:
以上是关于Paypal API,Curl 不返回任何输出的主要内容,如果未能解决你的问题,请参考以下文章
Paypal REST api 调用适用于 cURL,但不适用于 C# 代码
使用 cURL 和 JavaScript + Rest API 登录 Paypal