Django PayPal IPN Processing

The code below is for Python 3 and Django 1.7. Set the IPN encoding to UTF-8 in PayPal.

import urllib.parse
import requests

def post(self, request):

	paypal_url = ''

	query = 'cmd=_notify-validate'
	for key, value in request.POST.items():
		query += '&%s=%s' % (key, urllib.parse.quote(value))

	res =, data=query, timeout=10)

	if res.text == 'VERIFIED':

		# Extract POST variables here
		payment_status = request.POST.get('payment_status')

		if payment_status == 'Completed':

			# Successful payment

		elif payment_status == 'Reversed' or payment_status == 'Refunded':

			# Payment reversed