Использование обратных вызовов для сохранения и удаления данных

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

Требования

Перед началом работы ознакомьтесь с указанными ниже требованиями.

  • Настройте конечную точку HTTPS с возможностью обрабатывать запросы POST. Она должна быть доступна для всех пользователей.
  • Обновите классы конечной точки обратного вызова, используя алгоритмы. Свойства callbackOptions для каждого класса можно посмотреть в REST API.
  • Рекомендуется использовать библиотеку Tink, чтобы проверять подписи.

Внедрение функции обратного вызова

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

Проверка подлинности подписи

Рекомендуем воспользоваться библиотекой Tink для проверки подписей сообщений при настройке конечной точки HTTPS. В библиотеку Tink включена утилита PaymentMethodTokenRecipient, которая автоматически проверяет подпись и после этого показывает само сообщение.

В примере ниже показано, как внедрить PaymentMethodTokenRecipient с помощью библиотеки Tink.

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys". // Public key URL provided by Google.
private static final String SENDER_ID = "GooglePayPasses". // Constant.

private static final String RECIPIENT_ID = "ISSUER_ID". // Replace ISSUER_ID with your issuer id.

private static final String PROTOCOL = "ECv2SigningOnly".
Private static final GooglePaymentsPublicKeysManager keysManager = new
                       GooglePaymentsPublicKeysManager.Builder()
                      .setKeysUrl(PUBLIC_KEY_URL)
                      .build();

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    try {
      // Extract signed message with signature from POST request body.
      String signedMessage = CharStreams.toString(request.getReader());
      recipient =
          new PaymentMethodTokenRecipient.Builder()
              .protocolVersion(PROTOCOL)
              .fetchSenderVerifyingKeysWith(keysManager)
              .senderId(SENDER_ID)
              .recipientId(RECIPIENT_ID)
              .build();

      String serializedJsonMessage = recipient.unseal(signedMessage);
      // Use serializedJsonMessage to extract the details.
    } catch (Exception e) {
       // …
    }
}

Ожидаемый формат сообщения

Сообщение представляет собой ресурс JSON в виде строки и содержит следующие значения.

Идентификатор Описание
classId

Полный идентификатор класса. Вводится в следующем формате:


<issuer_id.class_id>
objectId

Полный идентификатор объекта. Вводится в следующем формате:


<issuer_id.object_id>
expTimeMillis Время в миллисекундах Unix-времени. После того как оно истечет, сообщение будет считаться недействительным.
eventType Может содержать значение "del" (Удалено) или "save" (Сохранено).
nonce Однократно используемое число для отслеживания повторяющихся отправленных сообщений.

Обработка запроса от сервера Google

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

  • User-Agent: Google-Valuables
  • Content-Type: application/json

Настройте сервер так, чтобы он не отклонял запросы. Например, вы можете добавить в файл robots.txt следующие строки:

User-agent: Google-Valuables
Disallow:

Повтор операций

Мы стараемся обеспечить бесперебойную работу обратных вызовов. При возникновении временных неполадок Google повторяет отправку сообщения в течение трех дней. По истечении трех дней сообщение будет окончательно удалено.

Повторяющиеся отправленные сообщения

В некоторых случаях сообщение может быть отправлено несколько раз. Рекомендуем проводить поиск по однократно используемым числам, чтобы найти и устранить повторы.