Как добавить Google Pay в Flutter-приложение: пошаговое руководство для реального запуска

Как добавить Google Pay в Flutter-приложение: пошаговое руководство для реального запуска

Ты хочешь, чтобы пользователи твоего приложения могли платить одним касанием — без ввода карты, без логина, без лишних шагов. Google Pay — идеальный инструмент для этого. Но когда ты впервые лезешь в документацию Google, всё выглядит как каша из терминов: PaymentMethodToken, Gateway, MerchantInfo, Environment… И ты начинаешь сомневаться: а стоит ли это того?

Да, стоит. И я покажу, как это сделать без лишней головной боли — как делают те, кто уже запустил оплату в реальных приложениях. Не теория, не копипаст с StackOverflow, а рабочий алгоритм, проверенный на практике.

Почему Google Pay, а не что-то другое?

Ты можешь подумать: «А зачем мне Google Pay, если есть Apple Pay и Stripe?»

Ответ прост: если твои пользователи — на Android, и ты хочешь, чтобы они платили сразу, без прокачки карты в приложении — Google Pay это твой лучший выбор. Он уже встроен в Android 6+, работает с большинством банков, и пользователь не вводит ничего вручную. Это не просто удобно — это снижает отказы на 30–50% по сравнению с формами ввода карты.

Но есть нюанс: Google Pay не работает сам по себе. Он — это просто способ передать данные карты от пользователя к твоему платежному шлюзу. То есть тебе всё равно нужен платёжный провайдер: Stripe, Adyen, PayPal, Square, или локальный провайдер вроде СБП или Яндекс.Кассы.

Что тебе нужно, чтобы начать

Перед тем как писать код — собери три вещи:

  1. Аккаунт Google Pay для разработчиков — зарегистрируйся на Google Pay Business Console. Там ты получишь merchantId и merchantName. Без них — ничего не заработает.
  2. Платёжный шлюз — выбери один, который поддерживает Google Pay через PaymentMethodToken. Stripe — самый простой для старта. Adyen — если уже используешь его. СБП — если твоя аудитория в России и СНГ.
  3. Сертификат SSL — твой сервер должен быть доступен по HTTPS. Без этого Google Pay просто откажется работать.

Если у тебя нет шлюза — начни с Stripe. Он даст тебе тестовый ключ за 5 минут, и ты сможешь всё протестировать без денег.

Шаг 1: Добавь зависимости в pubspec.yaml

В твой pubspec.yaml добавь:

dependencies:
  flutter:
    sdk: flutter
  google_pay: ^4.0.0
  http: ^1.1.0

Запусти flutter pub get. Не используй старые версии — в версиях ниже 4.0.0 есть баги с токенизацией на Android 12+.

Шаг 2: Настрой Android

Открой android/app/src/main/AndroidManifest.xml и добавь:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">

Создай папку android/app/src/main/res/xml и положи туда файл network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
            <certificates src="user" />
        </trust-anchors>
    </base-config>
</network-security-config>

Это нужно, чтобы твой app мог безопасно общаться с Google и твоим шлюзом. Без этого — ошибка Network security configuration на Android 9+.

Шаг 3: Получи merchantId и настрой Google Pay

В Google Pay Business Console ты получишь:

  • merchantId — например, 12345678901234567890
  • merchantName — например, MyApp Store

В коде ты будешь использовать их так:

import 'package:google_pay/google_pay.dart';

final googlePay = GooglePay(
  merchantId: '12345678901234567890',
  merchantName: 'MyApp Store',
  environment: GooglePayEnvironment.test, // Для теста — test, для продакшена — production
);

final paymentDataRequest = PaymentDataRequest(
  transactionInfo: TransactionInfo(
    totalPriceStatus: 'FINAL',
    totalPrice: '19.99',
    currencyCode: 'USD',
  ),
  paymentMethodTypes: ['CARD'],
  cardRequirements: CardRequirements(
    allowedCardNetworks: ['VISA', 'MASTERCARD', 'AMERICAN_EXPRESS'],
    allowedCardAuthMethods: ['PAN_ONLY', 'CRYPTOGRAM_3DS'],
  ),
  billingAddressRequired: true,
  billingAddressFormat: BillingAddressFormat.full,
);

Обрати внимание на environment: GooglePayEnvironment.test. Всегда тестируй в тестовом режиме. В продакшене ты не сможешь отменить транзакцию, а тестовый режим позволяет делать это сколько угодно раз.

Шаг 4: Запусти Google Pay и обработай ответ

Теперь добавь кнопку в интерфейс:

ElevatedButton(
  onPressed: () async {
    try {
      final paymentData = await googlePay.requestPayment(paymentDataRequest);
      final token = paymentData.paymentData?.paymentMethodData?.tokenizationData?.token;
      
      if (token != null) {
        // Отправь токен на свой сервер
        final response = await http.post(
          Uri.parse('https://yourserver.com/payment'),
          headers: {'Content-Type': 'application/json'},
          body: jsonEncode({
            'paymentMethodToken': token,
            'amount': '19.99',
            'currency': 'USD',
          }),
        );
        
        if (response.statusCode == 200) {
          // Успешно — покажи сообщение
          ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(content: Text('Оплата прошла!')),
          );
        } else {
          // Ошибка сервера — покажи пользователю
          showErrorMessage('Ошибка оплаты. Попробуйте позже.');
        }
      }
    } catch (e) {
      // Пользователь отменил или не поддерживает Google Pay
      if (e is GooglePayException) {
        showErrorMessage('Google Pay не доступен на этом устройстве.');
      } else {
        showErrorMessage('Ошибка: ${e.toString()}');
      }
    }
  },
  child: Text('Оплатить Google Pay'),
)

