Google Pay на Flutter: от настройки до первой транзакции

Добавление оплаты в приложение — это всегда стресс. То API не работает, то карт нет, то ключи где-то потерялись. Если вы выбрали Flutter, вам повезло: этот фреймворк делает процесс интеграции платежей значительно проще, чем нативная разработка на Swift или Kotlin. Но «проще» не значит «просто». Нужно понимать, где проходит граница между вашим кодом и сервером Google.

В этой статье мы пройдем путь от настройки требований в Google Cloud до того момента, когда пользователь реально оплатит товар в вашем приложении. Я не буду грузить вас теорией о протоколах шифрования, но подробно распишу, какие файлы нужно создать, какие права запросить и почему ваша оплата может не пройти, даже если всё кажется правильным.

С чего начать: требования, о которых молчат в документации

Прежде чем писать первую строчку кода на Dart, нужно убедиться, что у вас есть база. Google Pay не работает в вакууме. Это платежная система, которая требует подтверждения ваших прав на прием платежей.

Вам понадобятся три вещи:

  • Аккаунт разработчика в Google Play Console. Без него вы не сможете настроить приложение для продакшена.
  • Подключенный платежный провайдер (Merchant Account). Google не хранит деньги сам. Он просто передает данные карты через шлюз. Вам нужен инженерный доступ к Stripe, PayPal или другому процессингу, который поддерживает Google Pay.
  • Merchant ID. Это уникальный идентификатор вашего бизнеса в системе Google. Он нужен, чтобы Google знал, кому зачислять средства.

Важный момент: если вы только тестируете, не спешите создавать реальный Merchant ID. У Google есть тестовые режимы, но для них нужна специфическая конфигурация. Многие новички теряют время, пытаясь подключить тестовые карты к реальному Merchant ID — это не сработает.

Выбираем инструмент: какой пакет использовать

В экосистеме Flutter есть несколько пакетов для работы с Google Pay. От того, какой вы выберете, зависит, насколько глубоко вам придется лезть в нативный код.

Самый популярный и надежный вариант — google_pay (или его форки, так как оригинальный пакет от Google иногда обновляется с задержкой). Он предоставляет готовый UI-компонент, который автоматически адаптируется под дизайн Android и iOS (да, через Google Pay можно принимать платежи и на iPhone, но это сложнее).

Альтернатива — использовать in_app_purchase от самого Flutter, если вы продаете цифровые товары внутри приложения (игры, подписки). Но если у вас интернет-магазин, каталог услуг или доставка еды, вам жизненно необходим именно google_pay.

Критерий Пакет google_pay Пакет in_app_purchase
Тип товаров Физические товары, услуги, подписки вне магазина Цифровые товары (гайды, уровни, премиум-доступ)
Комиссия Google 0% (работает как обычный эквайринг) 15-30% (комиссия Google Play)
Сложность интеграции Средняя (требует настройки Merchant ID) Высокая (требует глубокой связки с Product IDs в консоли)
Для кого подходит Интернет-магазины, сервисы, такси Разработчики игр и мобильных приложений

Настройка окружения: Android и Flutter

Допустим, вы решили использовать пакет google_pay для интернет-магазина. Это классический сценарий. Первым делом обновите файл pubspec.yaml и добавьте нужную зависимость. Не забудьте про flutter pub get.

Теперь самое важное — настройка Android. Google Pay — это не просто виджет, это глубокая интеграция с системой безопасности Android. Вам нужно отредактировать файл AndroidManifest.xml, который лежит в папке `android/app/src/main/`.

Добавьте туда права, которые разрешат приложению делать запросы к платежному шлюзу. Обычно это выглядит как добавление разрешений на сетевую активность и интеграцию с Google Wallet. Но самое критичное — это настройка шифрования. Вам нужно будет сгенерировать пару ключей (публичный и приватный) в Google Cloud Console. Публичный ключ вы положите в код приложения, а приватный останется на вашем сервере, чтобы расшифровывать данные карты.

