79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
"""
|
||
Симулятор вебхука 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()
|