Пример #1
0
 def get(self, request):
     order_pk = request.session['order_pk']
     order_payment = OrderPayment.objects.get(order_pk=order_pk)
     payment_id = request.data['object']['id']
     Payment.capture(payment_id)
     order = Order.objects.get(pk=order_pk)
     order_products = order.products.all()
     order_products.update(is_ordered=True)
     for product in order_products:
         product.save()
     order.is_ordered = True
     #order.payment = payment
     order.payment.charge_id = payment_id
     order.save()
     return Response(status=200)
Пример #2
0
    def create_payment(self, data):
        """
        Создать платёж.
        """
        payment = Payment.create(data, self.generate_idempotence_key())

        # TODO: Сделать специальный класс для данной ошибки и описание.
        payment_status = payment.status
        if payment_status not in PaymentStatus.available_choices():
            raise YandexKassaException()

        # TODO: Сделать специальный класс для данной ошибки и описание.
        payment_payment_method = payment.payment_method.type
        if payment_payment_method not in PaymentMethod.available_choices():
            raise YandexKassaException()

        data = {
            'amount': payment.amount.value,
            'confirmation_url': payment.confirmation.confirmation_url,
            'created_at': dateparse.parse_datetime(payment.created_at),
            'currency': payment.amount.currency,
            'metadata': payment.metadata,
            'payment_id': payment.id,
            'payment_method': payment_payment_method,
            'status': payment_status,
        }

        if payment.description:
            data['description'] = payment.description

        return data
Пример #3
0
    def get(self, request, value=3000, id=None):
        Configuration.account_id = '718911'
        Configuration.secret_key = 'test_LvcNnzMH8UOAI0Rc6Dw7MvP8O6WAZoQwsF0kW7e5tY4'

        print(id)
        nmb = int(value / 3000)

        currency = "RUB"

        return_url = "https://chestnokfest.live/tickets/payment_redirect/"

        description = str("Покупка " + str(nmb) + " билета(ов) за " +
                          str(value))

        payment = Payment.create({
            "amount": {
                "value": value,
                "currency": currency
            },
            "confirmation": {
                "type": "redirect",
                "return_url": return_url
            },
            "description": description,
            "metadata": {
                'id': id,
            }
        })

        return HttpResponseRedirect(payment.confirmation.confirmation_url)
Пример #4
0
    def payment_status(self, payment_id):
        """
        Получить информацию о платеже.
        """
        payment = Payment.find_one(payment_id)

        created_at = (dateparse.parse_datetime(payment.created_at)
                      if payment.created_at else None)
        captured_at = (dateparse.parse_datetime(payment.captured_at)
                       if payment.captured_at else None)
        expires_at = (dateparse.parse_datetime(payment.expires_at)
                      if payment.expires_at else None)

        return {
            'amount': payment.amount.value,
            'captured_at': captured_at,
            'created_at': created_at,
            'currency': payment.amount.currency,
            'description': payment.description,
            'expires_at': expires_at,
            'metadata': payment.metadata,
            'payment_method': payment.payment_method.type,
            'receipt_registration': payment.receipt_registration,
            'status': payment.status,
        }
Пример #5
0
    def post(self, request):
        print(request.data)
        pay_id = request.data.get('pay_id')
        Configuration.account_id = settings.YA_SHOP_ID
        Configuration.secret_key = settings.YA_API

        paymentObj = PaymentObj.objects.get(pay_code=pay_id)
        print(paymentObj)
        if not paymentObj.is_payed:
            payment = Payment.find_one(paymentObj.pay_id)
            print(payment)
            if payment.status == 'succeeded':
                paymentObj.is_payed = True
                paymentObj.status = 'Оплачен'
                paymentObj.save()
                paymentObj.user.balance += paymentObj.amount
                paymentObj.user.save(force_update=True)

            all_refferals = Refferal.objects.filter(refferal=paymentObj.user)

            print(all_refferals)
            if all_refferals.exists():
                for reffreal in all_refferals:
                    print(reffreal.master)
                    reffreal.master.partner_balance += int(paymentObj.amount *
                                                           10 / 100)
                    reffreal.master.save()
                    reffreal.earned += int(paymentObj.amount * 10 / 100)
                    reffreal.save()

        return Response(status=200)
