如何在django-paypal中为paypal WPP处理returnurl [英] how to deal with returnurl in django-paypal for paypal WPP

查看:106
本文介绍了如何在django-paypal中为paypal WPP处理returnurl的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在正在使用django开发我的网站.在将我的网站与Paypal集成时,我使用了可插拔的应用程序" http://github.com/johnboxall/django-贝宝".尽管该文档对于使用PayPal Payments Pro(WPP)"非常清楚,但是我仍然有一些疑问,尤其是"returnurl"和"confirm_template"之间的关系.

I am now developing my site using django. In integrating my site with paypal, I use pluggable application "http://github.com/johnboxall/django-paypal". Although the document is very clear for "Using PayPal Payments Pro (WPP)", but I still have some questions, especially the relationship between "returnurl" and "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)

在贝宝网站上单击继续"按钮时,它会将我重定向回"returnurl".这是我的问题,我不知道该如何处理该returnurl.我认为,我还应该编写一个函数使其呈现confirmation.html.我对吗?如果是这样,如何编写此函数. 非常感谢您的帮助和说明.

When clicking the "continue" button on paypal site, it redirects me back to "returnurl". Here, is my problem, I don't know how to deal with this returnurl. In my opinion, I should also write a function to make it render confirmation.html. Am I right? If so, how to write this function. Really grateful for any help and instructions.

推荐答案

该文档不适用于 django -paypal .简短的答案是returnurl应该是指向方法buy_my_item的URL.以下是一些我从事IRL工作的示例.请注意,我使用PayPal的"useraction = commit"选项来减少其Express Checkout中的步骤数.

The documentation isn't great for django-paypal. The short answer is that your returnurl should be whatever URL points to your method buy_my_item. Here's a few examples taken from something I have working IRL. Note that I use PayPal's "useraction=commit" option to reduce the number of steps in their Express Checkout.

在您的urls.py中:

In your 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中:

In your 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 不错,但是使它正常工作可能令人沮丧,尤其是当您想要将其他值传递给模板,并且文档(即使是在我所看到的分支上)也不太好.

You may have a bunch of other questions, like "how can I tell the difference between an EC and a WPP payment when I get to the payment confirmation page?", but I'll save that until it's asked! django-paypal isn't bad, but it can be pretty frustrating making it work, particularly when you want to pass additional values to your templates, and the documentation (even on the forks I've seen) isn't much good.

请注意,此示例引用的是HTTP而不是HTTPS URL.在生产中,使用WPP,您几乎肯定会希望使用HTTPS.另外,该产品的主要发行版本已经过时,您需要使用@csrf_exempt修补IPN终结点才能使其正常工作.

Note that this example refers to HTTP rather than HTTPS URLs. In production, using WPP, you'll almost certainly want to be using HTTPS. Also, the main distribution of the product is out of date, and you'll need to patch the IPN endpoint with @csrf_exempt to make it work.

这篇关于如何在django-paypal中为paypal WPP处理returnurl的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