Ты не обрабатываешь карту напрямую — ты отправляешь токен на сервер. Это безопасно. Сервер твоего шлюза (например, Stripe) получит токен, расшифрует его, получит реальные данные карты и выполнит платёж. Ты даже не видишь номер карты — это хорошо.

Сравнение шлюзов: что выбрать

Вот как выглядят популярные варианты:

Шлюз Поддержка Google Pay Сложность интеграции Комиссия Лучше подходит для
Stripe Да, отлично Очень низкая 2.9% + $0.30 Стартапы, международные проекты
Adyen Да, глубокая Средняя От 1.4% (по договору) Крупные компании, много стран
PayPal Да, но через PayPal Button Средняя 2.9% + $0.30 Если пользователи уже используют PayPal
СБП (Россия) Частично — через QR Высокая 0.1–0.5% Локальные приложения в РФ
Яндекс.Касса Да, через API Средняя 2.5% Приложения с русскоязычной аудиторией

Если ты только начинаешь — выбирай Stripe. Он даст тебе всё: тестовый режим, документацию на русском, примеры кода под Flutter, и поддержку 24/7. Другие шлюзы — если у тебя уже есть договор с ними или специфические требования (например, СБП для российского рынка).

Что выбрать в зависимости от ситуации

  • Ты в России, твоя аудитория — 90% русскоязычная → Используй Яндекс.Кассу или СБП. Google Pay там работает, но не так популярен, как в Европе. СБП — дешевле, но требует QR-кода или номера телефона.
  • Ты делаешь приложение для США, Европы, Канады → Google Pay + Stripe — идеальный дуэт. Уже 70% пользователей Android используют Google Pay как основной способ оплаты.
  • Ты запускаешь MVP и не хочешь тратить время на юридические вопросы → Stripe. Он сам решает вопросы PCI-DSS, 3D Secure, и возвращает тебе токен — ты не хранить данные карты.
  • Ты уже используешь Adyen для веба → Делай то же самое и в приложении. Единая система — меньше ошибок.

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

  1. Тестируешь в production — Google Pay откажет, если твой сервер не имеет сертификата SSL, или если ты используешь тестовый merchantId в продакшене. Всегда сначала тестируй в GooglePayEnvironment.test.
  2. Не проверяешь поддержку Google Pay на устройстве — не на всех Android-устройствах он есть. Добавь проверку:
    final isAvailable = await googlePay.isAvailable();
    if (!isAvailable) {
      showErrorMessage('Google Pay не поддерживается на этом устройстве.');
      return;
    }
  3. Отправляешь токен без проверки — токен может быть пустым или повреждённым. Всегда проверяй:
    if (token == null || token.isEmpty) {
      showErrorMessage('Ошибка получения токена. Попробуйте снова.');
      return;
    }
  4. Игнорируешь валюту — если ты указал currencyCode: 'USD', а пользователь в России — он может получить ошибку. Убедись, что твой шлюз поддерживает валюту пользователя. Лучше использовать currencyCode из локали устройства.
  5. Не обрабатываешь отмену — пользователь может нажать «Назад» или закрыть окно Google Pay. Ты должен ловить исключение GooglePayException и показывать понятное сообщение: «Оплата отменена» — не «Ошибка».

Как лучше сделать — практические рекомендации

  • Покажи Google Pay как первый вариант — если пользователь на Android, вынеси кнопку Google Pay на первое место. Это увеличит конверсию.
  • Используй одинаковые суммы — если в приложении цена 19.99, то в Google Pay — тоже19.99. Никаких скрытых сборов. Google Pay откажется, если сумма не совпадает с тем, что видит пользователь.
  • Проверяй на реальных устройствах — эмуляторы часто не проходят проверку Google Pay. Тестируй на реальном Android-телефоне с установленным Google Play Services и привязанной картой.
  • Не забудь про логи — добавь логирование ошибок. Особенно: isAvailable(), requestPayment(), и ответ от сервера. Это спасёт тебя, когда пользователь скажет: «Не работает» — и ты не поймёшь почему.
  • Добавь fallback — если Google Pay не доступен — покажи кнопку «Оплатить картой». Не оставляй пользователя без выбора.

Итог: что делать прямо сейчас

Если ты хочешь добавить Google Pay в своё Flutter-приложение — сделай это по шагам:

  1. Зарегистрируйся в Google Pay Business Console и получи merchantId.
  2. Выбери шлюз — Stripe, если ты новичок. У него есть готовые инструкции для Flutter.
  3. Добавь google_pay: ^4.0.0 в pubspec.yaml.
  4. Настрой AndroidManifest.xml и network_security_config.xml — не пропускай это.
  5. Напиши код запроса с GooglePayEnvironment.test.
  6. Протестируй на реальном телефоне с привязанной картой.
  7. После успешного теста — переключись на production и запусти.

Всё это займёт у тебя 3–5 часов, если ты знаешь Flutter. Не больше. И это не «надо», а «стоит». Потому что пользователь, который платит через Google Pay, в 2 раза чаще возвращается, чем тот, кто вводит карту вручную.

Ты не должен быть экспертом по платежам. Ты должен быть экспертом по своему приложению. Google Pay — это инструмент. Используй его правильно — и он будет работать на тебя.

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

Platejigid.ru