import 'package:sbp/data/c2bmembers_data.dart'; import 'package:sbp/models/c2bmembers_model.dart'; import 'package:sbp/sbp.dart' as sbp; /// Контракт обёртки над нативным плагином СБП (Система Быстрых Платежей). /// /// Статичные методы класса [Sbp] из пакета `sbp` работают через MethodChannel, /// поэтому не поддаются прямому мокированию в тестах. Этот интерфейс вводится /// для тестируемости и возможности подмены реализации (см. [SbpServiceImpl]). abstract class SbpService { /// Возвращает список банков, установленных на устройстве пользователя /// и поддерживающих оплату по СБП. Future> getInstalledBanks(); /// Открывает банковское приложение [bank] для оплаты по ссылке [url] /// (checkout_url вида `https://qr.nspk.ru/...`). /// /// Возвращает `true`, если приложение банка успешно запущено. Future openBank({required String url, required C2bmemberModel bank}); } /// Реализация [SbpService], делегирующая вызовы в статичные методы пакета `sbp`. class SbpServiceImpl implements SbpService { const SbpServiceImpl(); @override Future> getInstalledBanks() { // Используем встроенный справочник банков c2bmembersData (получаемый с // https://qr.nspk.ru/proxyapp/c2bmembers.json) и фильтруем только те, что // установлены на устройстве. Локальные иконки/названия включены, чтобы UI // не зависел от сетевой загрузки логотипов. return sbp.Sbp.getInstalledBanks( C2bmembersModel.fromJson(c2bmembersData), useAndroidLocalIcons: true, useAndroidLocalNames: true, ); } @override Future openBank({required String url, required C2bmemberModel bank}) { return sbp.Sbp.openBank(url, bank); } }