我遇到了完全相同的问题..我花了 4 天时间才找到它...
这是我对条件的调试回显的结果,您将 $sig 与 $expected_sig 进行比较。
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);
返回错误的哈希值!
但是为什么?
简单的答案:格式错误的配置数组...
使用 "$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
预期信号:r�0��g%���ͦ��w�(�B^���Ddv
它们现在匹配...
长话短说...做一个 phpinfo() 来确保你得到一个 signed_request 令牌......如果你确定你得到了那个(或“$REQUEST[fbsr #######]" var)...如果您确定收到的是经过编码的签名请求...您的哈希值不匹配的唯一原因是您没有获得正确的秘密在那里。