这个帖子请求我做错了什么?

时间:2014-07-28 14:49:03

标签: php post file-get-contents

我正在尝试通过网络进行身份验证,以获取有效的令牌来实现付费按钮。 我在PHP中有这个代码:

$url = 'https://api.mercadolibre.com/oauth/token';



$fields = array(
    'grant_type' => 'authorization_code',
    'client_id' => $marketplace_client_id,
    'client_secret' => $marketplace_client_secret,
    'code' => $authorization_code,
    'redirect_uri' => $redirect_uri
);

//al this variables are strings


$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded",
        'method'  => 'POST',
        'content' => http_build_query($fields),
    ),
);
$context  = stream_context_create($options);

var_dump($context);

echo "<br><br>";
$result = file_get_contents($url, false, $context);

var_dump($result);

echo "<br><br>";

$response = (array) json_decode($result);

var_dump($response);

echo "<br><br>";
echo $response["access_token"];

此代码正在返回

resource(2) of type (stream-context) 

bool(false) 

array(0) { } 

当我使用Postman for Chrome进行发布请求时

我至少收到了

{
    "message": "Error validating grant. Your authorization code or refresh token may be expired or it was already used.",
    "error": "invalid_grant",
    "status": 400,
    "cause": []
}

有时我会收到成功消息。

我已经阅读了很多教程,看起来很简单,我不知道我错过了什么。至少我想收到错误json所以我可以纠正输入数据中的问题,但我甚至没有得到这个。另一个罕见的事情是,authorization_code在第一次使用时到期,每次运行此代码时它都会到期,因此服务器可能正在接收我的发布请求,但我没有收到返回消息。这可能吗?

2 个答案:

答案 0 :(得分:0)

这不是我的代码问题。 MercadoLibre(我发送帖子请求的网站)只收到POST请求víacUR。

所以我用这个替换了我的代码:

public function doPost($fields, $url) {

    $heads = array('Accept: application/json', 'Content-Type: application/x-www-form-urlencoded');

    // build the post data following the api needs
    $posts = http_build_query($fields);

    // change the curl method following the api needs
    $options = array(
        CURLOPT_RETURNTRANSFER => '1',
        CURLOPT_HTTPHEADER => $heads,
        CURLOPT_SSL_VERIFYPEER => 'false',
        CURLOPT_URL => $url,
        CURLOPT_POSTFIELDS => $posts,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_SSLVERSION => 3
    );
    // do a curl call
    $call = curl_init();
    curl_setopt_array($call, $options);
    // execute the curl call
    $response = curl_exec($call);
    // get the curl status
    //$status = curl_getinfo($call);
    // close the call
    curl_close($call);
    // transform the json in array
    $response = (array) json_decode($response);
    return $response;
}

一切正常。

答案 1 :(得分:0)

    CURLOPT_SSLVERSION => 3

无法再使用新版本的SDK替换它