Files
malenia/tests/send_pally_webhook.py

83 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Симулятор вебхука 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()