所以,我正在构建一个新的应用程序,使用Javascript API登录(v2.4),以及PHP API的最新版本(v5)。我为它创建了一个测试应用程序,并且正在使用它。使用Javascript API,我进行登录和身份验证,并保存我从getLoginStatus返回的访问令牌:
FB.getLoginStatus(function(response) {
handleLoginStatusChange(response);
});
function handleLoginStatusChange(response)
{
. . .
else if (response.status == 'connected')
{
// make ajax call to save access token
. . .
}
然后,在我的PHP代码中,我拿起那个访问令牌,并尝试使用它。我也计算了一个appsecret_proof。:
$this->fb = new Facebook\Facebook([
'app_id' => <my app id>,
'app_secret'=> <my app secret>,
'default_graph_version' => 'v2.3'
]);
$this->fbApp = new Facebook\FacebookApp( <my app id>,
<my app secret );
$appsecret_proof = hash_hmac('sha256', <access token>,
<app secret>);
然后我尝试发布我的FB帐户的链接:
$linkData = [
'link' => 'https://google.com',
'message' => 'This is a test post',
];
$response = $this->fb->post('/me/feed', $linkData, <access token>);
这给了我可怕的&#34; API参数中提供的appsecret_proof无效&#34;错误。我不知道这是不是问题,但是如果我将访问令牌放入调试器,它会告诉我这个访问令牌是针对我的实际应用,而不是我的测试应用,所以appID&don?s don& #39; t匹配。如果我了解测试应用程序,我不会认为这是一个问题,特别是因为我正在使用测试appID并通过此代码测试appSecret。
有什么想法吗?我在StackOverflow上看到了一些内容,但它们或者是旧版本的API,或者是编辑API代码本身以禁用内容。
答案 0 :(得分:0)
它告诉我此访问令牌适用于我的实际应用,而非我的测试应用,因此appID不匹配
这就是为什么它不起作用。
想想Facebook上发生的事情:他们需要用于计算app-secret证明的app秘密,因此他们必须通过app id查找。他们从哪里获得应用ID?来自访问令牌......!
因此,如果您为其他应用程序传递访问令牌,这将使他们使用错误的应用程序密钥来计算应用程序密钥证明 - 因此它将与您发送的值不匹配。
您需要使用属于测试应用的访问令牌。
(PHP SDK负责计算和发送应用程序秘密证明本身,您无需手动处理。)