构建Paypal OAuth

时间:2013-03-11 23:20:38

标签: paypal paypal-sandbox

我正在尝试为Paypal的RESTful Web服务获取访问令牌,但遗憾的是没有取得任何进展。这是我第一次处理REST,所以请耐心等待我:)

这就是我所拥有的:

  1. Paypal通过paypal开发者网站为沙盒帐户提供的Client_id和密码。
  2. ENDpoint:https://api.sandbox.paypal.com/v1/oauth2/token
  3. 我所指的文件是: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),它清楚地说明了正在设置的凭据在标题字段中。

    我在哪里弄乱?

2 个答案:

答案 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”,因此除非您需要覆盖它,否则不需要。