Facebook Кредиты Обратный звонок на Джанго - PullRequest
4 голосов
/ 30 января 2012

Этот вопрос следует за предыдущим, который я разместил: Django Callback в Facebook Кредиты

Итак, в принципе, у меня есть статическая HTML-страница с кнопкой.После нажатия кнопки должен появиться диалог покупки для кредитов Facebook.

Как показано в сообщении в блоге 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 для этого представления, я получаю электронное письмо, как и ожидалось.

При нажатии на кнопку я получаю следующую ошибку:

"При обработке вашего платежа возникла проблема. Извините, но мы"Возникли проблемы при обработке вашего платежа. С вашей транзакции не было списано средств. Пожалуйста, попробуйте еще раз. "

Если кто-то может помочь мне отследить, почему не работает обратный вызов, я был бы очень признателен.

Спасибо

1 Ответ

4 голосов
/ 09 февраля 2012

Параметр signature_request - это простой способ убедиться, что данные, которые вы получаете, являются фактическими данными, отправленными Facebook.Он подписан с использованием секрета вашего приложения, который известен только вам и Facebook.Если кто-то внесет изменения в данные, подпись больше не будет проверяться, поскольку они не будут знать секрет вашего приложения, чтобы также обновлять подпись.

Как я знаю, Python в Facebook -SDK не поддерживает параметр запроса синтаксического анализа .

Вот фрагмент кода для синтаксического анализа "signature_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 вы можете найти здесь больше подробнее .

спасибо ..

...