Тинькофф оплата по ссылке в телеграмм боте. Как получить оповещения о статусе оплаты? Python
Бот создает ссылку на оплату, оплата работает. Но каим образом получить информацию, что оплата прошла успешно? Задавал вопрос в поддержку, получил ссылку от поддержки тинькофф Знаний не хватает. Вопросы:
- Необходимо вновь отправить запрос к API для получения статуса платежа? сколько запросов и как часто? или
- Тинькофф сам отправляет ответ?, остается его получить и прочитать?
- В настройках терминала Тинькофф есть возможность указать адрес для отправки уведомлений по протоколу HTTP. можно ли это использовать для получения статуса оплаты?
в документации еще сказано, что необходимо после получения статуса платежа отправить ответ, иначе Тинькофф так и будет периодически отправлять статус.
Нужны подсказки, объяснения. Спасибо.
# ===== Создание платежа через Tinkoff API. ==================
async def create_tinkoff_payment(amount: int, order_id: str, description: str) -> str:
async with httpx.AsyncClient() as client:
load_dotenv()
TINKOFF_TERMINAL_KEY = os.getenv("TINKOFF_TERMINAL_KEY")
TINKOFF_API_URL = os.getenv("TINKOFF_API_URL")
payload = {
"TerminalKey": TINKOFF_TERMINAL_KEY,
"Amount": amount * 100, # Tinkoff ожидает сумму в копейках
"OrderId": order_id,
"Description": description,
}
payload["Token"] = generate_tinkoff_token(payload)
# Логирование отправляемого запроса
# print("Отправляемый запрос:", payload)
response = await client.post(TINKOFF_API_URL, json=payload)
response_data = response.json()
# Логирование ответа от Tinkoff
print("Ответ от Tinkoff: ", response)
print("Ответ от Tinkoff: ", response_data)
if response_data.get("Success"):
# print(f'переброс в функцию pay_ok')
# print(f'ответ Т-БАНКА: ', response_data)
return response_data["PaymentURL"]
else:
raise Exception(
f"Ошибка при создании платежа: {response_data.get('Message'), response_data.get('Details')}")
# ================ Генерация токена для Tinkoff API. ==============
def generate_tinkoff_token(payload: dict) -> str:
load_dotenv()
TINKOFF_SECRET_KEY = os.getenv("TINKOFF_SECRET_KEY")
token_str = (
f"{payload['Amount']}{payload['Description']}{payload['OrderId']}"
f"{TINKOFF_SECRET_KEY}{payload['TerminalKey']}")
return hashlib.sha256(token_str.encode("utf-8")).hexdigest()
Вот так создаю ссылку на оплату (код взял на этом же сайте)
Ответы (1 шт):
Автор решения: dazimir
→ Ссылка
Удалось. пока сыровато.
- Мерчант должен добавлять токен к каждому запросу, где это требуется. Token для запроса генерируем новый (не тот который генерировали для получения ссылки на оплату) из Json данных ссылки берем PaymentId
- для генерации токена последовательность параметров {TINKOFF_SECRET_KEY}{PaymentId}{TerminalKey}
- создаю запрос на https://securepay.tinkoff.ru/v2/GetState {TerminalKey, PaymentId, Token}
- в ответе на запрос получаем Status (NEW - новый, FORM_SHOWED - открывалась страница оплаты, CONFIRMED - оплата поступила, REJECTED - Оплата не прошла)