@ErikHabr

Объясните мне как проверить статус платежа в Юmoney?

Всем привет. Объясните мне как все таки проверить статус оплаты? Я уже всю голову сломал и не пойму логику.
Так вот, насколько я понял, то необязательно авторизовываться и счет можно выставить с помощью quickpay указав номер кошелька (дока). Там есть и параметр successURL, который понятно что при успешной оплате редирект туда куда скажешь, предполагаю что в url можно передать параметры ?orderId=xxx&gateway=yoomoney и их обработать. Почему то кстати к слову failURL я не вижу параметра в доках на случай неудачной оплаты.
Есть еще http-уведомления. Мне не совсем ясен смысл этого. Я поднял даже сервак чтобы проверить их, ну присылают они мне что-то и что дальше? Зачем нужны они если есть параметр successURL? Вообщем я не понимаю пока что как создать вебхук который будет определять статус данного платежа и менять статусы в сущностях Order и Payment. Я тренируюсь сейчас на юmoney и стараюсь написать универсальное решение, которое потом можно будет использовать с другими платежками слегка видоизменив.

Вот класс для выставления счета:
class YooMoneyPay:
    """
    Dont need to be authorized for this !
    https://yoomoney.ru/docs/payment-buttons
    ________________________________________
    отправлять на фронте на (yoo_pay.redirected_url)
    """
    def __init__(self,
                 receiver: str,
                 quickpay_form: str,
                 targets: str,
                 paymentType: str,
                 sum: int,
                 formcomment: str = None,
                 shortdest: str = None,
                 label: str = None,
                 successURL: str = None,
                 need_fio: bool = None,
                 need_email: bool = None,
                 need_phone: bool = None,
                 need_address: bool = None):

        self.receiver = receiver
        self.quickpay_form = quickpay_form
        self.targets = targets
        self.paymentType = paymentType
        self.sum = sum
        self.formcomment = formcomment
        self.shortdest = shortdest
        self.label = label
        self.successURL = successURL
        self.need_fio = need_fio
        self.need_email = need_email
        self.need_phone = need_phone
        self.need_address = need_address

        self.response = self._request()

    def _request(self):
        self.base_url = "https://yoomoney.ru/quickpay/confirm.xml?"
        payload = {"receiver": self.receiver,
                   "quickpay_form": self.quickpay_form,
                   "targets": self.targets,
                   "paymentType": self.paymentType,
                   "sum": self.sum}

        if self.formcomment != None:
            payload["formcomment"] = self.formcomment
        if self.shortdest != None:
            payload["short-dest"] = self.shortdest
        if self.label != None:
            payload["label"] = self.label
        if self.successURL != None:
            payload["successURL"] = self.successURL
        if self.need_fio != None:
            payload["need_fio"] = self.need_fio
        if self.need_email != None:
            payload["need_email"] = self.need_email
        if self.need_phone != None:
            payload["need_phone"] = self.need_phone
        if self.need_address != None:
            payload["need_address"] = self.need_address

        for value in payload:
            self.base_url += str(value).replace("_", "-") + "=" + str(
                payload[value])
            self.base_url += "&"
        self.base_url = self.base_url[:-1].replace(" ", "%20")

        response = requests.post(self.base_url)

        self.redirected_url = response.url

        return response


Вот часть кода вьюшки checkout:
# cart check
        cart = Cart.objects.filter(institution=institution,
                                   customer=user)
        if cart.exists():
            cart = cart.first()

            # order create or update
            order, order_created = Order.objects.update_or_create(
                institution=institution, customer=user, cart=cart,
                defaults={"name": name,
                          "phone": phone,
                          "comment": comment,
                          "payment_type": payment_type})

            # payment create or update
            payment, payment_created = Payment.objects.update_or_create(
                institution=institution, user=user, order=order,
                defaults={"total": order.final_price})

            # check if payment type is online by card
            if payment_type == PaymentType.ONLINE:
                if "gateway" not in request.data:
                    return Response({"detail": "Choose your payment gateway"},
                                    status=status.HTTP_400_BAD_REQUEST)
                else:
                    gateway = request.data['gateway']

                payment.type = PaymentType.ONLINE
                payment.status = PaymentStatus.PENDING
                payment.save()

                # if customer choose pay by yoomoney
                # TODO: (yoomoney) localhost заменить из хостов settings
                if gateway == "yoomoney":
                    wallet = institution.user.yoomoney.values_list("wallet", flat=True)[0]
                    if wallet:
                        from apps.payment.services.YooMoney.send_payment import YooMoneyPay
                        client = YooMoneyPay(wallet,
                                             "shop",
                                             order.code,
                                             "AC",
                                             order.final_price,
                                             f"APP: заказ {order.id}",
                                             f"APP: заказ {order.id}",
                                             order.code,
                                             f"http://localhost:8000/api/showcase/{institution.domain}/payment/success?orderId={order.id}&gateway={gateway}")
                        # HttpResponseRedirect
                        return Response({"url": client.redirected_url})


Счет выставляется, я попадаю на страницу оплаты юmoney, успешно оплачиваю, но как в программе потом все это указать не пойму. Я стараюсь написать модуль платежный наподобие как в тильде. Там человек просто указывает свой кошелек и готов принимать платежи.
  • Вопрос задан
  • 634 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы