Facebook Credits 在 Django 上的回调函数

4
这个问题是我之前发布的一个问题的后续: Django Callback on Facebook Credits 所以基本上,我有一个静态HTML页面上有一个按钮。按下按钮后,应该会出现Facebook Credits的购买对话框。
正如Facebook博客文章所示,这是我的页面链接查看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到那个视图,我会按预期收到一封电子邮件。
在单击按钮时,我收到以下错误消息:
“处理您的付款时出现问题 抱歉,我们无法处理您的付款。您未被收取此交易的费用。请再试一次。”
如果有人能帮助我跟踪为什么回调不起作用,我将非常感激。
谢谢

你需要在回调函数中返回json。在上面的例子中,你没有返回任何东西。而且,你发布的回调URL还出现了错误。 - dan-klasson
那么这与Django无关。您是否正确添加了callback url - dan-klasson
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字符串时效果不佳。无论如何,如果您有任何问题,请在下面的评论中留言。

也许您可以在这里找到更多详细信息。

谢谢。


丹麦,谢谢你的回答,但整个重点是使用Python而不是PHP...因此需要进行转换。 - user1034697
1
@VascoPatricio,请检查答案,它已根据您的需求进行了更改 ;) - Danish Iqbal
非常感谢。很抱歉回复晚了。我将在接下来的24小时内进行测试,并尽快给您回复。 - user1034697

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接