首页 > 解决方案 > Twitter API 返回错误代码 32

问题描述

我们目前正在使用 Twitter API,但未能成功地将推文发送到他们的 API。它总是以 Java 和 PHP 中的代码 32 退出(制作一个 PHP 原型只是为了发送请求)。我想我在这里遗漏了一些关于 OAuth1 规范的内容。

我们使用的 PHP 原型:

<?PHP
require_once("cURL.php");
$headers = [];
$postParams = [];
$signatureParams = [];
$authString = "";
$URL = "https://api.twitter.com/1.1/statuses/update.json";
$method = "POST";
$token = "someValidToken";
$tokenSecret = "someValidTokenSecret";
$timestamp = time();

$status = "Hi, Twitter!";
$signatureParams['status'] = $status;

$clientID = "someClientID";
$clientSecret = "someClientSecret";

$signatureParams['oauth_consumer_key'] = urlencode($clientID);
$signatureParams['oauth_nonce'] = urlencode(base64_encode($timestamp));
$signatureParams['oauth_signature_method'] = urlencode("HMAC-SHA1");
$signatureParams['oauth_timestamp'] = $timestamp;
$signatureParams['oauth_token'] = urlencode($token);    
$signatureParams['oauth_version'] = urlencode("1.0");   

$oauthSignature = generateSignature();
$signatureParams["oauth_signature"] = $oauthSignature;  
unset($signatureParams['status']);
ksort($signatureParams);

$count = 0;
$authStringLoop = "";
foreach($signatureParams as $key => $signatureParam)
{
    if($count++ == 0)
    {
        $authStringLoop .= "OAuth ";
    }

$authStringLoop .= urlencode($key);
$authStringLoop .= "=\"";   
$authStringLoop .= urlencode($signatureParam)."\",";    

}

$authStringLoop = substr($authStringLoop,0,strlen($authStringLoop)-1);

echo "</br></br>";
echo  "AuthString loop: $authStringLoop</br></br>";


$headers = array(
    "Authorization: $authStringLoop"
);

var_dump($headers).'</br>';

var_dump(POST($URL,json_encode($status),$headers,0));



function generateSignature()
{

    global $clientSecret;
    global $signatureParams;
    global $URL;
    global $method;
    global $clientSecret;
    global $clientID;
    global $tokenSecret;

    ksort($signatureParams);

    $parameterString = "";

    foreach($signatureParams as $key => $signatureParam)
    {
        $parameterString .= urlencode($key."=".$signatureParam."&");
    }

    $signingBase = strtoupper($method)."&".urlencode($URL)."&".$parameterString;
    $signingKey = urlencode($clientSecret)."&".urlencode($tokenSecret);

    var_dump($signingBase);
    echo '</br>';

    echo "Base64 encoded: ".base64_encode(hash_hmac("SHA1",$signingBase,$signingKey,TRUE));
    echo '</br>';

    echo "URL encoded: ".urlencode(base64_encode(hash_hmac("SHA1",$signingBase,$signingKey,TRUE)))."</br>";

    return base64_encode(hash_hmac("SHA1",$signingBase,$signingKey,TRUE));

}   
?>

我猜签名的生成方式有问题。但是,我发现的只是按字母顺序对其进行排序,这应该通过 ksort() 调用来完成。我们在这里想念什么?

标签: phptwitteroauth

解决方案


推荐阅读