Пример #6
0
 def get(self, request):
     uuid = request.session.pop('payment') if 'payment' in request.session else None
     payment = None
     if uuid is not None:
         payment = models.Payment.objects.filter(uuid=uuid).first()
         if payment:
             payment_id = payment.yuid
             log = models.Logging.objects.create(
                 action="Запрос данных в Яндекс кассе для ReturnUrl после оплаты. api/views.PaymentReturnUrl.get()",
                 input_data=f"yuid: {payment_id}")
             try:
                 payment_info = Payment.find_one(payment_id)
             except Exception as err:
                 log.result = log.FAIL
                 log.output_data = f"{err}"
                 log.save()
             else:
                 if payment.status != payment_info.status:
                     payment.status_set(payment_info.status)
                     # models.Payment.objects.filter(pk=payment.pk).update(status=payment_info.status)
                     # payment.status = payment_info.status
                     # if payment_info.status == 'succeeded':
                     #     payment.date_approve = timezone.now()
                     # payment.save()
                 log.result = log.SUCCESS
                 try:
                     payment_info_dict = {key: value.__dict__ if isinstance(value, BaseObject) else value for key, value
                                     in payment_info.__dict__.items()}
                     log.output_data = f"{payment_info_dict}"
                 except:
                     log.output_data = f"{payment_info}"
                 log.save()
     form_html = get_template('includes/payment_info.html').render(context={'payment': payment}, request=request)
     context = self.make_context(content=form_html, title='Статус платежа')
     return render(request, 'general.html', context=context)
Пример #7
0
async def buy_course(user_id, course_id, redirect_url):
    course = await CourseModel.get(course_id)
    if course.cost is None or course.cost <= 0:
        await PurchasedCoursesModel.create(
            course_id=course_id,
            user_id=user_id
        )
        return None
    payment = Payment.create({ 
        "amount": {
            "value": '{:.2f}'.format(course.cost),
            "currency": "RUB"
        },
        "confirmation": {
            "type": "redirect", 
            "return_url": redirect_url
        },
        "capture": True, 
        "description": "Покупка курса {name}".format(name=course.name)
    }, uuid.uuid4())

    await PaymentModel.create(
        user_id=user_id,
        course_id=course_id,
        order_id=payment.id
    )

    return payment.confirmation.confirmation_url
Пример #8
0
 def createPayment(self,user,amount,booking=None,payment_type="account"):
     '''
         Create yandex kassa payment object. payment_type = True - autopayment otherwise is add card
     '''
     if self.getCurrentTransaction(user,amount,booking,payment_type) is not None:
         print("Yes getCurrentTransaction")
         return self.getCurrentTransaction(user,amount,booking,payment_type).getInfo()
     payment_info = {
         "amount": {
             "value": str(decimal.Decimal(amount)),
             "currency": "RUB"
         },
         "description": "Привязка карты"
     }
     payment_info.update(self.createReceipt(user,amount))
     if payment_type == "full":
         payment_info.update(self.createAutoPayment(user))
     else: #payment_type == "account": # False
         payment_info.update(self.createConfirmation())
     payment_object = Payment.create(payment_info)
     self.create(
         user = user,
         booking = booking,
         price = amount,
         date = now(),
         status = payment_object.status,
         payment_type = payment_type,
         payment_id = payment_object.id,
         created_at = payment_object.created_at,
         expires_at = payment_object.expires_at,
         checkouted = False
     )
     return payment_object
Пример #9
0
    def pay_without_payment_id(self, order, value):
        return_url = f"{self.site_url}pay/{order.id}/"

        payment = Payment.create(
            {
                "amount": {
                    "value": value,
                    "currency": "RUB"
                },
                "capture": True,
                "payment_method_data": {
                    "type": "bank_card"
                },
                "confirmation": {
                    "type": "redirect",
                    "return_url": return_url
                },
                "description": f"Заказ {order.id}",
                "save_payment_method": True,
                "metadata": {
                    "order_id": order.id
                }
            }, str(uuid.uuid4()))

        return payment
