def make_payment(content_object, request, transaction_opts={}): """""" trans = Transaction(content_object=content_object) trans.status = Transaction.PROCESSING trans.save() total = content_object.get_amount() shipping = content_object.shipping_cost() subtotal = (total - shipping) post_data = { 'intent':'sale', 'redirect_urls':{ 'return_url': build_url(request, trans.get_success_url()), 'cancel_url': build_url(request, trans.get_failure_url()), }, 'payer':{ 'payment_method': 'paypal', }, 'transactions': [{ 'amount': { 'total': "%.2f" % total, 'currency': content_object.currency, 'details': { 'subtotal': "%.2f" % subtotal, 'shipping': "%.2f" % shipping, } }, 'description': str(content_object).encode('ascii', 'ignore'), 'item_list': {'items': []}, }] } if hasattr(content_object, 'get_lines'): for line in content_object.get_lines(): post_data['transactions'][0]['item_list']['items'].append({ 'name': '%s x %s' % (line[1], line[0]), 'quantity': 1, 'price': "%.2f" % line[2], 'currency': content_object.currency, }) else: post_data['transactions'][0]['item_list']['items'].append({ 'quantity': 1, 'name': str(content_object).encode('ascii', 'ignore'), 'price': "%.2f" % subtotal, 'currency': content_object.currency, }) url = PAYPAL_API + '/v1/payments/payment' token = get_paypal_token() # see https://developer.paypal.com/docs/integration/web/accept-paypal-payment/#specify-payment-information-to-create-a-payment opener = urllib2.build_opener(BetterHTTPErrorProcessor) urllib2.install_opener(opener) encoded_data = json.dumps(post_data) request = urllib2.Request(url, encoded_data, headers={"Authorization": 'Bearer ' + token, "Content-Type": 'application/json'}) try: request = urllib2.Request(url, encoded_data, headers={"Authorization": 'Bearer ' + token, "Content-Type": 'application/json'}) result = urllib2.urlopen(request).read() except urllib2.HTTPError, e: raise Exception(e.read())