Обработка Paypal IPN в представлении Django

Согласно документации PayPal IPN, вы должны ответить на IPN, сначала отправив пустой ответ HTTP 200 на https://www.sandbox.paypal.com/cgi-bin/webscr а затем отправить запрос HTTP POST. Единственный способ узнать ответ HTTP 200 - это вернуть HttpResponse('') в представлении, которое работает, так как симулятор IPN говорит, что "IPN был отправлен, и рукопожатие было проверено". Но тогда как я отправлю запрос HTTP POST, когда представление уже вернулось? Мой план состоял в том, чтобы использовать urllib2 для генерации запроса POST.

Я также хотел бы отправить ответ HTTP 200 без использования HttpResponse('') так как я не знаю, откуда исходит исходный запрос, и я хочу быть уверен, что отправляю ответ на https://www.sandbox.paypal.com/cgi-bin/webscr, Я посмотрел на urllib2, запросы и PyCurl, и я не смог найти способ создать пустой ответ на конкретный URL.

2 ответа

Решение

Вы хотите использовать requests или же urllib2 сделать запрос POST для проверки IPN, прежде чем вернуть HttpResponse(''); Документы подразумевают, что вы должны делать это в обратном порядке, но на самом деле это не обязательно, и в большинстве веб-сред этот способ намного проще. Так что ваш взгляд должен выглядеть неопределенно

def ipn(request):
    verification = requests.POST(PAYPAL_URL, data=request.body)
    if verification.text == 'VERIFIED':
        # process IPN
        return HttpResponse('')
    else:
        return HttpResponseForbidden()

Обратите внимание, что если где-то возникнут ошибки, вы вернете 500 в PayPal, и они будут повторять попытку. Если вы сделаете это слишком много, они будут раздражены вами и в конечном итоге деактивируют вашу учетную запись, поэтому убедитесь, что вас как-то предупредили об ошибке. (Вы также можете обернуть вещи в try/except заблокировать, но тогда вы рискуете вернуть 200, фактически не выполняя обработку, если есть ошибка, которая может быть хуже.)

Просто ответьте на запрос, сделанный PayPal. для других запросов нет ответа (403 http статус)

from django.http import HttpResponseForbidden

def answer_to_pp_ipn():
    # ...
    if 'paypal' in request.META['HTTP_HOST']:
        return HttpResponse('OK 200')

    return HttpResponseForbidden()

и, как вы упомянули, requests это идеальный выбор для отправки запроса.

Другие вопросы по тегам