Если вы пропустите этот этап, приложение будет собирать токен оплаты, но вы не сможете его расшифровать, и процессинг просто вернет ошибку.

Конфигурация платежного запроса

В коде Dart вам нужно описать структуру запроса. Это ваш «заказ» для Google: сколько денег списать, какие карты принять и что делать с адресом доставки.

Создайте объект конфигурации. Здесь вы указываете:

  1. Merchant ID. Тот самый ID, который мы получили в начале.
  2. Тестовые или реальные данные. Обязательно должен быть флаг isTest. В режиме тестирования Google позволяет использовать специальные тестовые номера карт, которые не списывают реальные деньги.
  3. Способы оплаты. Вы можете разрешить только карты Visa/Mastercard или добавить оплату через баланс Google Play. Для большинства магазинов достаточно карт.
  4. Адресные данные. Если вы доставляете товары, добавьте параметр allowed_shipping_address_parameters. Это позволит вам автоматически получить от пользователя адрес доставки прямо в окне оплаты, не заставляя его вводить его вручную.

Пример того, как это выглядит в коде (упрощенно):

GooglePayConfiguration configuration = GooglePayConfiguration(
  environment: Test, // или Production
  merchantId: 'YOUR_MERCHANT_ID',
  merchantCountryCode: 'RU',
  currencyCode: 'RUB',
  pricingType: Static,
);

Встраивание виджета в интерфейс

Теперь, когда «движок» настроен, нужно нарисовать кнопку. В Flutter это делается через виджет GooglePayButton. Это не обычная картинка, а живой компонент, который меняет цвет и стиль в зависимости от темы вашего приложения.

Вы можете настроить кнопку так, чтобы она показывалась только когда пользователь выбрал товары и нажал «Оформить». Это важно для UX. Не ставьте кнопку оплаты на главный экран без контекста — это раздражает.

Самый частый кейс — это кнопка «Купить» в корзине. Когда пользователь нажимает её, открывается нативное окно Google Pay. Пользователь выбирает карту, подтверждает отпечатком или PIN-кодом, и окно закрывается. Вам возвращается токен.

Обратите внимание на стилизацию. Google Pay диктует свои правила оформления кнопок. Нельзя менять шрифт, цвет или скругление углов произвольно. Вы можете выбрать только один из нескольких стандартных вариантов: «Простая», «С иконкой», «Темная» или «Светлая». Нарушение этих правил может привести к тому, что приложение не пройдет модерацию в магазинах.

Обработка токена и отправка на сервер

Когда окно Google Pay закрывается с успешным статусом, вы получаете на вход огромный длинный JSON-токен. Это «золотая жила», но и самая опасная часть всей системы.

Категорически нельзя пытаться расшифровать этот токен внутри Flutter-приложения. Это грубая ошибка безопасности. Если вы положите приватный ключ в код приложения, любой хакер сможет его извлечь и получить доступ к вашим средствам или подделывать транзакции.

Правильный сценарий такой:

  1. Приложение получает токен.
  2. Приложение отправляет этот токен на ваш бэкенд (через HTTPS).
  3. Ваш бэкенд расшифровывает токен, используя приватный ключ.
  4. Бэкенд отправляет данные карты в платежный шлюз (Stripe, CloudPayments и т.д.).
  5. Платежный шлюз списывает деньги.
  6. Ваш бэкенд сообщает приложению об успехе.

Если вы попытаетесь сделать всё на клиенте, вы получите уязвимое приложение, которое никто из серьезных платежных систем не подпишет.

Частые ошибки и как их избежать

В процессе разработки я видел десятки проблем, которые сводились к нескольким типичным ошибкам. Вот «список грехов», от которых стоит оградить себя заранее.

Ошибка 1: Забыли включить Google Pay в тестовом режиме

Самая частая проблема. Вы создаете приложение, запускаете эмулятор, нажимаете кнопку оплаты, а ничего не происходит. Проверьте, что в Google Cloud Console включен API Google Pay, и что вы используете тестовые ключи для тестового билда.

