4

この質問は、私が投稿した以前の質問に続いています: FacebookクレジットのDjangoコールバック

つまり、基本的に、ボタン付きの静的HTMLページがあります。ボタンを押すと、Facebookクレジットの購入ダイアログが表示されます。

Facebookのブログ投稿に示されているように、これがHTMLソースを表示する私のページリンクです。

FacebookDevelopersに登録されているリンクであるURLのビューがあります。ビューは次のようになります。

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

translate、maketransはユニコード文字列ではうまく機能しないため、base64_url_decodeに不可解なコードがあることはわかっています。とにかく、ご不明な点がございましたら、下のコメント欄にご記入ください。

Myabeあなたはここでより多くの詳細を見つけることができます。

ありがとう..

于 2012-02-09T17:56:35.540 に答える