""" Симулятор вебхука 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", "UNDERPAID", "OVERPAID"], help="Статус платежа (по умолчанию SUCCESS)", ) args = parser.parse_args() pally_token = os.environ["PALLY_TOKEN"] # Корректные поля согласно документации pally.info inv_id = f"payment-{args.bill_id}" # InvId - идентификатор платежа trs_id = f"LXZv3R{args.bill_id}" # TrsId - уникальный идентификатор счета currency = "RUB" custom = str(args.bill_id) # custom field содержит ID счета в нашей БД commission = "0.00" # Комиссия # ИСПРАВЛЕНО: используем inv_id вместо payment_id для сигнатуры signature = calculate_signature( str(args.amount), inv_id, pally_token ) # ИСПРАВЛЕНО: используем правильные имена полей согласно документации payload = { "InvId": inv_id, "OutSum": str(args.amount), "Commission": commission, "TrsId": trs_id, "Status": args.status, "CurrencyIn": currency, "custom": custom, "SignatureValue": 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()