我正在创建一个facebook选项卡应用程序,其中包含我们的主要ASP MVC应用程序的小部件。 我们真实应用中的每个用户都有一个这样的公共配置文件:domain.com/widget/{profile_url},可以在选项卡中显示。这意味着用户安装的每个页面选项卡都需要一个唯一的页面选项卡URL,这是facebook页面选项卡似乎不支持的内容。
我一直在搜索,但无法找到明确的答案,如何获取我在facebook标签应用中控制的动态网址数据?
所以我的想法是,当用户添加选项卡应用程序时,将传递包含我们的应用程序配置文件URL的参数,以及稍后显示每次都会传递参数的选项卡时。我们的应用程序将读取参数并显示正确的配置文件
答案 0 :(得分:2)
不幸的是,FB没有“安装时间”标签设置 - 用户无法配置他们插入页面的标签。
当FB发布到标签页时,它会发送signed request个“页面”变量,这是嵌入标签页的页面。如果您可以让用户在启用服务时提供其网页ID,则可以使用此功能查找正确的个人资料。
答案 1 :(得分:0)
<%@ page import ="java.io.*,java.util.*" %> <%@ page import = "java.util.Arrays,javax.crypto.Mac,javax.crypto.SecretKey,javax.crypto.spec.SecretKeySpec" %> <%@ page import = "org.json.simple.parser.*,org.apache.commons.codec.binary.Base64" %> <%@ page import = "java.io.UnsupportedEncodingException,javax.xml.bind.DatatypeConverter" %> <%
if (request.getParameter("signed_request") != null) {
String input = request.getParameter("signed_request");
//input ="q3v8X8hbmkKXaF_DZaLBPapMPVjMgpq8bZe-SmYc6Fs.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTUxMjYyOTY5MiwicGFnZSI6eyJpZCI6IjEzOTg4MTM1MDM3NTUyMzEiLCJhZG1pbiI6dHJ1ZSwibGlrZWQiOnRydWV9LCJ1c2VyIjp7ImNvdW50cnkiOiJpbiIsImxvY2FsZSI6ImVuX0dCIiwiYWdlIjp7Im1pbiI6MjF9fX0";
String secretKey = "d8e6e697b9c958a8ee8f2e";
int max_age = 3600;
try
{
String[] split = input.split("[.]", 2);
String encoded_sig = split[0];
String encoded_envelope = split[1];
JSONParser parser = new JSONParser();
// check
//out.println("<br>"+ new String(new Base64(true).decode(encoded_envelope)));
Map envelope = (Map) parser.parse(new String(new Base64(true).decode(encoded_envelope)));
String algorithm = (String) envelope.get("algorithm");
if (!algorithm.equals("HMAC-SHA256")) {
throw new Exception("Invalid request. (Unsupported algorithm.)");
}
if (((Long) envelope.get("issued_at")) < System.currentTimeMillis() / 1000 - max_age) {
throw new Exception("Invalid request. (Too old.)");
}
byte[] key = secretKey.getBytes();
SecretKey hmacKey = new SecretKeySpec(key, "HMACSHA256");
Mac mac = Mac.getInstance("HMACSHA256");
mac.init(hmacKey);
byte[] digest = mac.doFinal(encoded_envelope.getBytes());
if (!Arrays.equals( new Base64(true).decode(encoded_sig), digest)) {
throw new Exception("Invalid request. (Invalid signature.)");
}
String pageId = ((Map)envelope.get("page")).get("id").toString();
if(pageId.equals("1398813503755231")){
response.sendRedirect("https://yourdomain.com/1111");
}
else if(pageId.equals("151433128812548")){
response.sendRedirect("https://yourdomain1.com/2222");
} }
catch(Exception e)
{
out.println("error"+e);
} } %> <html> <head> Facebook Store <script> var appId = 'your app id'; var pageId=''; window.fbAsyncInit = function() {
FB.init({
appId : appId,
autoLogAppEvents : true,
xfbml : true,
version : 'v2.11'
}); }; (function(d, s, id){
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk')); function createPageTab(){
FB.ui(
{
method: 'pagetab',
redirect_uri:'https://9d5b71a7.ngrok.io/facebook-store.jsp'
},
function(response) {
console.log(JSON.stringify(response));
if (response != null && response.tabs_added != null) {
for( pageid in response.tabs_added){
pageId = pageid;
}
}
}
); }
function viewPageTab(){
var url = 'https://facebook.com/pages/-/'+pageId+'?sk=app_'+appId;
window.open(url,'_blank'); }
</script> </head> <body>
<button onClick="createPageTab()" >Connect your store with facebook </button>
<button onClick="viewPageTab();" > View your Store </button> </body> </html>