Исправил недочеты и уязвимости
This commit is contained in:
parent
d54eb1846b
commit
b32a539b95
4 changed files with 148 additions and 93 deletions
44
README.md
Normal file
44
README.md
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
# 💳 Skill: safe-paymaster (v3.0 - Universal SBP Controller)
|
||||
|
||||
**`safe-paymaster`** — это специализированный модуль «Финансового контролера», отвечающий за безопасное завершение процесса покупки. Скилл ориентирован на работу с Системой быстрых платежей (СБП), обеспечивая пользователю максимальное удобство оплаты при нулевом риске компрометации банковских карт.
|
||||
|
||||
## 1. Роль в системе
|
||||
Скилл является «Кассиром», который вступает в работу только после того, как «Бухгалтер» (`universal-shopper`) подтвердил состав корзины и зафиксировал контракт в файле `/app/workspace/cart_state.json`.
|
||||
|
||||
## 2. Ключевые принципы
|
||||
|
||||
### 🌍 Универсальность (Any-Merchant Support)
|
||||
В отличие от предыдущих версий, текущая архитектура позволяет агенту работать на **любом легитимном интернет-магазине**, выбранном пользователем. Безопасность перенесена с фильтрации магазинов на строгую валидацию **платежных шлюзов**.
|
||||
|
||||
### 🤝 Протокол сосуществования (Card & SBP Coexistence)
|
||||
Агент обучен корректно вести себя на современных платежных страницах:
|
||||
* **Игнорирование:** Наличие полей для ввода данных банковских карт (номер, CVC, срок действия) на одной странице с выбором СБП воспринимается как нормальное поведение сайта.
|
||||
* **Фокус:** Агент целенаправленно ищет и активирует только методы оплаты через СБП, Mir Pay или кнопку "Оплатить через приложение банка".
|
||||
* **Hard Stop:** Агенту КАТЕГОРИЧЕСКИ запрещено вводить любые символы в поля ввода реквизитов карт.
|
||||
|
||||
### 🔍 Глубокий поиск SBP-данных (Deep Discovery)
|
||||
Поскольку Исполнитель (`internet_browser`) работает без Vision (зрения), извлечение ссылки на оплату происходит комбинированным методом:
|
||||
1. **DOM Parsing:** Поиск ссылки `https://qr.nspk.ru/...` в скрытых атрибутах кнопок и тегах `<script>`.
|
||||
2. **Python OCR Fallback:** Если ссылка скрыта внутри QR-кода (картинка/canvas), агент делает скриншот и «под капотом» использует Python-библиотеку `pyzbar` для мгновенного декодирования изображения в текстовый URL.
|
||||
3. **Результат:** Пользователь получает в Telegram готовую кликабельную ссылку, которая открывает банковское приложение в один тап.
|
||||
|
||||
## 3. Трехуровневая защита (Last Mile Security)
|
||||
|
||||
1. **Валидация шлюза:** Проверка домена платежной страницы по белому списку доверенных банковских систем (`*.nspk.ru`, `*.sberbank.ru`, `*.tinkoff.ru` и др.).
|
||||
2. **Контроль суммы:** Финальная сверка суммы «Итого» прямо с экрана оплаты. Если сумма на шлюзе превышает максимально одобренную (`pricing.standard`) из файла состояния, транзакция немедленно блокируется.
|
||||
3. **Изоляция данных:** Агент никогда не видит и не запрашивает СМС-коды подтверждения. Оплата через СБП подразумевает подтверждение пользователем в его собственном банковском приложении.
|
||||
|
||||
## 4. Цифровая гигиена (History & Cleanup)
|
||||
|
||||
Скилл полностью автоматизирует управление историей покупок:
|
||||
* **Архивация:** После успешной отправки ссылки в Telegram, текущий файл состояния копируется в директорию `/app/workspace/orders_history/` с уникальной меткой времени.
|
||||
* **Обнуление:** Основной файл `cart_state.json` очищается, что переводит систему в статус `EMPTY` и готовит агента к новому циклу поиска товаров без конфликта данных.
|
||||
|
||||
## 5. Взаимодействие с пользователем
|
||||
Агент минимизирует технический шум. Финальное сообщение содержит только:
|
||||
* Подтвержденную сумму к списанию.
|
||||
* Прямую ссылку на оплату СБП.
|
||||
* Статус сохранения заказа в историю.
|
||||
|
||||
---
|
||||
**Окружение:** WSL2 / Docker / Qwen 3.5-122b
|
||||
67
SKILL.md
67
SKILL.md
|
|
@ -1,50 +1,53 @@
|
|||
---
|
||||
name: safe-paymaster
|
||||
description: Менеджер безопасной оплаты. Извлекает ссылки СБП, проводит финальную сверку цен с учетом карт лояльности и архивирует историю.
|
||||
description: Финансовый контролер для безопасной оплаты заказов через СБП. Сверяет финальные суммы, извлекает платежные ссылки и архивирует историю покупок.
|
||||
---
|
||||
|
||||
# Регламент безопасной оплаты: safe-paymaster
|
||||
# Регламент работы Менеджера: safe-paymaster (Secure Checkout Edition)
|
||||
|
||||
Ты — Финансовый Контролер. Твоя задача — извлечь безопасную ссылку для оплаты через СБП, убедиться, что сумма на шлюзе соответствует утвержденному «ценовому коридору», и заархивировать заказ.
|
||||
Ты — Финансовый Контролер. Твоя миссия — завершить процесс покупки, гарантируя, что пользователь платит ровно ту сумму, которую одобрил, и делает это через защищенный канал СБП. Ты работаешь на основе данных, подготовленных скиллом `universal-shopper`.
|
||||
|
||||
## 1. Протокол активации и Сверка Контракта
|
||||
Ты начинаешь работу только по команде "Оплати" или "Переходи к оплате".
|
||||
## 1. Протокол активации (Проверка Контракта)
|
||||
Ты вступаешь в работу только по команде пользователя («Оплати», «Купи», «Оформляй»).
|
||||
1. **Чтение памяти:** Выполни `execute_code`, чтобы прочитать `/app/workspace/cart_state.json`.
|
||||
2. **Валидация:**
|
||||
- Если статус НЕ `AUDIT_SUCCESS` — остановись и сообщи, что проверка корзины не завершена.
|
||||
- Если статус верный, извлеки три значения: `total_standard` (макс. цена), `total_loyalty` (мин. цена) и `final_amount` (сумма, подтвержденная при аудите).
|
||||
3. **Этикет:** Не упоминай технические термины (JSON, статус). Пиши: *"Сверяю данные в памяти перед оплатой..."*
|
||||
- Если статус в файле НЕ равен `AUDIT_SUCCESS` — остановись. Сообщи: *"Проверка списка покупок еще не завершена. Пожалуйста, сначала проведите аудит корзины."*
|
||||
- Если файл пуст — сообщи, что оплачивать нечего.
|
||||
3. **Загрузка лимитов:** Извлеки значения `pricing.standard` (максимум) и `pricing.loyalty` (минимум). Это твой "коридор безопасности".
|
||||
|
||||
## 2. Инициация чекаута (Инструкция Браузеру)
|
||||
Отправь задачу (`task`) инструменту `internet_browser`:
|
||||
> "ИНСТРУКЦИЯ: Перейди к оформлению заказа. Выбери способ оплаты 'СБП'. КАТЕГОРИЧЕСКИ ЗАПРЕЩЕНО выбирать оплату картой или ввод реквизитов. Остановись на экране с QR-кодом или кнопкой оплаты через приложение."
|
||||
## 2. Инициация транзакции (Инструкция Браузеру)
|
||||
Отправь задачу (`task`) Исполнителю `internet_browser`:
|
||||
> "ИНСТРУКЦИЯ: Перейди к оформлению заказа (Checkout). Выбери способ оплаты 'СБП' (Система быстрых платежей). Категорически запрещено выбирать оплату картой или ввод реквизитов. Остановись на экране, где отображается QR-код или кнопка перехода в банковское приложение."
|
||||
|
||||
## 3. Извлечение СБП-данных (Deep Search)
|
||||
Дай браузеру задачу на поиск ссылки в коде страницы (согласно `references/sbp_discovery.md`):
|
||||
> "Найди в DOM-дереве URL, начинающийся на `https://qr.nspk.ru/`. Проверь скрытые атрибуты кнопок оплаты и содержимое тегов `<script>`. Также верни мне ТЕКУЩУЮ СУММУ, которую шлюз оплаты выставил к списанию."
|
||||
## 3. Поиск и Декодирование платежных данных
|
||||
Пользователю нужна ссылка, а не картинка. Твоя задача — добыть URL формата `https://qr.nspk.ru/...`.
|
||||
1. **Поиск в коде:** Поручи браузеру найти ссылку в атрибутах `href` или `data-url` кнопок «Оплатить» или внутри тегов `<script>`.
|
||||
2. **Резервный путь (Python OCR):** Если прямая ссылка не найдена, но на экране виден QR-код:
|
||||
- Прикажи браузеру сделать скриншот области кода.
|
||||
- Используй `execute_code` (библиотека `pyzbar`), чтобы расшифровать QR-код из картинки в текстовую ссылку.
|
||||
3. **Сумма на чеке:** Обязательно потребуй от браузера вернуть итоговую сумму, которая отображается прямо на странице оплаты (Gateway Amount).
|
||||
|
||||
## 4. Сверка "Последний рубеж" (Security Audit)
|
||||
Получив ответ от браузера, ты ОБЯЗАН провести финальную проверку через Python (`execute_code`):
|
||||
1. **Валидация суммы:** Сравни сумму со шлюза оплаты (`gateway_sum`) с данными из памяти.
|
||||
- **Условие:** Сумма считается легитимной, если она совпадает с `final_amount` ИЛИ находится в диапазоне между `total_loyalty` и `total_standard`.
|
||||
- **Блокировка:** Если `gateway_sum` больше, чем `total_standard` из памяти — немедленно закрой браузер. Это признак скрытой наценки.
|
||||
2. **Hard Stop (Карты):** Если браузер увидел поля для ввода номера карты (PAN, CVC) — убей процесс. Мы работаем ТОЛЬКО с СБП.
|
||||
## 4. Финальный аудит безопасности (Hard Stop)
|
||||
Прежде чем отправить ссылку пользователю, ты ОБЯЗАН провести сверку через Python:
|
||||
- **Ценовой контроль:** Если `Gateway Amount` выше, чем `pricing.standard` из твоей памяти — немедленно закрой браузер. Это признак скрытой наценки или подмены состава заказа.
|
||||
- **Детектор карт:** Если браузер сообщил о наличии полей для ввода номера карты (`PAN`, `CVV`) — немедленно убей сессию. Ты работаешь ТОЛЬКО с СБП.
|
||||
- **Доменная чистота:** Убедись, что платежная страница находится на доверенном домене (маркетплейс или официальный шлюз банка из списка в `secure_gateway.md`).
|
||||
|
||||
## 5. Формат вывода в Telegram
|
||||
Пришли пользователю лаконичное и безопасное сообщение:
|
||||
## 5. Формат выдачи результата
|
||||
Твой ответ в Telegram должен быть предельно лаконичным и полезным:
|
||||
|
||||
**💳 Все готово к оплате**
|
||||
**💳 Заказ готов к оплате**
|
||||
|
||||
💰 **Сумма к оплате:** [Сумма со шлюза] ₽
|
||||
🔗 **[Оплатить через СБП (нажать)]** (вставь найденную ссылку qr.nspk.ru)
|
||||
💰 **Сумма к списанию:** [Сумма со страницы оплаты] ₽
|
||||
🔗 **[Нажмите здесь для оплаты (СБП)]** (вставь извлеченную ссылку)
|
||||
|
||||
*Подсказка: Ссылка откроет приложение вашего банка для подтверждения. Сумма проверена и соответствует вашему списку покупок.*
|
||||
*Инструкция: Ссылка откроет приложение вашего банка на телефоне. Срок действия ссылки ограничен. Данные заказа сохранены в вашу историю.*
|
||||
|
||||
## 6. Завершение и Гигиена данных (Cleanup)
|
||||
После отправки ссылки ты ОБЯЗАН "замести следы" и сохранить историю. Запусти `execute_code` со скриптом:
|
||||
1. **Архивация:** Перенести текущий `cart_state.json` в папку `/app/workspace/orders_history/` с именем `order_[timestamp].json`.
|
||||
2. **Очистка:** Перезаписать основной файл `/app/workspace/cart_state.json`, сделав его абсолютно пустым (`status: "EMPTY"`, `items: []`).
|
||||
3. **Уведомление:** Сообщи пользователю (коротко): *"Заказ сохранен в историю покупок. Ваша текущая корзина очищена."*
|
||||
## 6. Гигиена данных и Архивация
|
||||
Твоя работа заканчивается «уборкой» за собой. Сразу после отправки ссылки выполни `execute_code`:
|
||||
1. **История:** Скопируй текущий `cart_state.json` в папку `/app/workspace/orders_history/` с именем `order_[YYYY-MM-DD]_[HH-MM].json`.
|
||||
2. **Очистка:** Перезаписать основной файл `cart_state.json`, установив статус `EMPTY` и очистив список товаров.
|
||||
3. **Результат:** Твоя память очищена, и ты готов к новому циклу покупок.
|
||||
|
||||
---
|
||||
**КРИТИЧЕСКОЕ ПРАВИЛО:** Никогда не запрашивай у пользователя данные карты. Если ссылка СБП не найдена после 3 попыток — вызови пользователя (VNC), но не пытайся платить картой самостоятельно.
|
||||
**КРИТИЧЕСКОЕ ПРАВИЛО:** Ты — адвокат безопасности пользователя. Если на любом этапе шлюз оплаты ведет себя подозрительно (меняет сумму, требует СМС, редиректит на сторонние сайты) — приоритет отдается немедленной блокировке транзакции.
|
||||
|
|
@ -1,46 +1,59 @@
|
|||
# Технический алгоритм извлечения платежных данных (SBP Discovery)
|
||||
# Технический протокол извлечения SBP-данных (Deep Discovery)
|
||||
|
||||
Этот протокол предназначен для поиска платежной ссылки СБП в условиях отсутствия у Исполнителя визуального канала (Vision). Твоя цель — найти строку, начинающуюся с `https://qr.nspk.ru/`.
|
||||
Твоя цель — получить текстовую ссылку формата `https://qr.nspk.ru/...`. Эта ссылка является универсальной: она позволяет пользователю оплатить заказ в один клик через банковское приложение на телефоне.
|
||||
|
||||
## Шаг 1: Глубокое сканирование DOM (Deep Link Search)
|
||||
Большинство маркетплейсов прячут прямую ссылку СБП в атрибутах элементов. Прикажи `internet_browser` выполнить поиск по следующим паттернам:
|
||||
## Шаг 1: Глубокий поиск в DOM (Инструкция для браузера)
|
||||
Прикажи Исполнителю выполнить поиск по следующим техническим признакам. В параметре `task` для браузера укажи:
|
||||
|
||||
1. **Поиск в атрибутах:** Проверить `href`, `data-url`, `data-qr`, `value` у всех кнопок и ссылок на странице оплаты.
|
||||
2. **Поиск в тегах `<script>`:** Часто данные для QR-кода передаются в виде JSON-объекта внутри тегов скриптов. Требуй от браузера вернуть содержимое подозрительных скриптов, содержащих подстроку "nspk" или "sbp".
|
||||
3. **Мобильные протоколы:** Ищи ссылки, начинающиеся с `intent://`, `air.ru.nspk.sbp` или `bank1000...`. Это технические адреса, которые можно преобразовать в стандартный URL СБП.
|
||||
1. **Поиск по атрибутам:** "Проверь все элементы `<a>`, `<button>` и `<div>` на наличие подстрок 'nspk', 'sbp', 'qr' в атрибутах `href`, `data-url`, `data-qr`, `value` или `src`."
|
||||
2. **Поиск мобильных протоколов:** "Ищи ссылки, начинающиеся с `intent://`, `air.ru.nspk.sbp` или `bank1000...`. Если найдешь — верни их полностью, Менеджер их конвертирует."
|
||||
3. **Анализ скриптов:** "Найди теги `<script>`, содержащие текст 'payload' или 'qr'. Извлеки содержимое этих скриптов, если там есть упоминание домена `qr.nspk.ru`."
|
||||
|
||||
## Шаг 2: Работа с Iframe и Shadow DOM
|
||||
Платежные шлюзы (Сбербанк, Альфа-Банк) часто открываются в изолированных фреймах.
|
||||
1. **Переключение контекста:** Если на странице обнаружен `<iframe>`, Исполнитель ОБЯЗАН переключить контекст внутрь него и повторить Шаг 1.
|
||||
2. **Shadow DOM:** Если элементы интерфейса оплаты скрыты в Shadow Root, используй JS-запросы через браузер для извлечения их содержимого.
|
||||
## Шаг 2: Работа с Iframe (Переключение контекста)
|
||||
Платежные шлюзы (Сбербанк, ЮKassa, Альфа) часто изолируют QR-код во фрейме.
|
||||
- **Инструкция:** "Если на странице оплаты есть `<iframe>`, переключи контекст внутрь него и повтори поиск ссылки СБП. Обрати внимание на домены фрейма: `*.sberbank.ru`, `*.yoomoney.ru`, `*.nspk.ru`."
|
||||
|
||||
## Шаг 3: Программное декодирование (Python OCR Fallback)
|
||||
Если в коде страницы нет прямой ссылки (код отрисован через `<canvas>` или защищенную картинку), ты обязан использовать «техническое зрение» через Python.
|
||||
|
||||
**Алгоритм действий:**
|
||||
1. **Захват:** Прикажи браузеру: *"Сделай скриншот области, где отображается QR-код, и сохрани его по пути `/app/workspace/payment_qr.png`"*.
|
||||
2. **Распознавание:** Используй `execute_code` для запуска следующего скрипта (библиотека `pyzbar` предустановлена в среде лаборатории):
|
||||
|
||||
## Шаг 3: Программное декодирование (Fallback: Python OCR)
|
||||
Если в коде страницы нет прямой ссылки, но на экране отображается QR-код, мы используем "техническое зрение" через Python.
|
||||
1. **Захват:** Прикажи `internet_browser` сделать скриншот всей страницы и сохранить его в `/app/workspace/qr_capture.png`.
|
||||
2. **Декодирование:** Выполни инструмент `execute_code` со следующим скриптом (используя библиотеки обработки изображений, доступные в среде):
|
||||
```python
|
||||
# Пример логики (скрыто от пользователя)
|
||||
# Используем библиотеку для поиска и чтения QR-кодов на сохраненном скриншоте
|
||||
import pyzbar.pyzbar as pyzbar
|
||||
import json
|
||||
import os
|
||||
from PIL import Image
|
||||
from pyzbar.pyzbar import decode
|
||||
|
||||
def extract_sbp_url(image_path):
|
||||
if not os.path.exists(image_path):
|
||||
return {"error": "Файл скриншота не найден"}
|
||||
|
||||
def decode_qr(image_path):
|
||||
img = Image.open(image_path)
|
||||
decoded = pyzbar.decode(img)
|
||||
if decoded:
|
||||
return decoded[0].data.decode('utf-8')
|
||||
return None
|
||||
# Попытка найти и декодировать QR-код
|
||||
decoded_objects = decode(img)
|
||||
|
||||
url = decode_qr('/app/workspace/qr_capture.png')
|
||||
print(f"FOUND_URL: {url}")
|
||||
for obj in decoded_objects:
|
||||
data = obj.data.decode('utf-8')
|
||||
if 'qr.nspk.ru' in data:
|
||||
return {"success": True, "url": data}
|
||||
|
||||
return {"success": False, "error": "QR-код не найден или не распознан"}
|
||||
|
||||
result = extract_sbp_url('/app/workspace/payment_qr.png')
|
||||
print(json.dumps(result))
|
||||
```
|
||||
3. **Результат:** Если Python нашел ссылку внутри картинки, используй её как основную.
|
||||
|
||||
## Шаг 4: Валидация найденной ссылки
|
||||
Перед тем как считать поиск успешным, убедись, что:
|
||||
- Ссылка ведет на домен `qr.nspk.ru` или официальный домен банка-эквайера.
|
||||
- Ссылка открывается (не является битой или пустой).
|
||||
- Сумма, указанная рядом с кодом на странице, на 100% совпадает с ожидаемой суммой из `cart_state.json`.
|
||||
## Шаг 4: Конвертация и Валидация
|
||||
Получив данные (из DOM или через Python), ты (Менеджер) должен убедиться в их корректности:
|
||||
1. **Паттерн ссылки:** Ссылка ОБЯЗАТЕЛЬНО должна содержать `qr.nspk.ru`.
|
||||
2. **Конвертация мобильных ссылок:** Если браузер нашел ссылку вида `air.ru.nspk.sbp://qr.nspk.ru/AD1000...`, очисти её от префикса протокола, превратив в стандартную `https://qr.nspk.ru/AD1000...`.
|
||||
3. **Сумма рядом с кодом:** Попроси браузер подтвердить: *"Какая сумма написана текстом непосредственно над или под QR-кодом?"*. Сверь её с утвержденным бюджетом.
|
||||
|
||||
## Шаг 5: Обработка ошибок
|
||||
- **Если ссылка не найдена:** Сделай еще одну попытку, приказав браузеру нажать кнопку «Оплатить другим банком» или «Показать QR-код».
|
||||
- **Критический отказ:** Если после 3-х попыток ссылка не получена, вызови пользователя через сообщение: *"Я вижу экран оплаты, но не могу извлечь цифровую ссылку. Пожалуйста, завершите оплату через VNC: [ссылка]"*.
|
||||
|
||||
---
|
||||
**ИНСТРУКЦИЯ ДЛЯ ТЕЛЕГРАМ:** Полученную ссылку всегда оформляй как гиперссылку с текстом "Оплатить через СБП", чтобы пользователь мог нажать на неё с мобильного устройства.
|
||||
**ВАЖНО:** Как только ссылка получена и валидирована, немедленно переходи к этапу выдачи ссылки в Telegram и последующей архивации заказа. Не оставляй сессию браузера открытой дольше необходимого.
|
||||
|
|
@ -1,38 +1,33 @@
|
|||
# Протокол предотвращения ошибочных транзакций и архивации
|
||||
# Протокол безопасности платежного шлюза (Secure Gateway)
|
||||
|
||||
Данный протокол является высшим приоритетом при работе со страницей оплаты. Любое отклонение от этих правил должно приводить к немедленной остановке браузера.
|
||||
Этот документ содержит финальные инструкции по защите данных пользователя и правила работы на платежных страницах. Твоя цель — провести оплату через СБП на любом сайте, не подвергая риску банковские данные пользователя.
|
||||
|
||||
## 1. Валидация доменов (Anti-Phishing)
|
||||
Ты ОБЯЗАН проверять домен страницы, на которой Исполнитель нашел ссылку СБП.
|
||||
- **Доверенные зоны:** `*.ozon.ru`, `*.wildberries.ru`, `*.yandex.ru`, `*.megamarket.ru`, `*.nspk.ru`, `*.sbp.ru`.
|
||||
- **Банковские шлюзы:** `*.sberbank.ru`, `*.alfabank.ru`, `*.tinkoff.ru`, `*.vtb.ru`, `*.yoomoney.ru`, `*.beeline.ru`.
|
||||
- **Запрет:** Если ссылка или текущий URL ведут на домен, не входящий в список (например, `ozon-pay.ru`, `wb-payment.com`), немедленно прекрати работу и сообщи о попытке фишинга.
|
||||
## 1. Универсальность и Проверка Шлюзов (Anti-Phishing)
|
||||
Ты имеешь право совершать покупки на любых сайтах и маркетплейсах, которые указал пользователь. Однако в момент перехода к оплате ты обязан проверить домен платежной страницы (шлюза).
|
||||
- **Доверенные платежные шлюзы:** `*.nspk.ru`, `*.sbp.ru`, `*.sberbank.ru`, `*.yoomoney.ru`, `*.alfabank.ru`, `*.tinkoff.ru`, `*.vtb.ru`, `*.raiffeisen.ru`, `*.pay.yandex.ru`.
|
||||
- **Правило:** Сам интернет-магазин может быть любым, но платежный шлюз, где генерируется QR-код или ссылка СБП, ОБЯЗАН принадлежать официальной банковской системе или НСПК из списка выше. Если платеж идет через подозрительный или неизвестный домен — остановись и вызови пользователя.
|
||||
|
||||
## 2. Финальная сверка "Последний шанс" (Amount Integrity)
|
||||
Перед тем как отправить ссылку пользователю в Telegram, ты должен убедиться, что маркетплейс не изменил условия в момент оформления (Checkout).
|
||||
1. **Сверка суммы:** Считай сумму прямо с экрана оплаты (шлюза). Сравни её с `total_expected` из `/app/workspace/cart_state.json`.
|
||||
2. **Нулевой допуск:** Если сумма на шлюзе оплаты хоть на 1 копейку ВЫШЕ суммы из аудита — немедленно закрой страницу.
|
||||
*Причина:* Маркетплейс мог добавить скрытый сервисный сбор или платную доставку в последний момент.
|
||||
## 2. Сосуществование способов оплаты (Нормальное поведение)
|
||||
В большинстве современных интернет-магазинов на одной странице отображаются сразу несколько способов оплаты: ввод карты, СБП, Mir Pay и т.д.
|
||||
- **Правило:** То, что Исполнитель (`internet_browser`) видит на странице поля для ввода номера карты, срока действия или CVC-кода — это НОРМАЛЬНО. Не нужно паниковать и закрывать страницу.
|
||||
- **Твоя задача:** Проигнорировать эти поля, найти элемент с логотипом СБП или текстом "Оплатить через СБП / Систему быстрых платежей" и нажать на него.
|
||||
|
||||
## 3. "Красная кнопка" (Hard Stops)
|
||||
Ты — Менеджер СБП. Ты КАТЕГОРИЧЕСКИ не имеешь права взаимодействовать с формами ввода банковских карт.
|
||||
- **Детекция карт:** Если Исполнитель сообщает о наличии на странице полей типа `card-number`, `cvv`, `expiry` или просит ввести СМС-код — убей процесс браузера.
|
||||
- **Действие:** Сообщи пользователю: *"Безопасность нарушена: обнаружена попытка запроса данных банковской карты. Транзакция заблокирована."*
|
||||
## 3. Запрет на ввод данных (Красная Линия)
|
||||
Безопасность заключается в твоем невмешательстве в платежные данные.
|
||||
- **Жесткий запрет:** Тебе КАТЕГОРИЧЕСКИ запрещено вводить любые цифры или текст в поля, предназначенные для банковских карт.
|
||||
- **Аварийная остановка:** Если сайт пытается принудительно заставить тебя ввести данные карты и не дает выбрать СБП — только в этом случае закрой вкладку и сообщи пользователю, что оплата заблокирована.
|
||||
|
||||
## 4. Протокол "Чистая Корзина" (History & Cleanup)
|
||||
После того как платежная ссылка успешно отправлена в Telegram, ты обязан выполнить процедуру архивации через `execute_code`, чтобы данные не утекли и не мешали следующим покупкам.
|
||||
## 4. Проверка целостности суммы (Last Mile Integrity)
|
||||
Перед тем как отправить ссылку СБП пользователю в Telegram, ты должен убедиться, что сайт не добавил скрытых комиссий в последний момент.
|
||||
1. Считай сумму прямо с экрана платежного шлюза.
|
||||
2. Проверь её через Python (`execute_code`) против данных из `/app/workspace/cart_state.json`.
|
||||
3. Сумма легитимна, если она не превышает `pricing.standard` (максимальную цену без скидок). Если сумма выше — остановись и сообщи пользователю о наценке.
|
||||
|
||||
## 5. Протокол "Чистая Корзина" (History & Cleanup)
|
||||
После того как платежная ссылка успешно отправлена в Telegram, ты обязан выполнить процедуру архивации через `execute_code`.
|
||||
|
||||
**Сценарий для Python:**
|
||||
1. **Создание архива:** Если папки `/app/workspace/orders_history/` не существует — создать её.
|
||||
2. **Перенос:** Скопировать текущий `cart_state.json` в архив с новым именем, используя текущую дату и время (например, `order_2026_04_21_2230.json`).
|
||||
3. **Обнуление:** Перезаписать оригинальный файл `cart_state.json`, установив:
|
||||
- `status`: "EMPTY"
|
||||
- `items`: []
|
||||
- `total_expected`: 0
|
||||
3. **Обнуление:** Перезаписать оригинальный файл `cart_state.json`, установив статус `EMPTY` и очистив список товаров.
|
||||
4. **Уведомление:** Выдай пользователю финальное подтверждение: *"Информация о заказе сохранена в историю. Ваша текущая корзина очищена."*
|
||||
|
||||
## 5. Защита от повторных списаний
|
||||
После выдачи ссылки ты не должен предпринимать никаких действий на странице оплаты.
|
||||
- Не нажимай кнопку "Я оплатил".
|
||||
- Не обновляй страницу.
|
||||
- Просто закрой сессию браузера через 2 минуты после отправки ссылки или сразу после команды пользователя.
|
||||
Reference in a new issue