как бороться с returnurl в Django-PayPal для PayPal WPP - PullRequest
2 голосов
/ 27 июня 2010

Я сейчас занимаюсь разработкой своего сайта с использованием django. При интеграции моего сайта с PayPal я использую подключаемое приложение "http://github.com/johnboxall/django-paypal".. Хотя документ очень понятен для" Использование PayPal Payments Pro (WPP) ", но у меня все еще есть некоторые вопросы, особенно отношения между" returnurl "и "confirm_template".

#views.py
from paypal.pro.views import PayPalPro

def buy_my_item(request):
   item = {"amt": "10.00",             # amount to charge for item
           "inv": "inventory",         # unique tracking variable paypal
           "custom": "tracking",       # custom tracking variable for you
           "cancelurl": "http://...",  # Express checkout cancel url
           "returnurl": "http://..."}  # Express checkout return url

   kw = {"item": item,                            # what you're selling
         "payment_template": "payment.html",      # template name for payment
         "confirm_template": "confirmation.html", # template name for confirmation
         "success_url": "/success/"}              # redirect location after success

   ppp = PayPalPro(**kw)
   return ppp(request)

При нажатии кнопки «продолжить» на сайте PayPal, он перенаправляет меня обратно на «returnurl». Вот моя проблема, я не знаю, как справиться с этим возвращением. По моему мнению, я должен также написать функцию, которая заставляет это делать подтверждение.html. Я прав? Если так, то как написать эту функцию. Очень благодарен за любую помощь и инструкции.

Ответы [ 2 ]

1 голос
/ 16 января 2011

Документация не подходит для django-paypal . Короткий ответ: ваш returnurl должен быть любым URL, указывающим на ваш метод buy_my_item. Вот несколько примеров, взятых из того, что у меня работает в реале. Обратите внимание, что я использую опцию PayPal «useraction = commit», чтобы уменьшить количество шагов в их экспресс-проверке.

В вашем urls.py:

url(r'^pay-now/', views.pay_now, name='pay_now'),
url(r'^purchase-thanks/$', views.purchase_thanks, name='pay_success'),
url(r'^purchase-cancelled/$', views.purchase_thanks, name='pay_cancel'),

В ваших views.py:

""" User payment method endpoint for rendering and processing forms. """
@csrf_exempt
def pay_now( request ):
    # Override django-paypal library endpoints to include 'useraction=commit'
    # which changed PayPal's review page to be a 'pay now' page.
    # This is ugly but I didn't want to subclass.
    from paypal.pro import views as pro_views
    pro_views.EXPRESS_ENDPOINT = "https://www.paypal.com/webscr?cmd=_express-checkout&useraction=commit&%s"
    pro_views.SANDBOX_EXPRESS_ENDPOINT = "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&useraction=commit&%s"

    # ...because we use 'useraction=commit', there's no need to show the confirm page.
    # So let's change the request to show the confirmation form into a request to
    # approve it. It just so happens that the arguments are the same -- the difference
    # is between the GET and the POST.
    # <input type="hidden" name="token" value="EC-485941126E653491T" id="id_token"/>
    # <input type="hidden" name="PayerID" value="78W69D3FEVWJBC" id="id_PayerID"/>
    if request.method == 'GET' and 'token' in request.GET and 'PayerID' in request.GET:
        request.method = 'POST'
        request.POST = request.GET # Crudely convert GET to POST

    item = {
        'amt':           99.99, # Amount to charge for item
        'currencycode':  'usd',
        #'inv':           1, # Unique tracking variable paypal - must be a number.
        #'desc':          'Your product name', # Deprecated by PayPal, don't bother
                                               # (you'll get the name twice in your statement otherwise)
        'custom':        'custom1', # Custom tracking variable for you. Realistically you have to pass
                                    # this if you're specifying basket contents to PayPal as django-paypal
                                    # won't be given `item_name` in the IPN, only `item_name1` etc.
                                    # which it cannot interpret.
        'cancelurl':     'http://%s%s' % DYNAMIC_URL, reverse('pay_cancel')), # Express checkout cancel url
        'returnurl':     'http://%s%s' % (DYNAMIC_URL, reverse('pay_now')), # Express checkout return url
        'allownote':     0, # Disable "special instructions for seller"
        'l_name0':       'Your product name',
        #'l_number0':    1234,
        #'l_desc0':      'longer description',
        'l_amt0':        99.99,
        'l_qty0':        1,
        'itemamt':       99.99,
        #'taxamt':       0.00,
        #'shippingamt':  0.00,
        #'handlingamt':  0.00,
        #'shipdiscamt':  0.00,
        #'insuranceamt': 0.00,
    }

    kw = {
        'item': item,
        'payment_template': 'cms/register.html', # Template name for payment
        'confirm_template': 'cms/paypal-confirmation.html', # Template name for confirmation
        'success_url':      reverse('pay_success'), # Ultimate return URL
    }

    ppp = PayPalPro(**kw)
    return ppp(request)

У вас может быть куча других вопросов, например, «как я могу узнать разницу между платежами EC и WPP, когда попаду на страницу подтверждения оплаты?», Но я буду сохранять это, пока не будет задан вопрос! django-paypal неплохо, но это может быть довольно неприятно, когда он работает, особенно если вы хотите передать дополнительные значения вашим шаблонам, и документация (даже на вилках, которые я видел) отсутствует не очень хорошо.

Обратите внимание, что этот пример относится к HTTP, а не к URL-адресам HTTPS. В производстве, используя WPP, вы почти наверняка захотите использовать HTTPS. Кроме того, основной дистрибутив продукта устарел, и вам необходимо установить конечную точку IPN с помощью @csrf_exempt, чтобы он работал.

0 голосов
/ 15 сентября 2010

Привет, ребята, у меня та же проблема, в соответствии с этим http://uswaretech.com/blog/2008/11/using-paypal-with-django/ нам нужно написать представление, которое обрабатывает ответ от PayPal, поэтому я использую шаблон verify.html, но он ничего не отображает ...

...