Тинькофф оплата по ссылке в телеграмм боте. Как получить оповещения о статусе оплаты? Python

Бот создает ссылку на оплату, оплата работает. Но каим образом получить информацию, что оплата прошла успешно? Задавал вопрос в поддержку, получил ссылку от поддержки тинькофф Знаний не хватает. Вопросы:

  1. Необходимо вновь отправить запрос к API для получения статуса платежа? сколько запросов и как часто? или
  2. Тинькофф сам отправляет ответ?, остается его получить и прочитать?
  3. В настройках терминала Тинькофф есть возможность указать адрес для отправки уведомлений по протоколу 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

Удалось. пока сыровато.

  1. Мерчант должен добавлять токен к каждому запросу, где это требуется. Token для запроса генерируем новый (не тот который генерировали для получения ссылки на оплату) из Json данных ссылки берем PaymentId
  2. для генерации токена последовательность параметров {TINKOFF_SECRET_KEY}{PaymentId}{TerminalKey}
  3. создаю запрос на https://securepay.tinkoff.ru/v2/GetState {TerminalKey, PaymentId, Token}
  4. в ответе на запрос получаем Status (NEW - новый, FORM_SHOWED - открывалась страница оплаты, CONFIRMED - оплата поступила, REJECTED - Оплата не прошла)
→ Ссылка