Want to have a site with PayPal integration using Django with no fuss? That is just django-paypal’s game. I’ll show you how to integrate with Website Payments Standard in a jiffy.
pip install django-paypal
You are using pip, right? If not:
apt-get install python-setuptools
easy_install pip
Whew! Thats better. Let’s fix up your settings.py:
PAYPAL_RECEIVER_EMAIL = "yourbusinessaccount@example.com"
INSTALLED_APPS = ( ...,
'paypal.standard.ipn',
...)
Now, you’ll have to add an entry in your urls.py for the Instant Payment Notifications (IPNs) from PayPal that let you know when people have paid:
urlpatterns = patterns('',
...
url(r'^/something/hard/to/guess/, include('paypal.standard.ipn.urls')),
...
)
We need a view in views.py. That is easy too:
from django.conf import settings
...
def subscribe(request):
# What you want the button to do.
paypal_dict = {
"cmd": "_xclick-subscriptions",
"business": settings.PAYPAL_RECEIVER_EMAIL,
"a1": "0", # trial price
"p1": 1, # trial duration, duration of unit defaults to month
"a3": "29.95", # yearly price
"p3": 1, # duration of each unit (depends on unit)
"t3": "Y", # duration unit ("M for Month")
"src": "1", # make payments recur
"sra": "1", # reattempt payment on payment error
"no_note": "1", # remove extra notes (optional)
"item_name": "PayPal Shows This To The User",
"invoice": "101",
"notify_url": "http://example.com/something/hard/to/guess/",
"return_url": "http://example.com/thanks/",
"cancel_return": "http://example.com/cancel/",
"custom": request.user.username, # put whatever data you need to track things here
}
# Create the instance.
form = PayPalPaymentsForm(initial=paypal_dict, button_type="subscribe")
context = {"form": form, "encoded_email" : urlquote(settings.PAYPAL_RECEIVER_EMAIL), "paid" : request.user.get_profile().paid}
The reason I’ve included the encoded_email in the view is related to the unsubscribe button we’ll setup in a minute. The button in that view will be a subscription. You can easily modify it to be a buy now button. See the README for django-paypal. If you browse the code on github and checkout paypal.standard.forms.py you can see all the possible options for buttons.
Now we can create the template and the (optional) unsubscribe button:
{% extends "base.html" %}
{% block content %}
{% if paid %}
<h2>Thank you! You are currently subscribed.</h2>
<p id="page-intro">You can cancel anytime online using your PayPal account or from this page.
If you have any questions or problems please <a href="mailto:you@example.com">email us</a>.
</p>
<A HREF="https://www.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias={{ encoded_email }}" _fcksavedurl="https://www.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias={{ encoded_email }}"><IMG BORDER="0" SRC="https://www.paypal.com/en_US/i/btn/btn_unsubscribe_LG.gif"></A>
{% else %}
<!-- Page Head -->
<h2>Please subscribe to Example using PayPal.</h2>
<p id="page-intro">You can cancel anytime online using your PayPal account or on this page.
If you have any questions or problems please <a href="mailto:you@example.com">email us</a>.
</p>
{{ form.render }}
{% endif %}
{% endblock %}
Keying off of if the user has paid or not means we can use this template for subscribing or unsubscribing. Now go get paid!