Constructing a Paypal OAuth



我正在尝试为Paypal的RESTful web服务获得访问令牌,但不幸的是没有取得任何进展。这是我第一次接触REST,所以请耐心点:)

我有:

  1. Paypal通过Paypal开发者网站为沙盒账户提供的Client_id和secret。
  2. 终端: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",所以除非你需要覆盖它,否则没有必要。

相关内容

  • 没有找到相关文章

最新更新