2

我正在尝试获取 Paypal 的 RESTful Web 服务的访问令牌,但不幸的是没有取得任何进展。这是我第一次与 REST 打交道,所以请耐心等待 :)

这是我所拥有的:

  1. 贝宝通过贝宝开发者网站为沙盒帐户提供的 Client_id 和密码。
  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);    

很香草对吧?除了我没有得到我期望从 Paypal 得到的 JSON 响应,而是错误的。这意味着我的 CURL 请求没有准备好,可能是我错误地设置了标头或参数不正确。无论如何,该 URL 绝对是可访问的,因为我能够使用相同的凭据通过命令行访问它并获得所需的 JSON 响应。

上面代码的一个明显问题是我提供了 client_id 和 secret 作为标头选项。基本意义告诉我,它们需要成为 POST 字段数据的一部分但是,如果您查看此 Github 代码的第 89 行https://github.com/paypal/rest-api-sdk-php/blob/master/lib /PayPal/Auth/OAuthTokenCredential.php(Paypals 的官方 PHP REST SDK),它清楚地表明正在标题字段中设置凭据。

我在哪里搞砸了?

4

2 回答 2

3

使用 curl,您无需手动为 Authorization 标头生成 base64 编码值,只需使用 CURLOPT_USERPWD 选项并将 clientID 和 secret 作为 user:pwd 传递。

curl_setopt($curl, CURLOPT_USERPWD, $clientId . ":" . $clientSecret);

这是一个示例 - 查找 get_access_token() 方法: https ://github.com/paypal/rest-api-curlsamples/blob/master/execute_all_calls.php

于 2013-03-12T03:59:54.283 回答
0

遇到了完全相同的问题。问题是 PayPal 接受内容类型 application/x-www-form-urlencoded。您的代码正在尝试发送 multipart/form-data。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- CURL 的 form-urlencoded' 所以除非你需要覆盖它,否则没有必要。

于 2019-05-26T20:46:04.177 回答