Пример #10
0
    def get(self, request):
        with open('/Users/blockbusted/PycharmProjects/config_shop_file.json') as config_file:
            config = json.load(config_file)
        Configuration.account_id = config['YANDEX_SHOP_ID']
        Configuration.secret_key = config['YANDEX_SECRET_KEY']

        order_pk = self.request.session['order_pk']
        order = Order.objects.get(pk=order_pk)
        amount = order.get_total_order_price()
        idempotence_key = str(uuid.uuid4())
        payment = Payment.create({
            #  "payment_token": idempotence_key,
            "amount": {
                "value": 1,
                "currency": "RUB"
            },
            "confirmation": {
                "type": "redirect",
                "return_url": "cart:payment-yandex-notifications"
            },
            "description": "Заказ №"+str(order_pk)
        })

        order_payment = OrderPayment()
        order_payment.order_pk = order_pk
        if self.request.user.is_authenticated:
            order_payment.user = self.request.user
        order_payment.amount = amount
        order_payment.save()
        return HttpResponseRedirect(payment.confirmation.confirmation_url)
Пример #11
0
def pay(value, order_id, email, items, delivery):
    Configuration.account_id = settings.YA_ACCOUNT_ID
    Configuration.secret_key = settings.YA_SECRET_KEY

    payment_items = [
        {"description": f'{item.item.title} [{item.size.title}]', "quantity": "1",
         "amount": {"value": item.item.price, "currency": "RUB"},
         "vat_code": 1} for item in items]
    if delivery:
        payment_items += [{"description": "Доставка", "quantity": "1", "amount": {"value": delivery, "currency": "RUB"},
                           "vat_code": 1}]

    payment = Payment.create({
        "amount": {
            "value": value,
            "currency": "RUB"
        },
        "confirmation": {
            "type": "embedded",
            "return_url": "https://test.hrsmnt.ru/#/"
        },
        "receipt": {
            "customer": {
                "email": email,
            },
            "items": payment_items
        },
        "capture": True,
        "description": f"Заказ №{order_id}"
    }, uuid.uuid4())

    return payment.confirmation.confirmation_token, payment.id
Пример #12
0
def payment_formation(order):
    Configuration.account_id = settings.YANDEX_SHOP_ID
    Configuration.secret_key = settings.YANDEX_SECRET_KEY
    independent_key = str(uuid.uuid4())
    payment = Payment.create(
        {
            "amount": {
                "value": order.amount,
                "currency": "RUB"
            },
            "confirmation": {
                "type": "redirect",
                "return_url": "https://expertsovet.com"
            },
            "receipt": {
                "email":
                order.email,
                "payment_subject":
                order.good.payment_subject,
                "payment_mode":
                order.good.payment_mode,
                "items": [{
                    "description": order.good.subtitle[:128],
                    "quantity": 1,
                    "amount": {
                        "value": order.amount,
                        "currency": "RUB"
                    },
                    "vat_code": "1",
                }]
            },
            "description": f"Заказ №{order.id}"
        }, independent_key)
    return payment
Пример #13
0
def yandex_confirm(request):
    if request.method == 'POST':
        response_json = json.loads(request.body)
        data = response_json['object']
        if data['status'] == 'waiting_for_capture':
            payment_id = response_json['object']['id']
            data = Payment.capture(payment_id)
            # если платеж ожидает подтверждения, подтверждаю
            model = PaymentInfo()
        elif data['status'] == 'succeeded':
            model = PaymentInfo()
        else:
            pass
        try:
            model.payment_id = data['id']
            # id платежа из яндекс кассы
            model.phone = '+' + ''.join(re.findall(r'\d', data['description']))
            # привожу + 7 (900) 00-000-00 к +79000000000
            model.money = int(float(data['amount']['value']))
            # привожу строку 100.00 к цыфре 100
            model.paid = True
            model.save_with_bonus()
            mount = str(model.money + model.count_bonus(model.money))
            # Привожу сумму + бонус к строке для передачи в апи
            continue_play(model.phone, mount,
                          1)  # last argument it's time in hours
            status = 200
        except:
            status = 200
        return HttpResponse(status=status)
