В данный момент я работаю с Facebook API и у меня небольшая проблема (никогда не работал с API). Я использую последнюю версию PHP SDK 4.0, и люди входят в приложение, которое сохраняет свой токен доступа в базе данных. Пользователи могут добавлять несколько приложений Facebook (идентификаторы / секреты клиентов) в свой профиль, чтобы хранить свои приложения, которые выполняют уведомления, в одном месте.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу использовать токен доступа, полученный во время входа в систему с приложениями, которые добавляют пользователи. Поэтому моя проблема в том, что мне нужно запросить новый токен доступа без какого-либо взаимодействия с пользователем.
Возможно, есть другой способ, которым я не вижу использования токена доступа, который я получаю в процессе входа в систему с идентификаторами / секретами клиента, которые добавляют пользователи.
Я всегда получаю одну из следующих двух ошибок, когда использую любую пару Client ID / Secret, которую добавил пользователь. (Это означает, что они не совпадают с идентификатором клиента / секретным токеном доступа, который был создан при входе в систему)
Номер один
Unsupported post request. Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api
Номер два
Invalid appsecret_proof provided in the API argument
Вот пример того, что мне нужно сделать.
// Grab an app from the database
$app = App::find($button->app_id);
// Client ID/Secret
$client_id = $app->app_id;
$client_secret = $app->app_secret;
// Grab the access token for the Client ID/Secret from Facebook
$accessToken = explode('=', file_get_contents(
'https://graph.facebook.com/oauth/access_token?client_id=' . $client_id . '&client_secret=' . $client_secret . '&grant_type=client_credentials'
))[1];
// Init the SDK and set the Client ID/Secret
FacebookSession::setDefaultApplication($client_id, $client_secret);
// Find the user
$user = User::find($request->get('user_id'));
// Create a new session
$session = new FacebookSession($user->access_token);
// If the session has been created
if ($session) {
$canvasPage = 'http://google.com/';
$message = 'This is a test message';
$referrer = 'ref-for-google-canvas';
$response = (new FacebookRequest(
$session, 'POST', '/' . $user->id . '/notifications', array(
'access_token' => $accessToken,
'href' => $canvasPage,
'template' => $message,
'ref' => $referrer
)
))->execute();
}
Пользовательские токены действительны только в течение 2 часов. Вы можете продлить их на 60 дней, но нет токена пользователя, который действителен вечно. Приложения не должны иметь возможность отправлять сообщения пользователю, если пользователь не использовал приложение в течение более длительного времени. При этом вы не используете токен пользователя для уведомлений приложений, ознакомьтесь с документами: https://developers.facebook.com/docs/games/notifications
Все, что вам нужно, это токен приложения, и он действителен вечно:
$app_token = $appId . '|' . $appSecret;
Об ошибке appsecret_proof: вы, вероятно, активировали ее в настройках приложения. Либо отключите его, либо добавьте appsecret_proof к каждому вызову API на сервере. Подробнее об этом читайте в документации на Facebook: https://developers.facebook.com/docs/graph-api/securing-requests
Кстати, отправка уведомлений приложения очень проста без PHP SDK, посмотрите эту статью: http://blog.limesoda.com/2014/08/app-notifications-facebook-apps/ — это на немецком языке, но единственная важная часть для вас — код в любом случае.
Других решений пока нет …