django-paypal не получает сигнал ipn

Я пытаюсь использовать django-paypal. Я следил за тем, что было упомянуто в Jay on Джанго

Вот что я сделал...

##in my view.py file    
def ask_payment(request):
   # What you want the button to do.
   paypal_dict = {
    "business": settings.PAYPAL_RECEIVER_EMAIL,
    "amount": "0.10",
    "item_name": "book",
    "invoice": "yong138peng",
    "notify_url": "http://127.0.0.1:8000/accounts/my-ipn-location/",
    "return_url": "http://127.0.0.1:8000/accounts/my-return-location/",
    "cancel_return": "http://127.0.0.1:8000/accounts/my-cancel-location/",
   }  
   # Create the instance.
   form = PayPalPaymentsForm(initial=paypal_dict)
   context = {"PP_form": form}
   return render_to_response("paypal/payment.html",{'PP_form':form},context_instance=RequestContext(request))

@csrf_exempt
def payment_status(request,status):
   return render_to_response("paypal/payment_status.html",       
             {'status':status},context_instance=RequestContext(request))

##then in my urls.py file 
(r'^askforpayment/$','coltrane.views.ask_payment'),
(r'^my-ipn-location/', include('paypal.standard.ipn.urls')),
(r'^my-return-location/$','coltrane.views.payment_status',{'status':'success'}),
(r'^my-cancel-location/$','coltrane.views.payment_status',{'status':'cancel'}),

##in my models.py
def show_me_the_money(sender, **kwargs):
   ipn_obj = sender
   print "payment was successful!"
   # Undertake some action depending upon `ipn_obj`.
   if ipn_obj.custom == "Upgrade all users!":  ## what is this for, this is sent by paypal??
       Users.objects.update(paid=True)        
payment_was_successful.connect(show_me_the_money)

Мой вопрос:

  1. Согласно jay on django , я должен поставить @csrf_exempt перед функцией paypay.standard.ipn.views.ipn, чтобы django не жаловался на проблему @csrf_token. Я сделал это, но я все еще сталкиваюсь с той же проблемой. Затем я помещаю @csrf_exempt перед функцией просмотра возвращаемого URL, в этом случае payment_status (запрос, статус), проблема с csrf_token исчезла. Поэтому я не уверен, почему это так.

  2. для чего этот оператор в обработчике сигнала? "if ipn_obj.custom == "Обновить всех пользователей!": .... " Это исходит от paypay? Каковы возможные значения, кроме «Обновить всех пользователей?»

  3. Мне удается совершить покупку и завершить весь процесс оплаты в песочнице. Но теперь проблема в том, что PayPal не отправляет IPN обратно на мой notify_url, который является локальным. Я прочитал из проблема IPN в песочнице Paypal, что я не могу использовать локальный хост (http://127.0.0.1:8000) для проверки IPN. Тогда какие шаги необходимы для тестирования? Я не понимаю решение, представленное в этом сообщении. Может ли кто-нибудь научить меня тестировать IPN без развертывания реального производственного сервера?


person kentzo    schedule 29.04.2011    source источник


Ответы (3)


Я застрял на этой проблеме в течение очень долгого времени! Оказывается, у меня была ошибка в моем коде сигналов, но ошибка никогда не отображалась, просто появлялась, как будто сигнал не вызывался. В конце концов отследил это, изменив код в paypal-django следующим образом:

в paypal.standard.ipn.views.py — 3 строки снизу:

        try:
            ipn_obj.verify(item_check_callable)
        except:
            import sys, traceback
            traceback.print_exc(file=sys.stdout)

Затем проверьте журнал ошибок Apache на наличие ошибок.

person PhoebeB    schedule 05.07.2011

Что касается вашего третьего пункта, как говорит Даниэль в ответе на вопрос, который вы связали, вам нужно разрешить Paypal отправлять POST на ваш локальный компьютер. Это означает, что вам нужно открыть порт 80 на вашем маршрутизаторе и перенаправить запрос на ваш компьютер для разработки через порт 8000. Перейдите на http://whatismyip.com, получите IP-адрес и попробуйте получить к нему доступ в браузере. Если ваш маршрутизатор не настроен правильно, вы ничего не получите.

После того, как вы настроили маршрутизатор, вам нужно запустить сервер django с помощью:

python manage.py runserver 0.0.0.0:8000

Тогда вы сможете получить к нему доступ извне. Вы можете проверить это, введя IP-адрес вашего интернет-соединения в браузер — вы должны увидеть свой сайт Django. Если вы этого не сделаете, Paypal также не сможет вас «увидеть» и никогда не сможет отправить ответ.

person Tim Fletcher    schedule 06.05.2011
comment
Тим, спасибо. Мне удалось это сделать. Но я не использовал whatismyip.com, так как возвращенный IP-адрес неверен (вернее, не настоящий IP-адрес моего маршрутизатора, он возвращает 220.255.1.50). Я использую инструмент, предоставленный dyndns.com/support/tools/openport.html. Но я должен делать этот шаг и обновлять notify_url (на новый ip) каждый раз, когда я перезагружаю свой маршрутизатор. Немного неудобно. Найдите скрипт, чтобы получить правильный IP-адрес моего маршрутизатора, но большинство из них не работает. - person kentzo; 07.05.2011

Для #1. Единственное место, где мне нужно было поместить тег @csrf_exempt, было в представлении, вызываемом return_url. PayPal фактически отправляет много данных о платеже по этому URL-адресу по какой-либо причине.

Для №2: вы можете указать «настраиваемое» поле в paypal_dict, которое затем будет передано обратно в notify_url. Если вы продаете только с одного URL или конечной точки, будет очевидно, за что вы платите, в сочетании с указанным вами счетом. Но вы можете указать здесь дополнительное поле для работы. "Обновите всех пользователей!" это просто случайный пример, который есть в документации django-paypal.

Для #3 -- я использовал ngrok, как указано в документации django-paypal (http://django-paypal.readthedocs.org/en/stable/standard/ipn.html#testing). Я обнаружил, что его довольно легко настроить, ничего не зная об этом инструменте заранее.

Кроме того -- одна проблема с обратными сообщениями, которая на некоторое время пригвоздила меня, заключалась в следующем: я считал, что PayPal не отправляет сообщения на мой notify_url, и я искал ответы, подобные этому.

В конце концов я понял, что PayPal на самом деле отправлял сообщения на мой notify_url, но на моей локальной машине использовалась старая версия SSL, которая не завершала рукопожатие при отправке обратно в песочницу PayPal (чтобы получить результат VERIFIED/INVALID). Моя версия была 0.9.8, а им нужно что-то 1.0 или выше. Короче говоря, notify_url — это многоэтапный процесс, и проблема может заключаться не только в том, что PayPal делает первоначальную публикацию в notify_url.

person dlb8685    schedule 27.01.2016