Оплата через уведомления

Интеграция с демоверсией быстрых платежей

Некоторые компании предоставляют своим клиентам возможность получить или восстановить доступ к сервису с помощью быстрых платежей (например, если нужно перейти на тарифный план более высокого уровня, оплатить мобильный интернет или счета за коммунальные услуги либо повторить платеж, который был отклонен ранее). Как правило, пользователь получает уведомление о необходимости оплаты на свое мобильное устройство. Чтобы совершить платеж, пользователю приходится переключаться между вкладками и заполнять формы, что отнимает много времени и значительно снижает вероятность того, что платеж будет выполнен.

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

Требования

Предполагается, что в вашем приложении для Android настроена активная интеграция с Google Pay. Если это не так, воспользуйтесь нашим руководством или пошаговыми инструкциями.

Компоненты

Чтобы добавить кнопку Google Pay в уведомления на Android, нужны два базовых компонента.

Специальные макеты уведомлений

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

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

Объекты activity

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

Когда пользователь нажимает кнопку Google Pay, появляется список доступных способов оплаты для завершения транзакции. Экран платежа должен запускаться из объекта activity, в котором он размещен. Используя прозрачный объект activity, можно создать впечатление, что экран платежа отображается непосредственно поверх уведомления.

Создание макета для уведомления

Процесс создания макета для уведомлений во многом похож на то, как формируется пользовательский интерфейс для обычного объекта activity. Уведомления, как и виджеты, используют класс RemoteViews для управления элементами макета. Это сокращает список доступных поддерживаемых представлений по сравнению с обычными макетами.

Для начала создайте файл ресурсов макета в папке res/layout/, чтобы описать вид уведомления. Пример notification_account_top_up.xml можно посмотреть в типовом приложении.

Пример специального макета уведомлений
Рисунок 1. Пример специального макета уведомлений.

Добавление кнопки Google Pay

Когда макет будет готов, останется добавить кнопку Google Pay. Для этого просто выберите подходящий ресурс кнопки из коллекции предварительно созданных объектов Google Pay и добавьте его в XML-файл макета. Эти объекты содержат графические ресурсы для кнопки. Их можно адаптировать к разным размерам и разрешениям экрана, к разным языкам в соответствии с правилами фирменного оформления Google Скачать их можно напрямую из раздела с правилами фирменного оформления.

<include
  android:id="@+id/googlePayButton"
  layout="@layout/buy_with_googlepay_button"
  android:layout_width="wrap_content"
  android:layout_height="48sp" />

В результате на макете появится кнопка Google Pay:

Пример специального макета уведомлений с кнопкой Google Pay
Рисунок 2. Пример специального макета уведомлений с кнопкой Google Pay.

Активация уведомления

Уведомления можно отправлять в ответ на разные события с учетом процесса взаимодействия с приложением или сервисом. Стандартным шаблоном является отправка push-уведомлений с ваших внутренних серверов с помощью сервисов для обмена сообщениями. Если в вашем приложении Android ещё не настроены push-уведомления, ознакомьтесь с решением Firebase Cloud Messaging и руководством по началу работы с ним.

Создание и настройка представления

Процесс инициализации макета уведомлений и содержащихся в нем представлений немного отличается от обычных объектов activity. Настройте структуру представлений и пропишите отклик на действия пользователя. Каждый раз при обновлении состояния необходимо перерисовывать уведомление.

Сначала создайте объект RemoteViews для хранения иерархии макета:

Kotlin

    val notificationLayout = RemoteViews(packageName, R.layout.large_notification)

Java

    RemoteViews notificationLayout = new RemoteViews(packageName, R.layout.large_notification);

Теперь вы можете использовать объект notificationLayout, чтобы вносить изменения в базовые представления (кнопки, тексты, изображения и т. д.), например изменять их стиль и настраивать для отклика на действия пользователя. В этом примере кнопка Google Pay фиксирует события нажатия для запуска процессов, связанных с оплатой:

Kotlin

    val selectOptionIntent = Intent(context, PaymentNotificationIntentService::class.java)
      selectOptionIntent.action = ACTION_SELECT_PREFIX + option
      notificationLayout.setOnClickPendingIntent(buttonId, PendingIntent.getService(
              context, 0, selectOptionIntent, PendingIntent.FLAG_UPDATE_CURRENT))

