Как бороться с returnurl в Django-PayPal для PayPal WPP
Сейчас я занимаюсь разработкой своего сайта с использованием django. При интеграции моего сайта с PayPal я использую подключаемое приложение " http://github.com/johnboxall/django-paypal". Хотя этот документ очень понятен для "Использование PayPal Payments Pro (WPP)", но у меня все еще есть некоторые вопросы, особенно связь между "returnurl" и "verify_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 ответа
Документация не подходит для 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
чтобы это работало.
Привет, ребята, у меня та же проблема, согласно этому http://uswaretech.com/blog/2008/11/using-paypal-with-django/ нам нужно написать представление, которое обрабатывает ответ от PayPal, поэтому я использую шаблон verify.html, но он ничего не отображает...