我正在尝试为Paypal的RESTful web服务获得访问令牌,但不幸的是没有取得任何进展。这是我第一次接触REST,所以请耐心点:)
我有:
- Paypal通过Paypal开发者网站为沙盒账户提供的Client_id和secret。
- 终端:https://api.sandbox.paypal.com/v1/oauth2/token
我所指的文档是:https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/
现在是进行API调用的有趣部分。我在PHP开发,所以我使用CURL进行调用。像这样;
const CLIENT_ID = ****..*** ;
const SECRET = ***..***;
$base64EncodedClientID = base64_encode(self::CLIENT_ID . ":" . self::SECRET);
$headers = array("Authorization" => "Basic " . $base64EncodedClientId, "Accept" =>"*/*", "Content-type" => "multipart/form-data");
$params = array("grant_type"=>"client_credentials");
$url = "https://api.sandbox.paypal.com/v1/oauth2/token";
$ch = curl_init();
curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_HEADER, $headers);
curl_setopt($ch,CURLOPT_POSTFIELDS,$params);
$response = curl_exec($ch);
很普通,对吧?除了我没有得到JSON响应,我期望从Paypal,但假。这意味着我的CURL请求没有准备好,也许我设置了错误的头或参数不正确。无论如何,URL绝对是可访问的,因为我能够通过具有相同凭据的命令行访问它并获得所需的JSON响应。
上面代码的一个明显问题是,我提供了client_id和secret作为标头选项。基本感觉告诉我,它们需要成为POST字段数据的一部分。然而,如果你看一下这个Github代码https://github.com/paypal/rest-api-sdk-php/blob/master/lib/PayPal/Auth/OAuthTokenCredential.php (paypal的官方PHP REST SDK)的第89行,它清楚地指出,凭据是在头字段中设置的。
我哪里搞错了
使用curl,您不需要为授权头手动生成base64编码的值,只需使用CURLOPT_USERPWD选项并传递clientID和secret作为用户:pwd。
curl_setopt($curl, CURLOPT_USERPWD, $clientId . ":" . $clientSecret);
这里是一个示例-查找get_access_token()方法:https://github.com/paypal/rest-api-curlsamples/blob/master/execute_all_calls.php
与您遇到的问题完全相同。问题是PayPal接受内容类型的application/x-www-form-urlencoded。您的代码正在尝试发送多部分/表单数据。CURL默认发送的是application/x-www-form-urlencoded,但是您将数据作为数组传递。相反,您应该像传递url编码字符串一样传递数据,因为这就是application/x-www-form-urlencoded数据的样子:
$params = "grant_type=client_credentials";
你的标题也有同样的问题。将其作为字符串数组而不是字典传递。例如:
$headers = ["Authorization Basic " . $base64EncodedClientId];
同样,您也不需要传入的另外两个头文件。"Accept"标头什么都不做,因为你接受了所有东西,并且Content-type是错误的,而Content-type是CURL默认为"application/x-www-form-urlencoded",所以除非你需要覆盖它,否则没有必要。