diff options
author | Adam Bogdal <adam@bogdal.pl> | 2013-10-13 14:34:06 +0200 |
---|---|---|
committer | Adam Bogdal <adam@bogdal.pl> | 2013-10-13 14:34:06 +0200 |
commit | 11d02243acc5595f3579713fb1fe0337ddff9e41 (patch) | |
tree | ceebd4c0baf55fc95245dc2b62973b050dc5c4af /payments/stripe | |
parent | 622fb7a5a6c286fb73f9ddf6415366f27b61457d (diff) | |
download | django-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__.py | 35 | ||||
-rw-r--r-- | payments/stripe/forms.py | 36 | ||||
-rw-r--r-- | payments/stripe/widgets.py | 20 |
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"] |