Финальный отчёт тестирования | 10 аккаунтов, 20 проверок | PgWeb через Teleport
Воспроизведено дважды:
1️⃣ Карта Visa 4242: 798@ (триал) → 798d@ (повторный триал). card_hash одинаковый: f24240e80b...
2️⃣ Карта МИР 2200 0000 0000 0004: 798i@ (триал) → 798j@ (повторный триал). card_hash одинаковый: 4c5c22a996b...
Ожидание: Триал заблокирован (type=4, CARD_ALREADY_USED)
Факт: Триал активирован! type=1, trial_ends_at заполнен. card_hash идентичен, но антифрод не проверяет дубли для Prodamus.
Примечание: Для Stripe блокировка работает корректно (798c → type=4). Баг специфичен для Prodamus и воспроизводится для любых типов карт (Visa, МИР).
Шаги: Любой заблокированный триал (798c или 798f) → фронт показывает /payment/success/ с "You've activated the Pro plan" ✅
Ожидание: Сообщение об ошибке — триал заблокирован
Факт: Страница успеха. Пользователь думает что триал активирован. В БД: trial_ends_at=NULL, type=4.
Воспроизведено на: 798c@mail.com (блок по карте Stripe), 798f@mail.com (блок по боту)
user_fingerprints пуста для всех 8 аккаунтов. Поле card_fingerprints.user_fingerprint = NULL у всех. Device fingerprint не записывается ни для Stripe, ни для Prodamus. Проверки по комбинации карта+устройство (шаги 5-6 Марата) невозможны.
GET /user → hasFingerprint: false даже для юзеров с активным триалом. По плану Марата (шаг 8) ожидается true.
0trqiz6XoXzeotX8) и Prodamus (f24240e80b...). Юзер может обойти антифрод, сменив валюту (RUB→USD или наоборот).
| Валюта | Provider | card_hash | SL type | trial_ends_at | Бот | Результат | |
|---|---|---|---|---|---|---|---|
| 798@ | RUB | prodamus | f24240e... | 1 | 2026-04-02 | 8630860407 | ✅ Триал |
| 798b@ | USD | stripe | 0trqiz6... | 1 | 2026-04-02 | — | ✅ Триал |
| 798c@ | USD | — | — | 4→5 | NULL | — | 🛡️ Блок (карта Stripe) → Paid $432 |
| 798d@ | RUB | prodamus | f24240e... | 1 | 2026-04-02 | — | 🐛 BUG (Prodamus не блокирует) |
| 798e@ | USD | stripe | 6AK7yoq... | 1 | 2026-04-02 | transferred | ✅ Триал (новая карта) |
| 798f@ | USD | — | — | 4→5 | NULL | от 798@ | 🛡️ Блок (бот) → Paid $192 |
| 798g@ | USD | stripe | EjhCVAO... | 1 | 2026-04-02 | 8439834486 | ✅ Триал (чистый бот) |
| 798h@ | USD | stripe | — | 5 | NULL | — | Premium paid (TC-2.1 env) |
| 798i@ | RUB | prodamus | 4c5c22a... | 1 | 2026-04-02 | — | ✅ Триал (МИР *0004) |
| 798j@ | RUB | prodamus | 4c5c22a... | 1 | 2026-04-02 | — | 🐛 BUG (МИР повтор) |
| Тест | Результат | Аккаунт | Данные |
|---|---|---|---|
| TC-1.1 Триал активирован | ✅ PASS | 798@, 798b@ | trial_ends_at = 2026-04-02 |
| TC-1.2 card_fingerprints | ✅ PASS | 798@, 798b@ | Записаны для обоих провайдеров |
| TC-1.3 subscription_logs type=1 | ✅ PASS | 798@, 798b@ | type=1, payment_count=0 |
| TC-1.4 bot_ownership_history | ✅ PASS | 798@ | bot 8630860407, telegram |
| TC-1.5 user_fingerprints | ⚠️ WARNING | все | Пусто. user_fingerprint=NULL |
| Тест | Результат | Причина |
|---|---|---|
| TC-2.1 Premium→Pro downgrade | ⏭️ SKIPPED | Невозможно перейти с Premium на Pro на review-ветке (UI отключён) |
| Тест | Результат | Аккаунт | Данные |
|---|---|---|---|
| TC-3.1 Перенос бота → блок | ✅ PASS | 798f@ | type=4, trial_ends_at=NULL. Бот ранее у 798@ (триал) |
| TC-3.2 bot_ownership_history | ✅ PASS | — | Логирует все переносы: 798@ → 798e@ → 798f@ |
| TC-3.3 Чистый бот → триал | ✅ PASS | 798g@ | Новый бот 8439834486, type=1, триал активирован |
| TC-3.4 Блок → полная оплата | ✅ PASS | 798f@ | Pro $192/year оплачен после блокировки по боту |
Цепочка переноса: 798@ (owner 1, триал) → 798e@ (owner 2, триал с другой картой) → 798f@ (owner 3, заблокирован)
| Тест | Результат | Аккаунт | Данные |
|---|---|---|---|
| TC-4.1 Stripe: та же карта → блок | ✅ PASS | 798c@ | type=4. Карта 4242 (Stripe hash 0trqiz6...) |
| TC-4.1b Prodamus Visa 4242: та же карта → блок | 🐛 FAIL | 798d@ | type=1! Пропустил. Тот же hash f24240e... |
| TC-4.1c Prodamus МИР: первый триал | ✅ PASS | 798i@ | type=1. МИР *0004, hash 4c5c22a... |
| TC-4.1d Prodamus МИР: повтор → блок | 🐛 FAIL | 798j@ | type=1! Пропустил. Тот же hash 4c5c22a... Антифрод не работает для Prodamus |
| TC-4.3 Другая карта → разрешён | ✅ PASS | 798e@ | Mastercard 5555...4444, hash 6AK7yoq... |
| TC-4.4 Полная оплата заблок. картой | ✅ PASS | 798c@, 798f@ | 798c@ Pro $432/year, 798f@ Pro $192/year — оплата прошла |
Тестирование невозможно: user_fingerprint = NULL для всех аккаунтов. Проверка по комбинации карта+устройство не может работать без device fingerprint.
| Тест | Результат | Аккаунт | Данные |
|---|---|---|---|
| TC-6.1 Без ботов → триал разрешён | ✅ PASS | 798e@ | Триал активирован без бота |
| TC-6.2 bot_ownership пуст | ✅ PASS | 798e@ | bot_ownership_history пуст для этого юзера |
| Тест | Результат | Аккаунт | Данные |
|---|---|---|---|
| TC-7.1 hasFingerprint = false (новый) | ✅ PASS | 798e@ | false — ожидаемо для нового юзера |
| TC-7.2 hasFingerprint после триала | ⚠️ WARNING | 798b@ | false — ожидалось true (шаг 8 Марата) |
| Тест | Результат | Данные |
|---|---|---|
| TC-8.1 Биллинг после блокировки | ✅ COVERED | 798c@ — показывает биллинг без опции триала после блока |
| TC-8.2 2-bot setup | ⏭️ SKIPPED | Требуется сложная настройка с 2 ботами |
| TC-8.3 Сообщение об ошибке при блоке | 🐛 BUG #2 | Нет сообщения об ошибке — показывается страница успеха |
| Таблица | Поля | Примечание |
|---|---|---|
card_fingerprints | id, user_id, provider, card_hash, user_fingerprint, created_at | user_fingerprint всегда NULL |
bot_ownership_history | id, bot_identifier, platform_label, owner_id, created_at | Корректно логирует переносы |
user_fingerprints | id, user_id, fingerprint, created_at | Пустая |
subscription_logs | id, user_id, type, payment_count, created_at | type: 1=триал, 4=блок антифрода, 5=оплата |
users.trial_ends_at | — | NULL = нет/заблокирован |
subscriptions и company_user отсутствуют на этой ветке.