Пытаюсь сделать интеграцию платежного сервиса. Сейчас на стадии разработки получения callback об успешной оплате.
При подтверждении тестового счета, Получаю ошибку:
INFO: 35.233.203.43:3072 - "POST /callback HTTP/1.1" 422 Unprocessable Entity
Всю документацию уже перерыл.
Воо сам скрипт который обрабатывает callback:
from fastapi import FastAPI, HTTPException, Form
import logging
from app.services.database import Session
from app.models.user_model import User
# Настройка логирования
logging.basicConfig(level=logging.INFO)
api_app = FastAPI()
@api_app.post("/callback")
async def handle_callback(
status: str = Form(...), # Обязательное поле
invoice_id: str = Form(...), # Обязательное поле
amount_crypto: float = Form(...), # Обязательное поле
currency: str = Form(...), # Обязательное поле
order_id: str = Form(...), # Обязательное поле
token: str = Form(...) # Обязательное поле
):
"""
Обработка POST-запросов с Content-Type: x-www-form-urlencoded.
"""
try:
# Логирование входящих данных
logging.info(f"Статус: {status}, Invoice ID: {invoice_id}, Amount Crypto: {amount_crypto}, "
f"Currency: {currency}, Order ID: {order_id}, Token: {token}")
# Проверка обязательных данных
if not all([status, invoice_id, amount_crypto, currency, order_id, token]):
logging.error("Некорректные данные в запросе")
raise HTTPException(status_code=400, detail="Некорректные данные")
# Логика обработки
if status == "success":
logging.info(f"Успешная обработка платежа: Order ID={order_id}, сумма={amount_crypto} {currency}")
else:
logging.warning(f"Платеж со статусом {status} не обработан")
return {"message": f"Платеж со статусом {status} принят, но не обработан"}
return {"message": "Callback обработан успешно"}
except Exception as e:
logging.error(f"Ошибка при обработке callback: {str(e)}")
raise HTTPException(status_code=500, detail="Внутренняя ошибка сервера")
А вот формат который посылает сервер:
{
"status": "success",
"invoice_id": "XXXXXXXX",
"amount_crypto": 100,
"currency": "USDT_TRC20",
"order_id": "order_id",
"token": b"token",
"invoice_info": {
"uuid": "INV-XXXXXXXX",
"created": "2024-08-22 11:49:59.756692",
"address": "address",
"currency": {
"id": 4,
"code": "USDT",
"fullcode": "USDT_TRC20",
"network": {
"code": "TRC20",
"id": 4,
"icon": "https://cdn.cryptocloud.plus/currency/crypto/TRX.svg",
"fullname": "Tron"
},
"name": "Tether",
"is_email_required": false,
"stablecoin": true,
"icon_base": "https://cdn.cryptocloud.plus/currency/icons/main/usdt.svg",
"icon_network": "https://cdn.cryptocloud.plus/icons-currency/USDT-TRC20.svg",
"icon_qr": "https://cdn.cryptocloud.plus/currency/icons/stroke/usdt.svg",
"order": 1
},
"date_finished": "2024-08-22 11:51:53.753528",
"expiry_date": "2024-08-23 11:49:59.746385",
"side_commission": "client",
"type_payments": "crypto",
"amount": 100,
"amount_": 100,
"status": "overpaid",
"invoice_status": "success",
"is_email_required": false,
"project": {
"id": 0,
"name": "My Project",
"fail": "",
"success": "",
"logo": ""
},
"tx_list": [
""
],
"amount_in_crypto": null,
"amount_in_fiat": 0.0,
"amount_usd": 100.0,
"amount_to_pay": 102.0,
"amount_to_pay_usd": 102.0,
"amount_paid": 102.0,
"amount_paid_usd": 102.0,
"fee": 1.4,
"fee_usd": 1.4,
"service_fee": 0.8048,
"service_fee_usd": 0.8,
"received": 99.7952,
"received_usd": 99.8,
"to_surcharge": 0.0,
"to_surcharge_usd": 0.0,
"total_rub": 0,
"step": 3,
"test_mode": false,
"type": "up",
"aml_enabled": false,
"aml_side": "merchant",
"aml_checks": [],
"links_invoice": null
}
}