我刚升级到PHP 5.4.19和facebook-php-sdk-v4.
难道只是我还是让FB故意难以整合?!例如,我不使用Composer(无法在我的共享主机上安装它),因此加载新类需要一个特定的(自己发现)排序 - 这就足够了!http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-get-started/上建议的解决方案并不完全正确.
无论如何,当我最终让它运行并在Facebook建议的应用程序高级设置选项卡下启用"App Secret Proof for Server API calls"时,我进入了一个问题22.
就是这个:
1)从我的服务器进行FB API调用,例如$request = new FacebookRequest($session, 'GET', '/me');
我现在必须提供appsecret_proof参数.
2)要创建appsecret_proof,我需要一个access_token即$appsecret_proof= hash_hmac('sha256', $access_token, $app_secret);
.
3)此时要获得只有$ _GET ['code']的access_token,我必须通过进行代码交换
GET https://graph.facebook.com/oauth/access_token?
client_id={app-id}
&redirect_uri={redirect-uri}
&client_secret={app-secret}
&code={code-parameter}
.
4)要调用FB进行代码交换,我得到错误{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}
.
因此出现两个问题:
1)除了通过代码交换,我还能如何获得access_token,以便我可以使用该令牌创建appsecret_proof并依次调用FacebookRequest?
2)在哪里/如何将appsecret_proof放入FacebookRequest?这可能是这样$request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" => $appsecret_proof));
吗?我似乎无法找到有关如何使用PHP API appsecret_proof的具体说明(很明显如何通过http与Graph API一起使用).
女士们,先生们,我解决了这一切 - 我只需要使用$access_token = $session->getToken();
.这帮助我否定了导致OAuthException的代码交换的要求,因为Facebook已经改变了他们对交换代码的策略不止一次使用.
现在,根据Facebook的推荐,在App高级设置选项卡下正确启用了"App Secret Proof for Server API calls".
所以完整的具体解决方案:
$app_id = 'APPID'; $app_secret = 'APPSECRET'; FacebookSession::setDefaultApplication($app_id, $app_secret); $redirect_url = "https://mydomain.com/login"; $helper = new FacebookRedirectLoginHelper($redirect_url); try { $session = $helper->getSessionFromRedirect(); } catch (FacebookRequestException $ex) { } catch (Exception $ex) { } if (isset($session)) { $access_token = $session->getToken(); $appsecret_proof = hash_hmac('sha256', $access_token, $app_secret); $request = new FacebookRequest($session, 'GET', '/me', array("appsecret_proof" => $appsecret_proof)); $response = $request->execute(); $graphObject = $response->getGraphObject(); echo print_r($graphObject, 1); } else { echo '<a href="' . $helper->getLoginUrl() . '">Login</a>'; }