Пример #14
0
    def post(self, request):
        Configuration.account_id = '718911'
        Configuration.secret_key = 'test_LvcNnzMH8UOAI0Rc6Dw7MvP8O6WAZoQwsF0kW7e5tY4'

        payment_id = request.data['object']['id']

        Payment.capture(payment_id)
        order_id = request.data['object']['metadata']['id']
        order = PaymentModel.objects.get(id=order_id)
        tickets = TicketPay.objects.all()
        send_email = False
        gen_codes = []

        render_tickets = []
        for ticket in tickets:
            if ticket.order == order:
                if not ticket.is_saved:
                    print(ticket.is_payed)
                    ticket.is_payed = True
                    ticket.is_saved = True
                    ticket.save()
                    send_email = True
                    email = ticket.email
                    gen_codes.append(ticket.generated_code)
                    render_tickets.append(ticket)
                    print(ticket.is_payed)
        if send_email:
            gen_codes = ' '.join(gen_codes)
            print(gen_codes)
            print(email)

            context = {
                'tickets': render_tickets,
            }
            # print(context['tickets'][0])
            send_mail('Ваш заказ с билетом(ами)',
                      gen_codes,
                      '*****@*****.**', [email],
                      html_message=get_template('Payment/letter.html').render(
                          context))
            # send_mail('Ваш заказ с билетом(ами)', gen_codes, '*****@*****.**', [email])

        # нужно забрать айдишники, за которые заплачено и привязать тут полю is_payed значение True
        # после отправить на мыло ключ с инфой
        # otpravka email s klyu4om

        return Response(status=200)
Пример #15
0
    def post(self, request):
        """
        Подтверждение платежа и смена статуса заказа
        :param request:
        :return:
        """
        order_id = request.GET.get("order_id", "")
        order = Orders.objects.get(id=order_id)
        payment_id = order.payment_id
        # payment_id = '26fd1b35-000f-5000-a000-14c3cdc3d6c1'
        Payment.capture(payment_id)

        order = Orders.objects.get(id=order_id)
        order.status_order = 3
        order.save()

        return Response(status=200)
Пример #16
0
 def post(self, *args, **kwargs):
     Configuration.account_id = settings.YANDEX_ACCOUNT_ID
     Configuration.secret_key = settings.YANDEX_SECRET_KEY
     user = self.request.user
     try:
         game = Game.objects.get(pk=kwargs.get('pk'))
     except Game.DoesNotExist:
         return Response({
             'error': 'Game does not exist!',
         },
                         status=status.HTTP_400_BAD_REQUEST)
     user_registered_places = UserInTeam.objects.filter(game=game.pk,
                                                        user=user.pk)
     if user_registered_places.count() == 0:
         return Response(
             {
                 'error': 'User has no purchased seats for this game!',
             },
             status=status.HTTP_400_BAD_REQUEST)
     user_game_payments = GamePayment.objects.filter(user=user.pk,
                                                     game=game.pk,
                                                     status='SUCCEEDED')
     if user_game_payments.count() == 0:
         return Response(
             {
                 'error': 'User has no successful payments for this game!',
             },
             status=status.HTTP_400_BAD_REQUEST)
     refunds = []
     non_refundable_payments = []
     unregistered_places_count = 0
     for game_payment in user_game_payments:
         payment = Payment.find_one(game_payment.identifier)
         if payment.status == 'succeeded':
             game_payment_refund = create_refund(game_payment, user, game)
             refunds.append(game_payment_refund)
             if game_payment_refund.status == 'SUCCEEDED':
                 del_objects = UserInTeam.objects.filter(
                     game=game.pk, user=user.pk)[:game_payment.places_count]
                 for del_object in del_objects:
                     del_object.delete()
                     unregistered_places_count += game_payment.places_count
         else:
             non_refundable_payments.append(game_payment)
     if len(refunds):
         create_timeline_block('GAME_MESSAGE',
                               settings.USER_CANCEL_REGISTRATION, user,
                               'APP', game)
     return Response(
         {
             'refunds':
             GamePaymentRefundSerializer(refunds, many=True).data,
             'non_refundable_payments':
             GamePaymentSerializer(non_refundable_payments, many=True).data,
             'unregistered_places_count':
             unregistered_places_count,
         },
         status=status.HTTP_200_OK)
