Fork me on GitHub

Programming Design Notes

使用 Java 開發 Facebook Web App - 1

| Comments

第一步當然要先在 Facebook 建立一個應用程式。
網址: http://www.facebook.com/developers/createapp.php


輸入應用程式名稱和同意 Facebook 條款,按下 Create Application 到下一步。


建立完成後得到 API Key 和 Application Secret,請不要公開這 Application Secret 這項資料,別人得到了 API Key 和 Application Secret 便可以任意更改你的應用程式。

在左邊的選單選取 Canvas。


Canvas Page URL 是你的應用程式在 Facebook 的位置,每一個應用程式的 URL 都不會相同的,請輸入令人比較容易記的地址。

Canvas Callback URL 是伺服器的位置,因為現在是試測性質,所以輸入本機的位置。如果你有自己的伺服器,可以輸入伺服器的位置,但初期測試不建議使用,因為在本機開發會比較快,待差不多完成再放上伺服器也可以。

Post-Authorize Redirect URL 是用戶同意你的應用程式能夠存取他的資料後,Facebook 會將他跳到那一個位置。

在左邊的選單選取 Migrations,並將 New Data Permissions 設為 Disable。


因為現在的 facebook-java-api 還是使用舊的 Facebook Rest Server,這個設定是給新的 Graph Api 用的。

按下 Save Change 儲存所有設定。

現在到 facebook-java-api 下載 Java 的 Facebook API Library,如果你是使用 Google App Engine 開發 Facebook 應用程式,使用官方的 Library 會有一點問題,可到這裡下載別人修改好的 http://bertrand.guiral.free.fr/facebook_generated_bg.zip

下載別人修改好的還要到 http://code.google.com/p/facebook-java-api/downloads/list 下載依賴包。

現在可以開始寫程式了,首先加入一個 Filter 確保所有進入這個頁面的用戶已經登入 Facebook。
package com.blogspot.lawpronotes.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.w3c.dom.Document;

import com.google.code.facebookapi.FacebookException;
import com.google.code.facebookapi.FacebookWebappHelper;
import com.google.code.facebookapi.FacebookXmlRestClient;
import com.google.code.facebookapi.IFacebookRestClient;

public class FacebookFilter implements Filter {

private String api_key;
private String secret;

public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
api_key = "your api key";
secret = "your secret";
}

public void destroy() {
// TODO Auto-generated method stub
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

HttpSession session = request.getSession(true);
IFacebookRestClient<Document> userClient = getUserClient(session);
if (userClient == null) {
userClient = new FacebookXmlRestClient(api_key, secret);
session.setAttribute("facebook.user.client", userClient);
}

FacebookWebappHelper<Document> facebook = new FacebookWebappHelper<Document>(
request, response, api_key, secret, userClient);
String nextPage = request.getRequestURI();
nextPage = nextPage.substring(nextPage.indexOf("/", 1) + 1);
boolean redirectOccurred = facebook.requireLogin(nextPage);

if (redirectOccurred) {
return;
}
redirectOccurred = facebook.requireFrame(nextPage);
if (redirectOccurred) {
return;
}

long facebookUserID;
try {
facebookUserID = userClient.users_getLoggedInUser();
} catch (FacebookException ex) {
//Cannot get user's facebook ID
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Error while fetching user's facebook ID");
return;
}
chain.doFilter(request, response);
}

public static FacebookXmlRestClient getUserClient(HttpSession session) {
return (FacebookXmlRestClient) session
.getAttribute("facebook.user.client");
}

}

請自行更改 api_key 和 secret,然後在 web.xml 加上以下內容。
<filter>
<display-name>FacebookFilter</display-name>
<filter-name>FacebookFilter</filter-name>
<filter-class>com.blogspot.lawpronotes.filter.FacebookFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FacebookFilter</filter-name>
<url-pattern>*</url-pattern>
</filter-mapping>

登出 Facebook 然後打開 http://apps.facebook.com/lawpronotes/ 頁面看看是否自動跳到 Facebook 登入頁面。

下一回: 使用 Java 開發 Facebook Web App - 2

相關書籍: Facebook For DummiesThe Facebook Era: Tapping Online Social Networks to Build Better Products, Reach New Audiences, and Sell More StuffFacebook: The Missing Manual