Files
malenia/tests/send_pally_webhook.py

82 lines
2.8 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"]
# Корректные поля согласно документации 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()