我正在尝试为Paypal的RESTful Web服务获取访问令牌,但遗憾的是没有取得任何进展。这是我第一次处理REST,所以请耐心等待我:)
这就是我所拥有的:
我所指的文件是: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);
漂亮的香草吧?除了我没有得到我期望从Paypal的JSON响应,但是错误。这意味着我的CURL请求准备不好,也许我设置的标题不正确或者参数不正确。无论如何,URL是绝对可访问的,因为我能够通过命令行使用相同的凭据访问它并获得所需的JSON响应。
我对上面代码的一个明显问题是我提供了client_id和secret作为标题选项。基本意义告诉我他们需要成为POST字段数据的一部分但是,如果你看一下这个Github代码https://github.com/paypal/rest-api-sdk-php/blob/master/lib/PayPal/Auth/OAuthTokenCredential.php的第89行(Paypals的官方PHP REST SDK),它清楚地说明了正在设置的凭据在标题字段中。
我在哪里弄乱?
答案 0 :(得分:3)
使用curl,您无需为Authorization标头手动生成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
答案 1 :(得分:0)
遇到了与您完全相同的问题。问题是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之一是错误的,并且两个默认为“ application / x” -www-form-urlencoded”,因此除非您需要覆盖它,否则不需要。