diff options
author | Michal Ociepka <michal@ociepka.info> | 2013-04-25 17:37:32 +0200 |
---|---|---|
committer | Michal Ociepka <michal@ociepka.info> | 2013-04-25 17:37:32 +0200 |
commit | d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e (patch) | |
tree | 9b60521774a05bb45926fff4298d1ca380f2ecf9 /payments/dotpay | |
parent | 3d9be786756c981d07d1d9d32358f3986143a9cc (diff) | |
download | django-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.tar.gz django-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.tar.bz2 django-payments-taler-d9a24c37bdf9b34dd0c23b0506aa4dbab08cc34e.zip |
Improve dotpay
Diffstat (limited to 'payments/dotpay')
-rw-r--r-- | payments/dotpay/__init__.py | 81 | ||||
-rw-r--r-- | payments/dotpay/forms.py | 90 |
2 files changed, 68 insertions, 103 deletions
diff --git a/payments/dotpay/__init__.py b/payments/dotpay/__init__.py index e01d8b6..6279f2b 100644 --- a/payments/dotpay/__init__.py +++ b/payments/dotpay/__init__.py @@ -1,14 +1,8 @@ -# -*- coding: utf-8 -*- -import urlparse - -from django.contrib.sites.models import Site -from django.core.urlresolvers import reverse +from .. import BasicProvider, get_payment_model +from .forms import ProcessPaymentForm from django.http import HttpResponse, HttpResponseForbidden -from .. import BasicProvider -from ..models import Payment - -from .forms import ProcessPaymentForm +Payment = get_payment_model() class DotpayProvider(BasicProvider): @@ -32,59 +26,38 @@ class DotpayProvider(BasicProvider): _method = 'post' _action = 'https://ssl.dotpay.pl/' - def __init__(self, seller_id, url, domain=None, pin=None, channel=0, - lang='pl', lock=False, **kwargs): - self._seller_id = seller_id - self._url = url - self._domain = (domain or - urlparse.urlunparse(('https', - Site.objects.get_current().domain, - '/', None, None, None))) - self._pin = pin - self._channel = channel - self._lang = lang - self._lock = lock - return super(DotpayProvider, self).__init__(**kwargs) - - def get_hidden_fields(self, payment): - get_label = (lambda x: x.name if x.quantity == 1 - else u'%s × %d' % (x.name, x.quantity)) - items = map(get_label, payment.items.all()) - domain = urlparse.urlparse(self._domain) - path = reverse('process_payment', args=[self._variant]) - urlc = urlparse.urlunparse((domain.scheme, domain.netloc, path, - None, None, None)) - url_parts = urlparse.urlparse(self._url) - if url_parts.scheme: - url = self._url - else: - url = urlparse.urlunparse((domain.scheme, domain.netloc, - url_parts.path, None, None, None)) + def __init__(self, *args, **kwargs): + self._seller_id = kwargs.pop('seller_id') + self._pin = kwargs.pop('pin') + self._channel = kwargs.pop('channel', 0) + self._lang = kwargs.pop('lang', 'pl') + self._lock = kwargs.pop('lock', False) + super(DotpayProvider, self).__init__(*args, **kwargs) + + def get_hidden_fields(self,): + self.payment.save() + description = '; '.join(['%(quantity)dx %(name)s (%(sku)s), ' + '%(price)f %(currency)s' % order._asdict() + for order in self.order_items]) data = { 'id': self._seller_id, - 'amount': str(payment.total), - 'control': str(payment.id), - 'currency': payment.currency, - 'description': ', '.join(items), + 'amount': str(self.payment.total), + 'control': str(self.payment.id), + 'currency': self.payment.currency, + 'description': description, 'lang': self._lang, 'channel': str(self._channel), 'ch_lock': '1' if self._lock else '0', - 'URL': url, - 'URLC': urlc, - 'type': '2', - 'control': payment.id, + 'URL': self.payment.get_success_url(), + 'URLC': self.get_return_url(), + 'type': '2' } return data def process_data(self, request): - from django.core.mail import mail_admins - variables = unicode(request.POST) + '\n' + unicode(request.GET) - mail_admins('Payment', variables) - failed = HttpResponseForbidden("FAILED") - if request.method != "POST": - return failed - form = ProcessPaymentForm(pin=self._pin, data=request.POST) + form = ProcessPaymentForm(payment=self.payment, pin=self._pin, + data=request.POST or None) if not form.is_valid(): - return failed + return HttpResponseForbidden('FAILED') form.save() - return HttpResponse("OK") + return HttpResponse('OK') diff --git a/payments/dotpay/forms.py b/payments/dotpay/forms.py index 54040f4..938d6d5 100644 --- a/payments/dotpay/forms.py +++ b/payments/dotpay/forms.py @@ -1,19 +1,17 @@ -# -*- coding:utf-8 -*- from django import forms -from django.utils.translation import ugettext as _ -from django.db.models import Q +from .. import get_payment_model import md5 -from ..models import Payment +Payment = get_payment_model() -NO_MORE_CONFIRMATION=0 -NEW=1 -ACCEPTED=2 -REJECTED=3 -CANCELED=4 +NO_MORE_CONFIRMATION = 0 +NEW = 1 +ACCEPTED = 2 +REJECTED = 3 +CANCELED = 4 -STATUS_CHOICES = map(lambda c: (c,c), ( +STATUS_CHOICES = map(lambda c: (c, c), ( NO_MORE_CONFIRMATION, NEW, ACCEPTED, @@ -21,18 +19,12 @@ STATUS_CHOICES = map(lambda c: (c,c), ( CANCELED )) + class ProcessPaymentForm(forms.Form): - status = forms.ChoiceField(choices=(("OK","OK"),("FAIL","FAIL"))) + + status = forms.ChoiceField(choices=(('OK', 'OK'), ('FAIL', 'FAIL'))) id = forms.IntegerField() - #this should be Payments modelchoicefield control = forms.IntegerField() - #control = forms.TypedChoiceField( - # choices = [ (id,id) for id in Payment.objects.exclude( - # Q(status='rejected') - # ).values_list("id", flat=True) - # ], - # coerce=int, - #) t_id = forms.CharField() amount = forms.DecimalField() email = forms.EmailField(required=False) @@ -40,41 +32,41 @@ class ProcessPaymentForm(forms.Form): description = forms.CharField(required=False) md5 = forms.CharField() - def __init__(self, pin, **kwargs): + def __init__(self, payment, pin, **kwargs): super(ProcessPaymentForm, self).__init__(**kwargs) self.pin = pin + self.payment = payment def clean(self): - vars = { - "pin": self.pin, - "id": self.cleaned_data['id'], - "control": self.cleaned_data["control"], - "t_id": self.cleaned_data["t_id"], - "amount": self.cleaned_data["amount"], - "email": self.cleaned_data.get("email", ""), - "service": "", - "code": "", - "username": "", - "password": "", - "t_status": self.cleaned_data["t_status"] - } - - key = "%(pin)s:%(id)s:%(control)s:%(t_id)s:%(amount)s:%(email)s:%(service)s:%(code)s:%(username)s:%(password)s:%(t_status)s" % vars - hash = md5.new(key).hexdigest() - if hash != self.cleaned_data["md5"]: - raise forms.ValidationError() - return self.cleaned_data + cleaned_data = super(ProcessPaymentForm, self).clean() + if not self.errors: + key_vars = ( + self.pin, + cleaned_data['id'], + cleaned_data['control'], + cleaned_data['t_id'], + cleaned_data['amount'], + cleaned_data.get('email', ''), + '', # service + '', # code + '', # username + '', # password + cleaned_data['t_status']) + key = ':'.join(key_vars) + key_hash = md5.new(key).hexdigest() + if key_hash != self.cleaned_data['md5']: + self._errors['md5'] = self.error_class(['Bad hash']) + if cleaned_data['control'] != self.payment.id: + self._errors['control'] = self.error_class(['Bad payment id']) + return cleaned_data def save(self, *args, **kwargs): - payment_id = self.cleaned_data['control'] status = self.cleaned_data['t_status'] - - payment = Payment.objects.get(id=payment_id) - payment.transaction_id = self.cleaned_data['t_id'] - payment.save() - + self.payment.transaction_id = self.cleaned_data['t_id'] + self.payment.save() + payment_status = self.payment.status if status == ACCEPTED: - payment.change_status('confirmed') - elif (status == NO_MORE_CONFIRMATION and payment.status == 'waiting') \ - or status == REJECTED or status == CANCELED: - payment.change_status('rejected') + self.payment.change_status('confirmed') + elif ((status == NO_MORE_CONFIRMATION and payment_status == 'waiting') + or status == REJECTED or status == CANCELED): + self.payment.change_status('rejected') |