Статичный сайт для личных страниц перевода по номеру телефона. Работает без сервера и базы данных, поэтому подходит для GitHub Pages.
Профили получателей хранятся прямо в репозитории в profiles/*.json. Публичная ссылка выглядит так:
https://username.github.io/repo/?to=ivan-petrov
- Открывает постоянные страницы получателей из
profiles/<slug>.json. - Генерирует preview и JSON нового профиля.
- Показывает мобильную страницу с QR-кодом этой ссылки.
- Копирует номер телефона по нажатию.
- Показывает инструкцию для ручного перевода через СБП или перевод по номеру.
- Рисует кнопки банков из
banks.jsс локальными SVG-логотипами и пытается открыть приложение через диплинк.
Публичного универсального стандарта диплинков для P2P-перевода по номеру телефона во все банковские приложения нет. Поэтому кнопки банков в banks.js нужно проверять на реальных устройствах и при необходимости уточнять под конкретный банк. Надёжный сценарий в интерфейсе всегда остаётся ручным: скопировать номер и открыть перевод по СБП в банке.
Для Т-Банка используется маршрут:
tinkoffbank://Main/PayByMobileNumber?numberPhone=<phone>&workflowType=SBPTransfer&bankMemberId=<recipient-bank-id>
Fallback ведёт в web-версию перевода по телефону Т-Банка. Для Сбера первым авто-вариантом используется universal/web link из QR-кода, который само приложение Сбера генерирует для получения переводов:
https://www.sberbank.com/sms/pbpn?requisiteNumber=<phone>
Для Яндекс Банка используется проверяемый route:
ybapp://screen.open/transfer?scenario=phone&target_phone=<phone>
Открытие приложения не гоняет весь каскад автоматически: сайт сам пробует только первый, самый вероятный route. Если приложение открылось, но внутри банка конкретный route показал ошибку, можно вернуться в браузер и нажать «Попробовать следующий вариант».
Не путать P2P-перевод по номеру с SberPay/эквайрингом: у SberPay диплинк обычно выдаётся платёжным провайдером для конкретного инвойса, а не собирается статическим сайтом из телефона получателя.
Запусти простой сервер:
python3 -m http.server 8000Открой корень сайта, чтобы создать новую карточку: http://127.0.0.1:8000/.
Локально:
node tools/create-profile.mjs \
--name="Иван Петров" \
--phone="+7 999 123-45-67" \
--bank=tbank \
--note="На кофе"Скрипт создаст profiles/ivan-petrov.json. После коммита и пуша ссылка будет:
https://username.github.io/repo/?to=ivan-petrov
Публикация сразу в GitHub через API:
GITHUB_TOKEN=... node tools/create-profile.mjs \
--repo=username/repo \
--branch=main \
--name="Иван Петров" \
--phone="+7 999 123-45-67" \
--bank=tbank \
--note="На кофе"Через GitHub MCP можно сделать то же самое вызовом create_file для пути profiles/<slug>.json.
- Создай публичный репозиторий.
- Загрузи в него файлы сайта, включая
assets/,profiles/,tools/,index.html,styles.css,app.js,banks.js,qrcode.min.jsиREADME.md. - В настройках репозитория открой
Pages. - Выбери источник
Deploy from a branch, веткуmain, папку/root. - Через минуту сайт будет доступен по адресу вида
https://username.github.io/repo/.
Опубликованные профили лежат в публичном GitHub-репозитории. Имя и телефон стоит считать публичными.