4

这个问题是在我之前发布的一个问题之后: Facebook Credits 上的 Django Callback

所以基本上,我有一个带有按钮的静态 HTML 页面。按下按钮后,应显示 Facebook Credits 的购买对话框。

Facebook 博客文章所示,这里是我的页面链接查看 HTML 源代码。

我有一个URL视图,它是在 Facebook Developers 中注册的链接。视图如下:

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,我会按预期收到一封电子邮件。

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

“处理您的付款时出现问题抱歉,我们在处理您的付款时遇到了问题。您尚未为此交易付费。请重试。”

如果有人可以帮助我追踪为什么回调不起作用,我将不胜感激。

谢谢

4

1 回答 1

3

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 你可以在这里找到更多细节

谢谢..

于 2012-02-09T17:56:35.540 回答