76 lines
2.2 KiB
Python
76 lines
2.2 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"]
|
||
|
||
inv_id = str(args.bill_id)
|
||
out_sum = str(args.amount)
|
||
trs_id = f"test_trs_{args.bill_id}"
|
||
currency = "RUB"
|
||
|
||
signature = calculate_signature(out_sum, inv_id, pally_token)
|
||
|
||
payload = {
|
||
"InvId": inv_id,
|
||
"OutSum": out_sum,
|
||
"Commission": "0",
|
||
"TrsId": trs_id,
|
||
"Status": args.status,
|
||
"CurrencyIn": currency,
|
||
"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()
|