Facebook Credits回调Django

时间:2012-01-30 10:36:39

标签: django facebook facebook-credits

此问题跟随我发布的前一个问题: 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,我会收到预期的电子邮件。

单击按钮后,我收到以下错误:

“处理您的付款时出现问题 抱歉,我们无法处理您的付款。您未收到此笔交易的费用。请再试一次。“

如果有人可以帮助我追踪回调无效的原因,我会非常感激。

谢谢

1 个答案:

答案 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

谢谢..