Пример #17
0
 def capture(self):
     return Payment.capture(
         self.payment_id,
         {"amount": {
             "value": self.price,
             "currency": "RUB"
         }},
         str(uuid.uuid4())  #idempotence key
     )
Пример #18
0
    def pay_with_payment_id(self, order, value):
        payment = Payment.create(
            {
                "amount": {
                    "value": value,
                    "currency": "RUB"
                },
                "description": f"Заказ {order.id}",
                "payment_method_id": self.payment_id
            }, str(uuid.uuid4()))

        return payment
Пример #19
0
    def check_pay(self, payment_id):
        paid = False
        time_while_end = datetime.now() + timedelta(seconds=33)
        while paid == False and datetime.now(tz=None) <= time_while_end:
            payment_result = Payment.find_one(payment_id)
            paid = payment_result.paid
            time.sleep(3)

        if paid:
            paid = payment_result

        return paid
Пример #20
0
def do_payment(track_code):
    ad = Ads.query.filter_by(track=track_code).first()
    form = ProcessPayment()

    if current_user.is_authenticated:
        user = Users.query.get(current_user.id)

        if ad in user.ads.all():
            is_own = True
        else:
            is_own = False
    else:
        is_own = False

    if form.validate_on_submit() and form.submit.data:

        Configuration.account_id = Variables.query.get(3).value
        Configuration.secret_key = Variables.query.get(4).value

        print(form.waste.data)

        payment = Payment.create(
            {
                "amount": {
                    "value":
                    int(ad.price) - int(current_user.collected_m)
                    if form.waste.data else ad.price,
                    "currency":
                    "RUB"
                },
                "confirmation": {
                    "type": "redirect",
                    "return_url": "https://vk.com/id608742663"
                },
                "capture": True,
                "description": "Оплата объявления {}".format(ad.track),
                "metadata": {
                    "track": ad.track,
                    "bonus_used": 1 if form.waste.data else 0,
                    "payer": current_user.id if is_own else 'unregistered user'
                }
            }, uuid.uuid4())

        print('передано в оплату')
        return redirect(payment.confirmation.confirmation_url)
    return render_template('do_payment.html',
                           form=form,
                           ad=ad,
                           is_own=is_own,
                           current_user=current_user,
                           price_btn_text='Оплатить {}₽'.format(ad.price))
Пример #21
0
    def handle_payment(self, order_number, total, **kwargs):
        """
        Called from submit method
        Handle any payment processing and record payment sources and events.

        This method is designed to be overridden within your project.

        This method is responsible for handling payment and recording the
        payment sources (using the add_payment_source method) and payment
        events (using add_payment_event) so they can be
        linked to the order when it is saved later on.
        """
        method = self.checkout_session.payment_method()
        if method == 'cod':
            source_type, is_created = models.SourceType.objects.get_or_create(
                name='cash')
            redirect_url = ''
        elif method == 'yandex_kassa':
            Configuration.account_id = settings.KASSA_ID
            Configuration.secret_key = settings.KASSA_TOKEN
            source_type, is_created = models.SourceType.objects.get_or_create(
                name='online')
            payment = Payment.create(
                {
                    "amount": {
                        "value": str(total.incl_tax),
                        "currency": "RUB"
                    },
                    "confirmation": {
                        "type": "redirect",
                        "return_url":
                        "http://127.0.0.1:8000/checkout/thank-you/"
                    },
                    "capture": True,  # холдирование - False
                    "description": order_number
                },
                uuid.uuid4())
            redirect_url = payment.confirmation.confirmation_url

        source = source_type.sources.model(source_type=source_type,
                                           amount_allocated=total.incl_tax,
                                           currency=total.currency)
        self.add_payment_source(source)
        self.add_payment_event('Authorised', total.incl_tax)
        if redirect_url:
            # return redirect(redirect_url)
            raise RedirectRequired(redirect_url)
