PHP,Codebird 和 Twitter 为什么收到错误 401 无效请求令牌

PHP, Codebird and Twitter why am receiving error 401 Invalid Request Token

我正在尝试使用 codebird 从 Twitter 获取访问令牌,首先让用户授权使用我的应用程序,使用此代码可以完美地工作

    require_once('lib/codebird.php');

\Codebird\Codebird::setConsumerKey("xxx", "xxxx");
$cb = \Codebird\Codebird::getInstance();
session_start();
    // get the request token
    $reply = $cb->oauth_requestToken(array(
        'oauth_callback' => 'http://lifetanstic.co.ke/AppRegister'));
    // store the token
    $cb->setToken($reply->oauth_token, $reply->oauth_token_secret);
    $_SESSION['oauth_token'] = $reply->oauth_token;
    $_SESSION['oauth_token_secret'] = $reply->oauth_token_secret;
    $_SESSION['oauth_verify'] = true;

    // redirect to auth website
    $auth_url = $cb->oauth_authorize();
?>
    <script type="text/javascript">
        window.location = "<?php echo  $auth_url; ?>";
    </script>

<?php
    //header('Location: ' . $auth_url);
?>

这是我被重定向到这里的地方:

然后我被重定向到 window,我应该在那里获取访​​问令牌和访问令牌机密,这也有效。

这是使用 $_GET[] 我得到以下代码的地方 http://lifetanstic.co.ke/AppRegister?oauth_token=zzzzz&oauth_verifier=zzzz

现在在该页面中,当我 运行 以下代码时,它不起作用,但会产生以下错误:

require_once('lib/codebird.php');
session_start();
\Codebird\Codebird::setConsumerKey("xxxx", "xxxx");
$cb = \Codebird\Codebird::getInstance();
// get the access token
$reply = $cb->oauth_accessToken(array(
        'oauth_verifier' => $_GET['oauth_verifier']
));

var_dump($reply);

当我转储回复时,它有以下错误:

object(stdClass)#1 (3) { ["message"]=> string(21) "Invalid request token" ["httpstatus"]=> int(401) ["rate"]=> NULL }

那么我应该如何获得 aouth_accessToken,这个 oauth_token=zzzzz&oauth_verifier=zzzz url 参数提供并且用户已授权使用我的申请?

所以让我回答我自己的问题,代码中不起作用的部分是:

require_once('lib/codebird.php');
session_start();
\Codebird\Codebird::setConsumerKey("xxxx", "xxxx");
$cb = \Codebird\Codebird::getInstance();
// get the access token
$reply = $cb->oauth_accessToken(array(
        'oauth_verifier' => $_GET['oauth_verifier']
));

var_dump($reply);

我明白了为什么,在这里的 codebird 教程中 https://github.com/jublonet/codebird-php 有一些我认为不是必需的东西,但现在恢复它,它奇迹般地工作,这行代码

$cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

所以最终的代码会是这样的:

require_once('lib/codebird.php');
session_start();
\Codebird\Codebird::setConsumerKey("xxxx", "xxxxx");
$cb = \Codebird\Codebird::getInstance();
// get the access token
$cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
/*$reply = $cb->oauth_requestToken(array(
    'oauth_callback' => 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']
));*/
$reply = $cb->oauth_accessToken(array(
        'oauth_verifier' => $_GET['oauth_verifier']
    ));
//var_dump($reply);

取消注释最后一行以更详细地显示结果

to confirm the results, i posted to twitter successfully using this code:
$cb->setToken($reply->oauth_token, $reply->oauth_token_secret);
$params = array(
  'status' => '1Auto Post on Twitter with PHP http://goo.gl/OZHaQD #php #twitter @Maina_Wycliffe'
);
$reply = $cb->statuses_update($params);
//var_dump($reply); 

这是证据,推文 url-> https://twitter.com/Maina_Wycliffe/status/595995951132712960

并推文本身 希望这对你有所帮助

这真的很奇怪,因为

 $cb->setToken($_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);

应该不行。第一个变量不是 OAuth 访问令牌。您需要从授权 URL 中获取此令牌 - 这就是发明此令牌的目的。也许其他用户可能想要使用您的应用程序。 即使我的脚本中有这行代码,我也无法发推文,因为我收到 "invalid token" 错误,所以对我来说,整个 codebird 库都是一团糟,没有适当的文档:(