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