def onpay_pay(request): if get_constant("debug"): mail_admins(subject=u"Pay query", message=unicode(dict(request.POST))) form = onpay.forms.OnpayPayForm(request.POST) if not form.is_valid(): return HttpResponse(answerpay_dict(request.POST, 12, u'Error in parameters data: %s' % form.errors)) try: onpay.models.data_get_created_operation(form.cleaned_data['pay_for']) except onpay.models.Operation.DoesNotExist: return HttpResponse(answerpay_dict(request.POST, 10, 'Cannot find any pay rows acording to this parameters: wrong payment')) if not form.check_md5(): return HttpResponse(answerpay_dict(request.POST, 8, 'Md5 signature is wrong.')) else: rezult_balance = onpay.models.data_update_user_balance( form.cleaned_data['pay_for'], form.cleaned_data['order_amount'] ) if get_constant('use_balance_table', True) else True # устанавливаем статус операции как оплаченную rezult_operation = onpay.models.Operation.objects.filter( id=form.cleaned_data['pay_for']).update(status=1, sum=form.cleaned_data['order_amount']) # если оба запроса прошли успешно выдаем ответ об удаче, # если нет, то о том что операция не произошла if rezult_operation and rezult_balance: return HttpResponse(answerpay_dict(request.POST, 0, 'OK')) else: print rezult_operation, rezult_balance return HttpResponse(answerpay_dict(request.POST, 9, 'Error in mechant database queries: operation or balance ' 'tables error'))
class Operation(models.Model): sum = models.DecimalField(verbose_name=u"сумма", max_digits=8, decimal_places=2) user = models.ForeignKey( User, verbose_name=u"пользователь", ) status = models.BooleanField(verbose_name=u"оплачено", default=get_constant('new_operation_status')) type = models.CharField(max_length=64, verbose_name=u"тип", default=u"внешняя") comment = models.CharField(max_length=255, verbose_name=u"комментарий", default=u"Пополнение счета") description = models.CharField(max_length=255, verbose_name=u"описание", default=u"через систему Onpay") date = models.DateTimeField(verbose_name=u"дата", auto_now_add=True) class Meta: verbose_name = u"операция" verbose_name_plural = u"операции" def __unicode__(self): return u"id %d, sum %s, st %s" % (self.id, self.sum, self.status)
def check_md5(self): u"Check hash strings" array = (self.cleaned_data['type'], self.cleaned_data['pay_for'], self.cleaned_data['onpay_id'], self.cleaned_data['order_amount'], self.cleaned_data['order_currency'], get_constant('private_code')) md5fb = md5(";".join(str(o_0) for o_0 in array)).hexdigest().upper() return self.cleaned_data["md5"] == md5fb
def __init__(self): self.pay_mode = get_constant("pay_mode", "fix") self.currency = get_constant("currency", "RUR") self.convert = get_constant("convert", "yes") self.url_success = get_constant("url_success") self.private_code = get_constant("private_code") self.onpay_login = get_constant("onpay_login") self.set_f(get_constant("f"))
def onpay_pay(request): if get_constant("debug"): mail_admins(subject=u"Pay query", message=unicode(dict(request.POST))) form = onpay.forms.OnpayPayForm(request.POST) if not form.is_valid(): return HttpResponse( answerpay_dict(request.POST, 12, u'Error in parameters data: %s' % form.errors)) try: onpay.models.data_get_created_operation(form.cleaned_data['pay_for']) except onpay.models.Operation.DoesNotExist: return HttpResponse( answerpay_dict( request.POST, 10, 'Cannot find any pay rows acording to this parameters: wrong payment' )) if not form.check_md5(): return HttpResponse( answerpay_dict(request.POST, 8, 'Md5 signature is wrong.')) else: rezult_balance = onpay.models.data_update_user_balance( form.cleaned_data['pay_for'], form.cleaned_data['order_amount']) if get_constant( 'use_balance_table', True) else True # устанавливаем статус операции как оплаченную rezult_operation = onpay.models.Operation.objects.filter( id=form.cleaned_data['pay_for']).update( status=1, sum=form.cleaned_data['order_amount']) # если оба запроса прошли успешно выдаем ответ об удаче, # если нет, то о том что операция не произошла if rezult_operation and rezult_balance: return HttpResponse(answerpay_dict(request.POST, 0, 'OK')) else: print rezult_operation, rezult_balance return HttpResponse( answerpay_dict( request.POST, 9, 'Error in mechant database queries: operation or balance ' 'tables error'))
def answer(type, code, pay_for, order_amount, order_currency, text): "функция выдает ответ для сервиса onpay в формате XML на чек запрос" array_for_md5 = (type, pay_for, order_amount, order_currency, str(code), get_constant('private_code')) result_md5 = md5(";".join(array_for_md5)).hexdigest().upper() root = etree.Element("result") etree.SubElement(root, "code").text = str(code) etree.SubElement(root, "pay_for").text = pay_for etree.SubElement(root, "comment").text = text etree.SubElement(root, "md5").text = result_md5 return etree.tostring(root, pretty_print=True, xml_declaration=True, encoding='UTF-8')
#coding: utf-8 from django.dispatch import Signal from django.core.mail import mail_admins, mail_managers from onpay.conf import get_constant refilled_balance = Signal(providing_args=["user", "sum"]) def update_balance(sender, **kw): "Пример пополнения баланса" kw['user'].footman_profile.money += kw['sum'] kw['user'].footman_profile.save() def email_notification(sender, **kw): mail_managers( subject=u"Money from %s" % kw['user'].username, message=u"Balance refilled for %s RUR" % kw['sum'], ) if get_constant("enable_footman_update_balance"): refilled_balance.connect(update_balance) if get_constant("enable_email_notify"): refilled_balance.connect(email_notification)
def data_get_created_operation(id): "функция выборки неоплаченной операции по ID" return Operation.objects.get(id=id, status=get_constant('new_operation_status'))