Пример #22
0
def pay(request, timeslot_id):
    amount = 3400
    timeslot = TimeSlot.objects.get(pk=timeslot_id)
    user = create_user(request)
    enroll = Enroll.objects.create(timeslot_id=timeslot_id, user=user, )
    enroll.save()
    payment = Payment.objects.create(enroll=enroll, status="initial", amount=amount, )
    payment.save()
    yandex_payment = YandexPayment.create({
        "amount": {
            "value": amount,
            "currency": "RUB"
        },
        "payment_method_data": {
            "type": "bank_card"
        },
        "confirmation": {
            "type": "redirect",
            "return_url": settings.KASSA_REDIRECT_URL
        },
        "capture": False,
        "description": "Консультация " + timeslot.specialist.middle_name + " " + timeslot.specialist.first_name,
        "receipt": {
            "items": [{
                "description": "Консультация " + timeslot.specialist.middle_name + " " + timeslot.specialist.first_name,
                "quantity": 1,
                "amount": {
                    "value": amount,
                    "currency": "RUB"
                },
                "vat_code": 1,
                "payment_subject": "service",
                "payment_mode": "full_prepayment"

            }],
            "tax_system_code": 3,
            "email": user.email,

        }
    }, uuid.uuid4())

    payment_id = yandex_payment.id
    payment.yandex_payment = payment_id
    payment.save()

    print(yandex_payment)
    return HttpResponseRedirect(yandex_payment.confirmation.confirmation_url)
Пример #23
0
def pay_notification(request):
    payment_id = request.data['object']['id']
    yandex_payment = YandexPayment.capture(payment_id)
    payment = Payment.objects.get(yandex_payment=payment_id)
    if payment:
        payment.status = yandex_payment.status
        payment.save()
        print(yandex_payment.id)
        print(yandex_payment.status)
        user = payment.enroll.user

        if not payment.notify:
            payment.notify = True
            payment.save()
            pay_user_email_notify(payment)
            pay_specialist_email_notify(payment)

    return Response(status=200)
Пример #24
0
def paycheck(request, payment_id):
    order = get_object_or_404(UserAccount, key=payment_id)
    payment = Payment.find_one(order.payment_id)
    if payment.status == "succeeded":
        order.status = True
        order.save()
        try:
            send_mail(
                'Алгоритм языка | Оплата занятий',
                'Вы успешно оплатили заказ № {0} на сумму: {1}'.format(
                    order.pk, str(decimal.Decimal(order.price))),
                '*****@*****.**',
                ['{0}'.format(order.email)],
                fail_silently=False,
            )
        except Exception as e:
            print("Email sendr exception {0}".format(e))
    return render(request, "sprache/success.html", {"number": order.pk})
Пример #25
0
 def createPaymentObject(self, capture=False, save_payment_method=True):
     '''
         Returns Yandex Kassa Object if rentor i.e user and price are set.
     '''
     if self.rentor is None:
         return None
     if self.price is None:
         return None
     return Payment.create({
         "amount": {
             "value": "{0}".format(str(decimal.Decimal(self.price))),
             "currency": "RUB"
         },
         "confirmation": {
             "type": "embedded"
         },
         "receipt": {
             "customer": {
                 "full_name":
                 "{0} {1}".format(self.rentor.first_name,
                                  self.rentor.last_name),
                 "email":
                 "{0}".format(self.rentor.email)
             },
             "items": [{
                 "description": "Оплата аренды",
                 "quantity": "2.00",
                 "amount": {
                     "value":
                     "{0}".format(str(decimal.Decimal(self.price))),
                     "currency": "RUB"
                 },
                 "vat_code": "2",
                 "payment_mode": "full_prepayment",
                 "payment_subject": "commodity"
             }]
         },
         "capture":
         capture,
         "save_payment_method":
         save_payment_method,
         "description":
         "Оплата аренды №{0}".format(self.pk)
     })
Пример #26
0
def refresh_payment(payment):
    Configuration.configure(settings.YANDEX_CHECKOUT_CLIENT_ID,
                            settings.YANDEX_CHECKOUT_SECRET_KEY)
    yandex_payment = YandexPayment.find_one(payment.yandex_id)

    need_to_set_payed = False
    if payment.status == Payment.PENDING and yandex_payment.status in (
            Payment.WAITING_FOR_CAPTURE, Payment.SUCCEEDED):
        need_to_set_payed = True

    payment.status = yandex_payment.status
    if yandex_payment.cancellation_details:
        payment.cancellation_reason = yandex_payment.cancellation_details.reason
    payment.save(update_fields=['status', 'cancellation_reason'])

    if need_to_set_payed:
        set_order_payed(payment.order)

    return payment
