2012-01-30 1 views
4

Этот вопрос после предыдущего, который я разместил: Django Callback on Facebook CreditsFacebook Credits Обратный вызов на Django

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

Как показано в Facebook blog post, вот моя страница link Просмотр источника 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", 
     '[email protected]_domain.com', 
     ['[email protected]'], 
     fail_silently=True 
    ) 

    signed_request = request['signed_request'] 
    plain_request = parse_signed_request(signed_request, FACEBOOK_APP_ID) 

Теперь, естественно, это только предварительный тест (есть много отладки сделать позже), но я даже не получить электронную почту, когда я нажимаю кнопку на моей странице. Это означает, что по какой-то причине Facebook не выполняет обратный вызов для моего приложения. Если я выполню GET для этого представления, я получаю электронное письмо, как и ожидалось.

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

«Там была проблема при обработке платежа Извините, но мы возникли проблемы при обработке платежа Вы не платите за эту сделку, пожалуйста, попробуйте еще раз."

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

Спасибо

+0

Вы должны вернуть JSON в функции обратного вызова. В приведенном выше примере вы ничего не возвращаете. И кроме того, URL-адрес обратного вызова, который вы отправили, выдает ошибку. –

+0

Итак, это не связано с Django. Вы правильно добавили [callback url] (http://developers.facebook.com/attachment/credits_reg_assoc_comp.png)? –

ответ

4

The signed_request parameter is a simple way to make sure that the data you're receiving is the actual data sent by Facebook. It is signed using your application secret which is only known by you and Facebook. If someone were to make a change to the data, the signature would no longer validate as they wouldn't know your application secret to also update the signature.

Как мне известно питон-SDK Facebook не поддерживает синтаксический анализ параметра запроса.

Вот фрагмент кода для разбора «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, потому что переводить, maketrans не работает, что хорошо с юникод строками. В любом случае, если у вас есть какие-либо вопросы, просто оставьте строку в комментариях ниже.

Myabe вы можете найти здесь больше details.

Спасибо ..

+0

Датский, спасибо за ответ, но все дело в том, чтобы использовать Python, а не PHP ... поэтому преобразование. –

+1

@ VascoPatricio проверить ответ, который он изменил согласно вашим потребностям;) –

+0

большое спасибо. Извините за задержку с ответом. Я собираюсь проверить это в ближайшие 24 часа и скоро вернусь к вам. –

 Смежные вопросы

  • Нет связанных вопросов^_^