Php 使用eBay OAuth

Php 使用eBay OAuth,php,oauth,ebay-api,Php,Oauth,Ebay Api,我的代码如下所示。我正在尝试通过易趣验证用户是否能够获得访问令牌。将用户重定向回我的重定向URL以使用访问令牌交换代码时,我收到错误: HTTP/1.1 100继续HTTP/1.1 400错误请求内容长度:109 CNE行动:截止日期:2017年3月2日星期四06:47:51 GMT RlogId: t6ldssk%28ciudbq%60anng%7Fu2h%3F%3Cwk%7Difvqn*2%3D%3F%3E505-15a8dc659e6-0xf3 设置Cookie:ebay=%5Esbf%3

我的代码如下所示。我正在尝试通过易趣验证用户是否能够获得访问令牌。将用户重定向回我的重定向URL以使用访问令牌交换代码时,我收到错误:

HTTP/1.1 100继续HTTP/1.1 400错误请求内容长度:109 CNE行动:截止日期:2017年3月2日星期四06:47:51 GMT RlogId: t6ldssk%28ciudbq%60anng%7Fu2h%3F%3Cwk%7Difvqn*2%3D%3F%3E505-15a8dc659e6-0xf3 设置Cookie:ebay=%5Esbf%3D%23%5E;域名=.ebay.com;路径=/ X-EBAY-C-REQUEST-ID:ri=v22kQg9yaBLq,rci=2FDiyansIYnkONQC X-EBAY-C-VERSION:1.0.0 X-EBAY-REQUEST-ID: 15a8dc658f8.a0968eb.5f6ef.fff87b7e![]内容类型:应用程序/json 连接:保持活力 {“错误”:“无效的请求”,“错误描述”:“授权”无效 缺少标题“,”错误_uri“:null}

我的发帖请求有什么问题

$auth_code = $_GET['code'];
$client_id = "Client ID";
$client_secret = "Client Secret";
$redirect_uri = "RuName";
$headers = array (
    'Content-Type'  => 'application/x-www-form-urlencoded',
    'Authorization' => sprintf('Basic %s',base64_encode(sprintf('%s:%s', $client_id, $client_secret)))
);
$apiURL = "https://api.sandbox.ebay.com/identity/v1/oauth2/token";
$urlParams = array (
        "grant_type" => "authorization_code",
        "code" => urlencode($auth_code),
        "redirect_uri" => $redirect_uri
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Should be removed on production
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, true );

curl_setopt($ch, CURLOPT_URL, $apiURL);
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers = array ('Authorization' => sprintf('Basic %s',base64_encode(sprintf('%s:%s', $client_id, $client_secret))),'Content-Type'  => 'application/x-www-form-urlencoded') );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $urlParams );

$resp = curl_exec ( $ch );
curl_close ( $ch );

print_r ( $resp );

您的代码有两个小问题。第一个是CURLOPT_HTTPHEADER需要字符串数组,而不是关联数组

$headers = array (
    'Content-Type: application/x-www-form-urlencoded',
    'Authorization: '.sprintf('Basic %s',base64_encode(sprintf('%s:%s', $client_id, $client_secret)))
);
第二个问题是PHP如何处理CURLOPT_POSTFIELDS选项。如报告中所述

将数组传递给CURLOPT_POSTFIELDS会将数据编码为 传递URL编码字符串时,多部分/表单数据将进行编码 数据以application/x-www-form-urlencoded的形式显示

由于eBay API要求主体为
application/x-www-form-urlencoded
,因此您需要传入字符串。您可以通过将数组传递给来使用数组来构建此字符串

我还建议测试向eBay发出API请求。它的一个特性是,它还将为您创建PHP curl代码。下面的代码是根据Postman创建的代码改编的

<?php

$clientID = '<YOUR EBAY APP ID>';
$clientSecret = '<YOUR EBAY CERT ID>';
$ruName = '<YOUR EBAY RUNAME>';
$authCode = '<AUTH CODE>';

$url = 'https://api.sandbox.ebay.com/identity/v1/oauth2/token';

$headers = [
    'Content-Type: application/x-www-form-urlencoded',
    'Authorization: Basic '.base64_encode($clientID.':'.$clientSecret)
];

$body = http_build_query([
    'grant_type'   => 'authorization_code',
    'code'         => $authCode,
    'redirect_uri' => $ruName
]);

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'POST',
    CURLOPT_POSTFIELDS     => $body,
    CURLOPT_HTTPHEADER     => $headers
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response."\n";
}

你真的帮助了我。似乎有很多关于卷发的知识需要我去学习。成功了!!非常感谢David。今天,我得到了一个关于eBay API的很棒的教程,但我得到了“{”错误“:“无效的授权”,“错误描述”:“提供的授权授权代码无效或已颁发给另一个客户”}。我做错了什么?我从这里得到了$authCode,请检查这张图片-,@shubhamjain你得到了错误的令牌。eBay提供了一个名为“Auth'n'Auth”的旧样式和一个更新的OAuth版本。从您的屏幕截图可以看出,您已经生成了一个“Auth'n'Auth”令牌。此令牌不能与新的RESTFul API一起使用。在生成令牌之前,您需要在页面顶部选择“OAuth(新安全)”选项。@DavidT.Sadler根据您的评论,我已经使用OAuth生成了令牌,但仍然存在问题。我重复使用了你在答案中发布的代码。有什么建议吗?你能给我提供完整的oauth连接到易趣的部分吗。我尽了我所能,但不能再往前走了。我真的希望能得到你的帮助。我会非常感激的。谢谢
<?php

$clientID = '<YOUR EBAY APP ID>';
$clientSecret = '<YOUR EBAY CERT ID>';
$ruName = '<YOUR EBAY RUNAME>';
$authCode = '<AUTH CODE>';

$url = 'https://api.sandbox.ebay.com/identity/v1/oauth2/token';

$headers = [
    'Content-Type: application/x-www-form-urlencoded',
    'Authorization: Basic '.base64_encode($clientID.':'.$clientSecret)
];

$body = http_build_query([
    'grant_type'   => 'authorization_code',
    'code'         => $authCode,
    'redirect_uri' => $ruName
]);

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL            => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'POST',
    CURLOPT_POSTFIELDS     => $body,
    CURLOPT_HTTPHEADER     => $headers
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response."\n";
}