Django-PayPal не получает сигнал IPN - PullRequest
3 голосов
/ 29 апреля 2011

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

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

##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. В соответствии с сойкой на 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, который является localhost. Я прочитал из проблемы IPN Paypal Sandbox , что я не могу использовать localhost (http://127.0.0.1:8000) для проверки IPN. Какие шаги необходимо выполнить для проверки? Я не понимаю решения, предоставленного в этом post . Кто-нибудь может научить меня тестировать IPN без развертывания реального рабочего сервера?

Ответы [ 3 ]

4 голосов
/ 07 мая 2011

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

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

python manage.py runserver 0.0.0.0:8000

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

2 голосов
/ 05 июля 2011

Я застрял на этой проблеме очень долго! Оказывается, у меня была ошибка в моем коде сигналов, но ошибка никогда не отображалась, а выглядела так, как будто сигнал не вызывался В конце концов отследил его, изменив код в 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 на наличие ошибок.

0 голосов
/ 27 января 2016

Для # 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 # тестирование ). Я нашел его довольно простым в настройке, ничего не зная об инструменте до этого.

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

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

...