summaryrefslogtreecommitdiff
path: root/payments/stripe
diff options
context:
space:
mode:
authorAdam Bogdal <adam@bogdal.pl>2013-10-13 14:34:06 +0200
committerAdam Bogdal <adam@bogdal.pl>2013-10-13 14:34:06 +0200
commit11d02243acc5595f3579713fb1fe0337ddff9e41 (patch)
treeceebd4c0baf55fc95245dc2b62973b050dc5c4af /payments/stripe
parent622fb7a5a6c286fb73f9ddf6415366f27b61457d (diff)
downloaddjango-payments-taler-11d02243acc5595f3579713fb1fe0337ddff9e41.tar.gz
django-payments-taler-11d02243acc5595f3579713fb1fe0337ddff9e41.tar.bz2
django-payments-taler-11d02243acc5595f3579713fb1fe0337ddff9e41.zip
Add stripe backend
Diffstat (limited to 'payments/stripe')
-rw-r--r--payments/stripe/__init__.py35
-rw-r--r--payments/stripe/forms.py36
-rw-r--r--payments/stripe/widgets.py20
3 files changed, 91 insertions, 0 deletions
diff --git a/payments/stripe/__init__.py b/payments/stripe/__init__.py
new file mode 100644
index 0000000..d60ea75
--- /dev/null
+++ b/payments/stripe/__init__.py
@@ -0,0 +1,35 @@
+from django.shortcuts import redirect
+
+from .. import get_payment_model, BasicProvider, RedirectNeeded
+from .forms import PaymentForm
+
+Payment = get_payment_model()
+
+
+class StripeProvider(BasicProvider):
+
+ def __init__(self, *args, **kwargs):
+ self.secret_key = kwargs.pop('secret_key')
+ self.public_key = kwargs.pop('public_key')
+ super(StripeProvider, self).__init__(*args, **kwargs)
+
+ def get_form(self, data=None):
+ kwargs = {
+ 'data': data,
+ 'payment': self.payment,
+ 'provider': self,
+ 'action': '',
+ 'hidden_inputs': False}
+ form = PaymentForm(**kwargs)
+
+ if form.is_valid():
+ form.save()
+ raise RedirectNeeded(self.payment.get_success_url())
+ else:
+ self.payment.change_status('input')
+ return form
+
+ def process_data(self, request):
+ if self.payment.status == 'confirmed':
+ return redirect(self.payment.get_success_url())
+ return redirect(self.payment.get_failure_url())
diff --git a/payments/stripe/forms.py b/payments/stripe/forms.py
new file mode 100644
index 0000000..6699b88
--- /dev/null
+++ b/payments/stripe/forms.py
@@ -0,0 +1,36 @@
+from django import forms
+
+import stripe
+
+from .. import RedirectNeeded
+from ..forms import PaymentForm as BasePaymentForm
+from .widgets import StripeWidget
+
+
+class PaymentForm(BasePaymentForm):
+
+ def __init__(self, *args, **kwargs):
+ super(PaymentForm, self).__init__(*args, **kwargs)
+ widget = StripeWidget(provider=self.provider, payment=self.payment)
+ self.fields['stripe_token'] = forms.CharField(widget=widget)
+
+ def save(self):
+ data = self.cleaned_data
+
+ stripe.api_key = self.provider.secret_key
+ try:
+ charge = stripe.Charge.create(
+ amount=self.payment.total * 100,
+ currency=self.payment.currency,
+ card=data['stripe_token'],
+ description=u"%s %s" % (self.payment.billing_last_name,
+ self.payment.billing_first_name)
+ )
+ except stripe.CardError, e:
+ # The card has been declined
+ self.payment.change_status('input')
+ raise RedirectNeeded(self.payment.get_failure_url())
+ else:
+ self.payment.transaction_id = charge.id
+ self.payment.change_status('confirmed')
+ self.payment.save()
diff --git a/payments/stripe/widgets.py b/payments/stripe/widgets.py
new file mode 100644
index 0000000..1ef6679
--- /dev/null
+++ b/payments/stripe/widgets.py
@@ -0,0 +1,20 @@
+from django.forms.widgets import HiddenInput
+
+
+class StripeWidget(HiddenInput):
+
+ def __init__(self, provider, payment, *args, **kwargs):
+ attrs = kwargs.get('attrs') or {}
+ kwargs['attrs'] = {
+ 'id': 'stripe-id',
+ 'data-key': provider.public_key,
+ 'data-description': payment.description or u"Total payment",
+ 'data-amount': payment.total * 100,
+ 'data-currency': payment.currency,
+ }
+ kwargs['attrs'].update(attrs)
+ super(StripeWidget, self).__init__(*args, **kwargs)
+
+ class Media:
+ js = ["https://checkout.stripe.com/v2/checkout.js",
+ "payments/js/stripe.js"]