Ошибка 2: Несоответствие приложения и Merchant ID

Если вы создаете Merchant ID как «Production», а запускаете приложение в режиме «Debug», Google может отклонить запрос. Всегда связывайте конфигурацию Merchant ID с типом сборки вашего приложения.

Ошибка 3: Отказ в доступе к правам

Если пользователь отклонил доступ к контактам или адресу (когда вы просите данные доставки), вы не сможете получить полную информацию о нем. Нужно предусмотреть сценарий, когда пользователь вводит адрес вручную, если он не захотел передавать его через Google Pay.

Сценарии выбора стратегии интеграции

Не существует единственно верного пути. Всё зависит от того, что именно вы делаете. Давайте разберем несколько ситуаций.

Ситуация А: Вы делаете интернет-магазин одежды.
Вам нужны данные карты и адрес доставки. Выбирайте стандартный Google Pay с разрешением на получение адреса. Интегрируйте с процессингом, который поддерживает 3-D Secure (это обязательно для карт в РФ и многих других странах). В Flutter настройте кнопку так, чтобы она вызывала диалог с выбором адреса.

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

Ситуация В: Вы разрабатываете корпоративное приложение для сотрудников.
Здесь нет публичных платежей. Вам может понадобиться оплата через корпоративные карты или внутренние баллы. В этом случае Google Pay может быть избыточен. Лучше использовать прямой API процессинга с вводом данных карты вручную, если бюджет позволяет.

Что лучше сделать: пошаговый план

Чтобы не запутаться, следуйте этому алгоритму. Это чек-лист, который сэкономит вам недели работы.

Шаг 1. Подготовка контента

Соберите все юридические документы: оферту, политику конфиденциальности. Платежные системы обязательно проверят наличие этих ссылок в вашем приложении. Если их нет, интеграцию могут заблокировать на этапе проверки.

Шаг 2. Техническая настройка

Зарегистрируйте Merchant ID. Создайте пару ключей шифрования. Загрузите публичный ключ в приложение, приватный — сохраните в секретном хранилище бэкенда (например, в переменных окружения).

Шаг 3. Написание кода

Настройте конфигурацию Google Pay в Flutter. Реализуйте обработчик нажатия кнопки. Напишите метод отправки токена на сервер. Сделайте обработку ошибок (что показать пользователю, если карта отклонена).

Шаг 4. Тестирование

Используйте тестовые карты Google. Протестируйте сценарий успешной оплаты, сценарий отклонения карты (например, карта с балансом 0) и сценарий сбоя сети. Убедитесь, что приложение не вылетает при ошибках.

Шаг 5. Релиз

Перед публикацией переключите конфигурацию на Production. Проверьте, что ключи сменились на реальные. Сделайте тестовую транзакцию на минимальную сумму (1 рубль) в реальном режиме.

Итоги и рекомендации

Интеграция Google Pay в Flutter — это не магия, а последовательность технических шагов. Главный секрет успеха — не пытаться упростить процесс за счет безопасности. Никогда не храните ключи шифрования на клиенте и всегда проверяйте состояние токена на сервере.

Если вы используете Flutter, вы получаете кроссплатформенность «из коробки», но помните, что Google Pay на iOS работает иначе, чем на Android (там это Apple Pay, который требует отдельной настройки). Для полной поддержки вам придется писать нативные плагины или использовать сложные обертки, которые поддерживают оба шлюза.

Начинайте с малого: подключите Google Pay только для Android. Это даст вам понимание механики, а потом можно будет масштабироваться на другие платформы. И самое главное — всегда имейте запасной вариант оплаты (например, ввод номера карты вручную), так как не у всех пользователей есть настроенный Google Pay, и отказывать им в покупке из-за этого нельзя.

Данная статья носит исключительно информационный характер. Политика Google и требования платежных систем могут меняться. Перед внедрением финансовых решений обязательно проконсультируйтесь с профильными специалистами и внимательно изучите актуальную документацию Google Cloud и вашего платежного провайдера.

Platejigid.ru