Пример #27
0
def create_payment(price, days):
    payment = Payment.create({
        "amount": {
            "value": f"{price}",
            "currency": "RUB"
        },
        "confirmation": {
            "type": "redirect",
            "return_url": "http://localhost:3000/pay_success"
        },
        "capture": True,
        "description": "Заказ №1",
        'metadata': {
            'days': days
        }
    })
    p_id = payment.id
    print(p_id)
    return payment.confirmation.confirmation_url, p_id
Пример #28
0
def index_page(request):
    if request.method == 'POST':
        form = PaymentInfoForm(request.POST)
        if form.is_valid():

            payment = Payment.create(
                {
                    "amount": {
                        "value": form.cleaned_data['money'],
                        "currency": "RUB"
                    },
                    "confirmation": {
                        "type": "redirect",
                        "return_url": settings.ALLOWED_HOSTS[0]
                    },
                    "receipt": {
                        "customer": {
                            "full_name":
                            "ФИО",
                            "phone":
                            ''.join(
                                re.findall(r'\d', form.cleaned_data['phone']))
                        },
                        "items": [{
                            "description": "Оплата бронирования",
                            "quantity": "1.00",
                            "amount": {
                                "value": form.cleaned_data['money'],
                                "currency": "RUB"
                            },
                            "vat_code": "2",
                            "payment_mode": "full_prepayment",
                            "payment_subject": "commodity"
                        }]
                    },
                    "capture": True,
                    "description": form.cleaned_data['phone']
                }, uuid.uuid4())
            return HttpResponseRedirect(payment.confirmation.confirmation_url)
    else:
        form = PaymentInfoForm()
    return render(request, 'index.html', {'form': form})
Пример #29
0
 def create_yandex_payment(self, user):
     payment_data = {
         'amount': {'value': self.cost, 'currency': 'RUB'},
         'confirmation': {'type': 'redirect', 'return_url': 'https://sample-shop.com/'},
         'capture': True,
         'description': self.__str__(),
         'receipt': {
             'customer': {'email': user.email},
             'items': [
                 {
                     'description': item.name,
                     'quantity': item.count,
                     'amount': {'value': item.price, 'currency': 'RUB'},
                     'vat_code': 1,
                 }
                 for item in self.order.items.all()
             ],
         },
     }
     return YandexPayment.create(payment_data, self.inner_key)
Пример #30
0
def check_payment_status():
    """
    периодическая проверка неконечных статусов платежа, с момента создания которых прошел час
    (в течении часа пользователю доступен виджет оплаты в статусе -pending-)
    """
    payments = models.Payment.objects.filter(
        account__isnull=False,
        yuid__isnull=False).exclude(status__in=['succeeded', 'canceled'])
    if payments:
        try:
            upper_settings = models.UpperSetting.objects.get()
            test = upper_settings.test_mode
            if test:
                yandex_api_key = upper_settings.yandex_api_key_test
                shopid = upper_settings.shopid_test
            else:
                yandex_api_key = upper_settings.yandex_api_key
                shopid = upper_settings.shopid
        except:
            base_dir = settings.BASE_DIR

            env = environ.Env()
            env.read_env(path.join(base_dir, '.env'))
            yandex_api_key = env('YANDEX_API_KEY')
            shopid = env('SHOPID')
        Configuration.account_id = shopid
        Configuration.secret_key = yandex_api_key
        for payment in payments:
            try:
                payment_info = Payment.find_one(payment.yuid)
                if payment.status != payment_info.status:
                    payment.status_set(payment_info.status)
                    # models.Payment.objects.filter(pk=payment.pk).update(status=payment_info.status)
                    # payment.status = payment_info.status
                    # if payment_info.status == 'succeeded':
                    #     payment.date_approve = timezone.now()
                    # payment.save()
            except Exception as ex:
                print(ex)