Это заняло у меня некоторое время, но мне удалось добраться до последней точки в обновлениях в реальном времени, задача.
Я знаю, что при подписке Facebook должен пинговать мой сервер, проблема в том, что этого никогда не происходит, я всегда получаю один и тот же ответ:
{"error": {"type": "OAuthException", "message": "(# 2201) ответ не соответствует запросу, ожидаемое значение = '1506372182', полученный = '' '}}
Похоже, что он может подключиться к моему серверу (любой другой URL-адрес обратного вызова терпит неудачу с адресом, не доступным), однако я не вижу, чтобы он вызывал меня в журналах.
Я использую движок приложения:
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
...
else if (parameters.containsKey("hub.mode")) {
log.info("doing hub.mode");
// Check that challenge is valid.
if (parameters.get("hub_verify_token").equals(Constants.FACEBOOK_VERIFY_TOKEN)) {
log.info("hub.mode test is valid");
resp.setContentType("text/plain");
resp.getWriter().print(req.getParameter("hub.challenge"));
}
}
...
// I want real time information on a specific user, on its feeds.
String data = URLEncoder.encode("object", "UTF-8") + "="
+ URLEncoder.encode("user", "UTF-8");
data += "&" + URLEncoder.encode("fields", "UTF-8") + "="
+ URLEncoder.encode("feed", "UTF-8");
// Send real time updates to this URL.
data += "&" + URLEncoder.encode("callback_url", "UTF-8") + "="
+ URLEncoder.encode(reconstructedURL.toString(), "UTF-8");
// A token used to verify that it is actually me who is running the verification process.
data += "&" + URLEncoder.encode("verify_token", "UTF-8") + "="
+ URLEncoder.encode(Constants.FACEBOOK_VERIFY_TOKEN, "UTF-8");
data += "&"
+ URLEncoder.encode("access_token", "UTF-8")
+ "="
+Constants.FACEBOOK_APP_CODE + "|"
+ Constants.FACEBOOK_APP_SECRET;
// Subscribe by doing a post.
URL url = new URL(String.format(
"https://graph.facebook.com/%s/subscriptions?access_token=%s",
Constants.FACEBOOK_APP_CODE, accessToken));
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
log.info(String.format("Sent the following data '%s'", data));
wr.write(data);
wr.flush();
Я работаю с аутентификацией пользователя и подпиской в реальном времени в одном и том же сервлете.
При чтении ответа я получаю вышеуказанную ошибку и не вижу никаких вызовов моему сервлету (в журналах ядра приложения).
Я уверен, что что-то упустил.
Любая помощь будет оценена.