Я, имеющий ту же самую проблему .. Мне понадобилось 4 дня, чтобы разыскать его ...
Вот результат моей отладки эхо условное, где у вас есть $ sig сравнивается с $ expected_sig.
сиг: [ꢖbuf^4 ֣ GP
ожидается сиг: {.nwW: гв 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);
возвращает неправильный хэш!
НО ПОЧЕМУ?
Простой ответ: плохо формируется массив конфигурации ...
Использование "$ конфиг [„APPID“] = $ APP_ID;" ... обратите внимание на кавычки "APPID". Это была прямая копия/вставка из документов/примеров в документах разработчиков facebook.
Заменить эти кавычки со стандартными двойными кавычками
$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional
...вот результаты:
сиг: r0g% W (B^DDV
ожидается сиг: r0g% W (B^DDV
Теперь они совпадают ...
Короче ... сделать phpinfo(), чтобы убедиться, что вы получаете signed_request маркер .. если вы уверены, что получаете это (или «$ REQUEST [fbsr #######]] var), если вы уверены, что получаете кодированный подписанный запрос ... только ваш хэш не будет соответствовать, если вы не получаете там был секрет.