我想弄清楚用户是否喜欢我们的品牌页面。基于此,我们想要显示一个赞按钮或一些“谢谢”文本。
我正在使用托管在 heroku 上的 sinatra 应用程序。
我尝试了这个线程中的代码:Decoding Facebook's signed request in Ruby/Sinatra
但是,它似乎没有捕获 signed_request,我不明白为什么。
我有以下方法:
get "/tab" do
@encoded_request = params[:signed_request]
@json_request = decode_data(@encoded_request)
@signed_request = Crack::JSON.parse(@json_request)
erb :index
end
# used by Canvas apps - redirect the POST to be a regular GET
post "/tab" do
@encoded_request = params[:signed_request]
@json_request = decode_data(@encoded_request)
@signed_request = Crack::JSON.parse(@json_request)
redirect '/tab'
end
我也有来自该线程的帮助消息,因为它们对我来说似乎很有意义:
helpers do
def base64_url_decode(payload)
encoded_str = payload.gsub('-','+').gsub('_','/')
encoded_str += '=' while !(encoded_str.size % 4).zero?
Base64.decode64(encoded_str)
end
def decode_data(signed_request)
payload = signed_request.split('.')
data = base64_url_decode(payload)
end
end
但是,当我刚刚做的时候
@encoded_request = params[:signed_request]
然后在我的观点中读出:
<%= @encoded_request %>
我一无所获
这不应该至少返回一些东西吗?我的应用程序似乎崩溃了,因为没有任何内容需要解码。
我似乎无法在互联网上找到很多关于这方面的信息,所以如果有人能帮助我,我会很高兴。
是否有更好的方法来了解用户是否喜欢我们的页面?或者,这是要走的路吗?我只是忽略了一些显而易见的事情吗?
谢谢!
最佳答案
提示应该出现在您的应用程序崩溃中,因为没有任何内容可解码。
我怀疑重定向时参数丢失了。在 HTTP 级别考虑它:
- 客户端使用参数中的 signed_request 发布到
/tab
。 - 应用解析 signed_request 并将结果存储在实例变量中。
- 应用程序重定向到
/tab
,即发送带有代码 302(或类似代码)的响应和指向/tab
的Location
header .这完成了请求/响应周期,实例变量被丢弃。 - 客户端发出一个新请求:一个 GET 到
/tab
。由于重定向的工作方式,这将不再包含与原始 POST 一起发送的参数。 - 应用程序尝试解析 signed_request 参数,但由于未发送此类参数而崩溃。
最简单的解决方案是只渲染模板以响应 POST 而不是重定向。
如果您确实需要重定向,则需要小心地将 signed_request 作为重定向路径中的查询参数传递。至少这是我过去使用过的解决方案。可能有更简单的方法来解决这个问题,或者有库可以为您处理其中的一些问题。
关于ruby - 使用 Sinatra 获取 Facebook signed_request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200577/