В этом руководстве объясняется, как использовать обратные вызовы с API Google Кошелька. Когда пропуск создается или удаляется, Google может выполнить обратный вызов к конечной точке HTTPS по вашему выбору. Этот обратный вызов зависит от прохода и включает данные о событии, такие как externalPassId и тип события. Это можно использовать для отслеживания количества добавлений и удалений пользователей. Например, обратные вызовы можно настроить для отправки событий в аналитическое приложение для отслеживания взаимодействия с клиентами во время рекламных мероприятий.
Предварительные условия
Прежде чем приступить к работе, ознакомьтесь со следующими предварительными условиями:
- Установите конечную точку HTTPS, которая обрабатывает запросы POST. Эта конечная точка должна быть общедоступной.
- Программно обновить URL-адрес конечной точки обратного вызова для эмитента . См. свойство
callbackOptions
для эмитента в REST API. - Рекомендуется: используйте библиотеку Tink для проверки подписей.
Реализация обратных вызовов
При каждом добавлении или удалении, выполненном пользователем при проходе, Google отправляет продавцам обратный вызов с подробной информацией о добавлении или удалении по URL-адресу обратного вызова эмитента. Продавцам необходимо сначала использовать открытые ключи для проверки подлинности сообщения. После того как обратные вызовы проверят сообщение, обратные вызовы можно использовать для последующих операций.
Проверьте подпись
Мы рекомендуем вам использовать библиотеку Tink для проверки подписи сообщения при реализации конечной точки HTTPS. Библиотека Tink предоставляет PaymentMethodTokenRecipient
— утилиту, которая автоматически проверяет подпись и возвращает фактическое сообщение после успешной проверки.
В следующем примере показано, как использовать библиотеку Tink для реализации PaymentMethodTokenRecipient
:
import java.io.IOException; import javax.servlet.http.*; import com.google.common.io.CharStreams; import com.google.crypto.tink.apps.paymentmethodtoken.*; // Replace ISSUER_ID with your issuer id private static final String RECIPIENT_ID = "ISSUER_ID"; private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys"; private static final String SENDER_ID = "GooglePayPasses"; 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()); PaymentMethodTokenRecipient 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) { // Handle the error } }
Ожидаемый формат сообщения
Формат сообщения — JSON, сериализованный в строку со следующими свойствами:
Идентификатор | Описание |
---|---|
externalPassId | Полный идентификатор внешнего пропуска. Использует следующий формат: <issuer_id.external_pass_id> |
expTimeMillis | Срок действия в миллисекундах с момента EPOCH. По истечении срока действия сообщение необходимо считать недействительным. |
eventType | Может быть либо del , либо save для DELETE и SAVE . |
nonce | Nonce для отслеживания дублирующих поставок. |
Обработка запроса с сервера Google
Ниже приведен список ключевых полей в заголовке запроса, который отправляется в конечную точку обратного вызова:
- Пользовательский агент:
Googlebot
- Тип контента:
application/json
Настройте свой сервер так, чтобы он не отклонял запрос. Для этого вы можете установить в robots.txt
следующее:
User-agent: Googlebot Disallow:
Повторные попытки
Обратные вызовы осуществляются по мере возможности. Google будет использовать общие стратегии повторных попыток, чтобы обеспечить устойчивость в случаях, когда конечная точка обратного вызова не отвечает или имеет периодические сбои, и будет корректно отклонять попытки.
Дублирующие поставки
В некоторых случаях могут быть дублированные поставки. Мы рекомендуем использовать nonce
для их дедупликации.