此问题跟随我发布的前一个问题: Django Callback on Facebook Credits
基本上,我有一个带按钮的静态HTML页面。按下按钮后,应显示Facebook Credits的购买对话框。
如Facebook blog post所示,这是我的页面link查看HTML源代码。
我有URL的视图,这是在Facebook开发者中注册的链接。观点如下:
def fb_credits_callback(request):
#Data array that will be returned
data = {
}
string = ''
if request.method == 'GET':
string = 'GET'
elif request.method == 'POST':
string = 'POST'
send_mail(
'TestDare Debug',
'Received '+string+" request",
'registration@my_domain.com',
['my_personal_email@gmail.com'],
fail_silently=True
)
signed_request = request['signed_request']
plain_request = parse_signed_request(signed_request, FACEBOOK_APP_ID)
现在很自然这只是一个初步的测试(稍后会做很多调试),但是当我点击页面上的按钮时,我甚至都没有收到电子邮件。这意味着由于某种原因,Facebook没有执行我的应用程序的回调。如果我对该视图执行GET,我会收到预期的电子邮件。
单击按钮后,我收到以下错误:
“处理您的付款时出现问题 抱歉,我们无法处理您的付款。您未收到此笔交易的费用。请再试一次。“
如果有人可以帮助我追踪回调无效的原因,我会非常感激。
谢谢
答案 0 :(得分:4)
signed_request参数是一种确保使用的简单方法 您收到的数据是Facebook发送的实际数据。它是 使用您的应用程序密钥签名,只有您自己知道 Facebook的。如果有人要对数据进行更改,则签名 将不再验证,因为他们不知道您的申请秘密 还要更新签名。
据我所知Facebook的python-sdk不支持解析请求参数。
以下是解析“signed_request”的代码段。
import base64
import hashlib
import hmac
import simplejson as json
def base64_url_decode(inp):
padding_factor = (4 - len(inp) % 4) % 4
inp += "="*padding_factor
return base64.b64decode(unicode(inp).translate(dict(zip(map(ord, u'-_'), u'+/'))))
def parse_signed_request(signed_request, secret):
l = signed_request.split('.', 2)
encoded_sig = l[0]
payload = l[1]
sig = base64_url_decode(encoded_sig)
data = json.loads(base64_url_decode(payload))
if data.get('algorithm').upper() != 'HMAC-SHA256':
log.error('Unknown algorithm')
return None
else:
expected_sig = hmac.new(secret, msg=payload, digestmod=hashlib.sha256).digest()
if sig != expected_sig:
return None
else:
log.debug('valid signed request received..')
return data
我知道base64_url_decode中有一些含糊的代码,因为translate,maketrans对unicode字符串的效果不佳。无论如何,如果您有任何疑问,只需在下面的提交中删除一行。
Myabe你可以在这里找到更多details。
的谢谢.. 强> 的