Всем привет. Объясните мне как все таки проверить статус оплаты? Я уже всю голову сломал и не пойму логику.
Так вот, насколько я понял, то необязательно авторизовываться и счет можно выставить с помощью 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, успешно оплачиваю, но как в программе потом все это указать не пойму. Я стараюсь написать модуль платежный наподобие как в тильде. Там человек просто указывает свой кошелек и готов принимать платежи.