Java

    Intent payIntent = new Intent(context, PaymentTransparentActivity.class);
    payIntent.setAction(ACTION_PAY_GOOGLE_PAY);
    payIntent.putExtra(OPTION_PRICE_EXTRA, OPTION_PRICE_CENTS.get(selectedOption));
    notificationLayout.setOnClickPendingIntent(
        R.id.googlePayButton, pendingIntentForActivity(context, payIntent));

В этом примере в объекте Intent отображается экран платежа, где указано действие, которое обозначает цель для Intent и содержит дополнительную информацию, такую как цена выбранного элемента. Кроме того, Intent связывает событие с кнопкой Google Pay, так что всякий раз, когда пользователь нажимает на нее, выполняется Intent и на передний план выводится платежный объект activity.

Показ уведомления

После того как вы создадите и настроите уведомление, останется показать его пользователю. Для этого создайте объект уведомления с параметрами, заданными выше, и дополнительной конфигурацией, определяющей его поведение:

Kotlin

    val notification = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(context.getString(R.string.notification_title))
            .setContentText(context.getString(R.string.notification_text))
            .setCustomBigContentView(notificationLayout)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setAutoCancel(false)
            .setOnlyAlertOnce(true)
            .build()

Java

    Notification notification = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(context.getString(R.string.notification_title))
        .setContentText(context.getString(R.string.notification_text))
        .setCustomBigContentView(notificationLayout)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setAutoCancel(false)
        .setOnlyAlertOnce(true)
        .build();

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

Поле Значение Описание
Канал уведомлений NOTIFICATION_CHANNEL_ID Начиная с Android 8.0 (API уровня 26) требуется назначать все уведомления каналу. Каналы группируют уведомления по категориальным темам, которыми могут управлять пользователи. О каналах уведомлений можно узнать в документации по Android.
Специальное представление большого контента notificationLayout На этом этапе подготовленный макет подключается к уведомлению.
Автоматическая отмена false Если у вас интерактивное уведомление (как в этом примере), вы можете настроить параметр автоматической отмены в false. Это гарантирует, что уведомление не будет автоматически закрыто, если пользователь коснется любого из представлений внутри него.
Оповещать только один раз true Уведомление реагирует на ввод данных пользователем. Установите для этого параметра значение true, чтобы при обновлении уведомления не было звуков, подсказок и вибрации.

Чтобы узнать о других конфигурациях и общих концепциях, связанных с уведомлениями, ознакомьтесь с разделами, посвященным специальным уведомлениям и общим сведениям об уведомлениях в документации по Android.

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

Kotlin

    NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification)

Java

    NotificationManagerCompat.from(context).notify(NOTIFICATION_ID, notification);

NOTIFICATION_ID – это произвольное целое число, которое является идентификатором уведомления. Без него нельзя обновить или удалить уведомление.

Внесение платежа

При нажатии на кнопку Google Pay должен появляться экран платежа, чтобы пользователи могли выбрать способ оплаты для завершения транзакции. Чтобы экран платежа отображался поверх объекта activity, можно использовать Google Pay API. Поскольку уведомление запускает новый процесс оплаты, сделайте этот объект activity прозрачным, чтобы создать у пользователей впечатление, что эта операция происходит без запуска приложения. Ниже приведен метод onCreate для этого объекта activity:

Kotlin

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // Dismiss the notification UI if the activity was opened from a notification
    if (Notifications.ACTION_PAY_GOOGLE_PAY == intent.action) {
      sendBroadcast(Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS))
    }

    // Initialise the payments client
    startPayment()
  }

Java

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Dismiss the notification UI if the activity was opened from a notification
    if (Notifications.ACTION_PAY_GOOGLE_PAY.equals(getIntent().getAction())) {
      sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
    }

    // Initialise the payments client
    startPayment();
  }

Как видите, в этом объекте activity пока мало что происходит. Рассылка с константой намерения ACTION_CLOSE_SYSTEM_DIALOGS закрывает меню уведомлений. Помните, что этот объект activity можно вызвать, только нажав кнопку Google Pay в уведомлении. Без рассылки диалоговое окно уведомления остается открытым.

Единственное действие, которое выполняет этот объект activity, – выводит экран платежа, инициируемый с помощью метода showPaymentsSheet. Поэтому просто вызовите метод loadPaymentData в Google Pay API. Чтобы понять логику работы объекта activity, изучите файл PaymentTransparentActivity.java в приложении.