在Facebook / Helpers / FacebookRedirectLoginHelper.php中调用未定义的函数hash_equals()

时间:2016-05-28 11:11:59

标签: php facebook facebook-graph-api facebook-php-sdk

我正在尝试从facebook用户那里获取基本信息。我正在关注官方文档。我不知道如何摆脱这个错误。

session_start();
require_once 'Facebook/autoload.php';
$fb = new Facebook\Facebook([
  'app_id' => 'XXXXX', // Replace {app-id} with your app id
  'app_secret' => 'xxxxxxxxxx',
  'default_graph_version' => 'v2.2',
  ]);

$helper = $fb->getRedirectLoginHelper();

//Get the Access Token

try {
        //access token for the account
        $access_token=$helper->getAccessToken();

} catch (Facebook\Exceptions\FacebookResponseException $e) {
        echo 'Graph returned an erorr'. $e->getMessage();
        exit;
}catch(Facebook\Exceptions\FacebookSDKException $e){
        echo 'Graph returned an erorr'. $e->getMessage();
        exit;
}

echo '<h3>Access Token</h3>';
var_dump($accessToken->getValue());


$loginUrl = $helper->getLoginUrl('https://startup-sarathjasrin.c9users.io/login/');

echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook!</a>';

我正在使用最新的facebook-php-sdk-v5。

3 个答案:

答案 0 :(得分:4)

错误表示函数函数hash_equals()不存在。这是一个内置的散列系统的PHP,仅适用于:

  

(PHP 5> = 5.6.0)

因此,如果您的版本低于5.6.0,则不会内置此功能。阅读文档:here

在旁注上你能够创建自己的hash_equals函数:

if(!function_exists('hash_equals'))
{
    function hash_equals($str1, $str2)
    {
        if(strlen($str1) != strlen($str2))
        {
            return false;
        }
        else
        {
            $res = $str1 ^ $str2;
            $ret = 0;
            for($i = strlen($res) - 1; $i >= 0; $i--)
            {
                $ret |= ord($res[$i]);
            }
            return !$ret;
        }
    }
}

或者从git here下载兼容包但是这个包用于较新的php哈希并且需要一些代码返工,因为它使用password_verify而不是hash_equals

答案 1 :(得分:1)

Facebook PHP SDK开发人员已经为此包含了一个polyfill: https://github.com/facebook/.../polyfills.php

所以你应该只在你的脚本中包含这个文件; 例如:

require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Facebook'. DIRECTORY_SEPARATOR . 'polyfills.php');

创建自己的hash_equals函数可能会导致不可预测的行为,因为polyfills.php实现略有不同。

答案 2 :(得分:0)

我遇到了同样的问题。我做的是:

require_once __DIR__ . '/polyfills.php';

生成错误:/ SignRequest.php