Обработка 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
это идеальный выбор для отправки запроса.