У меня точно такая же проблема ... Мне понадобилось 4 дня, чтобы отследить ее ...
Вот результат моего отладочного эха условного выражения, в котором вы сравниваете $ sig с $ожидаемый сигнал.
сигнал: [�ꢖ�b��u����f� ^ ��4 ֣� GP�
ожидаемый сигнал: �� {��.��nwW�: �r��B�����C8 $ ��% F
По какой-то причине отправляемая подпись НЕ совпадает ни с одной из ожидаемых закодированных подписей.
Так что мне было интересно ... что здесь может быть не так?
Может быть, я не передаю правильный "Секрет", даже если я настраиваю его прямо в моей конфигурации?
require_once("facebook.php");
$config = array();
$config[‘appId’] = $APP_ID;
$config[‘secret’] = $APP_SECRET;
$config[‘fileUpload’] = false; // optional
$facebook = new Facebook($config);
Как выясняется, когда я использую
$facebook->getAppID();
или
$facebook->getAppSecret();
НИЧЕГО не возвращается!
Именно поэтому мой getSignedRequestCookieName ()функция возвращает только «fbsr _»
Вот почему
$expected_sig = hash_hmac('sha256', $payload,
$facebook->getAppSecret(), $raw = true);
возвращает неправильный хеш!
НО ПОЧЕМУ?
Простой ответ: плохо сформированныйконфиг арray ...
Используя "$ config ['appId'] = $ APP_ID;" ... обратите внимание на кавычки вокруг "appId".Это было прямое копирование / вставка из документов / примеров в документах разработчика Facebook.
Замените эти цитаты стандартными двойными кавычками
$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional
... вот результаты:
sig: r�0��g% ���ͦ��w� (�B ^ ���Ddv
ожидаемый sig: r�0��g% ���ͦ��w� (�B ^ ���Ddv
Теперь они совпадают ...
Короче говоря ... сделайте phpinfo (), чтобы убедиться, что вы получаете токен подписанного запроса)... если вы уверены, что получаете это (или "$ REQUEST [fbsr #######]")) ... если вы уверены, что вы получите закодированный со знакомзапрос ... единственная причина, по которой ваш хеш не будет совпадать, это если вы не получили верный секрет.