将 paypal curl 获取访问令牌请求转换为 guzzle

Posted

技术标签:

【中文标题】将 paypal curl 获取访问令牌请求转换为 guzzle【英文标题】:Transform paypal curl get access token request into guzzle 【发布时间】:2014-09-17 01:59:04 【问题描述】:

我需要一些有关 paypal rest api 的帮助。

我使用 guzzle 作为 http 客户端来使用 paypal api

当我在命令行中使用 curl 尝试 paypal 示例时,它确实有效

但是当我想用 guzzle 重现它时,我总是从 paypal 收到 Internal 500 ERROR..

这是官方文档中的 paypal curl 示例(请查看此处https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/):

curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
  -H "Accept: application/json" \
  -H "Accept-Language: en_US" \
  -u "clientId:clientSecret" \
  -d "grant_type=client_credentials"

这是我的代码:

/**
 * Etape 1 récuperer un access token
 */
$authResponse = $client->get("https://api.sandbox.paypal.com/v1/oauth2/token", [
    'auth' =>  [$apiClientId, $apiClientSecret, 'basic'],
    'body' => ['grant_type' => 'client_credentials'],
    'headers' => [
    'Accept-Language' => 'en_US',
    'Accept'     => 'application/json' 
    ]
]);

echo $authResponse->getBody();

我已尝试使用基本身份验证,摘要但到目前为止没有任何工作。

感谢您对此的任何帮助!

【问题讨论】:

你有没有想过这个问题?我遇到了这个exact同样的问题! 有一点需要注意,我认为你的'body' 应该是'query',但对我来说,并没有什么不同。 我终于用了一个自定义的 curl 代码。但我想问题是我们应该使用 guzzle 扩展来通过承载标头处理 oauth 身份验证。查看此链接guzzle3.readthedocs.org/plugins/oauth-plugin.html 【参考方案1】:

这是使用 guzzlehttp

$uri = 'https://api.sandbox.paypal.com/v1/oauth2/token';
$clientId = \\Your client_id which you got on sign up;
$secret = \\Your secret which you got on sign up;

$client = new \GuzzleHttp\Client();
$response = $client->request('POST', $uri, [
        'headers' =>
            [
                'Accept' => 'application/json',
                'Accept-Language' => 'en_US',
               'Content-Type' => 'application/x-www-form-urlencoded',
            ],
        'body' => 'grant_type=client_credentials',

        'auth' => [$clientId, $secret, 'basic']
    ]
);

$data = json_decode($response->getBody(), true);

$access_token = $data['access_token'];

【讨论】:

很好的解析答案【参考方案2】:

您的问题在第一行。

    $authResponse = $client->get

应该是帖子。

     $authResponse = $client->post

我也遇到过类似的问题。

编辑:我也喜欢如果你想使用 JSON 作为请求的主体,要么使用 json_encode 要么用 json 替换主体,guzzle 将处理其余的。在您之前的代码中...

$authResponse = $client->post("https://api.sandbox.paypal.com/v1/oauth2/token", [
    'auth' =>  [$apiClientId, $apiClientSecret, 'basic'],
    'json' => ['grant_type' => 'client_credentials'],
    'headers' => [
        'Accept-Language' => 'en_US',
        'Accept' => 'application/json' 
    ]

]);

【讨论】:

【参考方案3】:

我从“Filippo De Santis”代码中获得帮助。他已经用 guzzle 3.9.1 实现了一个非常好的 PayPal REST API 客户端,你可以在 https://github.com/p16/paypal-rest-api-client 上找到它,你可以使用他的代码。

但如果你还想使用 Guzzle。所以我从他的代码中获得帮助并使用以下代码,它对我来说非常有效

$client = new \Guzzle\Http\Client();

$clientId = "xxxxxxxxx";
$secret = "yyyyyyyyyy";

$request = $client->createRequest(
    'POST',
    'https://api.sandbox.paypal.com/v1/oauth2/token',
    array(
        'Accept' => 'application/json',
        'Accept-Language' => 'en_US',
        'Content-Type' => 'application/x-www-form-urlencoded'
    ),
    'grant_type=client_credentials',
    array(
        'auth' => array($clientId, $secret),
    )
);

$response = $client->send($request);
$data = json_decode($response->getBody(), true);        

var_dump($data);

请注意我使用的是 guzzle 3.9.1

【讨论】:

'Content-Type' => 'application/x-www-form-urlencoded' 的部分实际上对于实时服务器是必不可少的【参考方案4】:

您可以按照以下代码获取您的令牌。对于较新的 Guzzle 版本

$response = $client->post('https://api-m.sandbox.paypal.com/v1/oauth2/token', [
            'auth' =>  [config('your.client_id'), config('your.secret'), 'basic'],
            'form_params' => ['grant_type' => 'client_credentials'],
            'headers' => [
                'Accept' => 'application/json',
                'Accept-Language' => 'en_US'
            ],
        ]);

        return $response->getBody();

【讨论】:

它有效,非常感谢! :) 不客气。 :)

以上是关于将 paypal curl 获取访问令牌请求转换为 guzzle的主要内容,如果未能解决你的问题,请参考以下文章

将 Postman“获取新的授权令牌”转换为 curl 命令

尝试使用 PayPal 的 api 并需要帮助将 Curl 转换为 PHP

将带有嵌入式凭据 URL 的 cURL 请求转换为获取请求 [重复]

在 Android 中调用 Paypal 时无法获取访问令牌

将 curl 命令转换为 java http 客户端代码以获取数据

如何将 instagram curl 发布请求转换为 javascript 请求?