# coding=utf-8 import datetime from hashlib import md5 from django.shortcuts import render from django.views.decorators.csrf import csrf_exempt from finance.models import Bill, YandexKassaHistory from settings.settings import YANDEX_MONEY_SHOP_PASSWORD def gen_md5(cd): return md5(';'.join(( cd['action'], cd['orderSumAmount'], cd['orderSumCurrencyPaycash'], cd['orderSumBankPaycash'], cd['shopId'], cd['invoiceId'], cd['customerNumber'], YANDEX_MONEY_SHOP_PASSWORD, )).encode('utf-8')).hexdigest().upper() @csrf_exempt def aviso(request): # Страница получения результата о платежах data = request.POST tmp = {} for key, value in data.items(): tmp[key] = value tmp = str(tmp) _time = datetime.datetime.now() _log = YandexKassaHistory.objects.create(text=tmp, _type='paymentAvisoResponse') result = { 'performedDatetime': _time.isoformat(), 'code': '200', 'shopId': data.get('shopId'), 'invoiceId': data.get('invoiceId'), 'message': '' } if not data.get('md5'): return render(request, 'yandexkassa_result.xml', {'check_type': 'paymentAvisoResponse', 'data': result}, content_type="application/xhtml+xml") if data['md5'] == gen_md5(data): try: bill = Bill.objects.get(id=data['orderNumber']) except Bill.DoesNotExist: result['message'] = u'Не найден счет по указанным данным' else: if str(bill.user.id) == data['customerNumber']: bill.status = 'F' bill.real_price = data['shopSumAmount'] bill.out_id = data['invoiceId'] bill.status_changed = _time bill.save() result['code'] = '0' else: result['message'] = u'Не найден пользователь, указанный в запросе' else: result['code'] = '1' result['message'] = u'Не сходится ключ платежа' return render(request, 'yandexkassa_result.xml', {'check_type': 'paymentAvisoResponse', 'data': result}, content_type="application/xhtml+xml") @csrf_exempt def check(request): # Страница получения результата о платежах data = request.POST _time = datetime.datetime.now() tmp = {} for key, value in data.items(): tmp[key] = value tmp = str(tmp) if data.get('action'): YandexKassaHistory.objects.create(text=tmp, _type=data['action']) else: YandexKassaHistory.objects.create(text=tmp, _type='empty_check') result = { 'performedDatetime': _time.isoformat(), 'code': '200' if data.get('action') == 'checkOrder' else '1', 'shopId': data.get('shopId'), 'orderSumAmount': data.get('orderSumAmount'), 'invoiceId': data.get('invoiceId'), 'message': '' } if not data.get('md5'): return render(request, 'yandexkassa_result.xml', {'check_type': 'checkOrderResponse', 'data': result}, content_type="application/xhtml+xml") if data['md5'] == gen_md5(data): try: bill = Bill.objects.get(id=data['orderNumber']) except Bill.DoesNotExist: result['message'] = u'Не найден счет по указанным данным' else: if str(bill.user.id) == data['customerNumber']: if data['action'] != 'checkOrder': bill.status = 'B' bill.out_id = data['invoiceId'] bill.status_changed = _time bill._method = 'Y' bill.inside_data = tmp bill.test = True bill.save() result['code'] = '0' else: result['message'] = u'Не найден пользователь, указанный в запросе' else: result['code'] = '1' result['message'] = u'Не сходится ключ платежа' result['tech_message'] = str(data['md5']) + str('_') + str(gen_md5(data)) return render(request, 'yandexkassa_result.xml', {'check_type': 'checkOrderResponse' if data['action'] == 'checkOrder' else 'cancelOrderResponse', 'data': result}, content_type="application/xhtml+xml")