""" Симулятор вебхука Pally для локального тестирования. Использование: python tests/send_test_webhook.py --user-id 123456789 --amount 300 --bill-id 1 Предварительно: - API должен быть запущен: uvicorn api.main:app --port 8000 - Пользователь с --user-id должен существовать в БД - Счёт с --bill-id должен существовать в БД и принадлежать этому пользователю """ import argparse import hashlib import os import httpx from dotenv import load_dotenv load_dotenv() ENDPOINT = "/pally/result" def calculate_signature( out_sum: str, inv_id: str, pally_token: str, ) -> str: raw = f"{out_sum}:{inv_id}:{pally_token}" return hashlib.md5(raw.encode()).hexdigest().upper() def main(): parser = argparse.ArgumentParser() parser.add_argument("--user-id", type=int, required=True) parser.add_argument("--amount", type=int, required=True) parser.add_argument("--bill-id", type=int, required=True) parser.add_argument("--host", default="http://127.0.0.1:8000") parser.add_argument( "--status", default="SUCCESS", choices=["SUCCESS", "FAIL", "PROCESS"], help="Статус платежа (по умолчанию SUCCESS)", ) args = parser.parse_args() pally_token = os.environ["PALLY_TOKEN"] # Эти поля могут быть любыми строками — вебхук их не использует содержательно, # только включает в подпись. Главное чтобы совпадали с тем, что пойдёт в подпись. payment_id = "test_payment_001" bill_id = f"test_bill_{args.bill_id}" currency = "RUB" order_id = str(args.bill_id) # order_id == id счёта в нашей БД signature = calculate_signature( payment_id, args.status, str(args.amount), currency, order_id, pally_token ) payload = { "id": payment_id, "bill_id": bill_id, "status": args.status, "req_amount": str(args.amount), "currency": currency, "order_id": order_id, "signature": signature, } print(f"{args.host}{ENDPOINT}") print(f"Отправляю вебхук: {payload}\n") response = httpx.post(f"{args.host}{ENDPOINT}", data=payload) print(f"Статус ответа: {response.status_code}") print(f"Тело ответа: {response.text}") if __name__ == "__main__": main()