В этом руководстве рассказывается, как использовать обратные вызовы с Google Wallet API. Когда карта создается или удаляется, Google может выполнить обратный вызов конечной точки HTTPS по вашему выбору. Этот обратный вызов относится к конкретной карте и включает данные о событии, такие как externalPassId и тип события. Это позволяет отслеживать количество добавлений и удалений пользователей. Например, обратные вызовы можно настроить для отправки событий в аналитическое приложение, чтобы отслеживать вовлеченность клиентов во время рекламных акций.
Требования
Прежде чем начать, ознакомьтесь со следующими требованиями:
- Создайте конечную точку HTTPS, которая обрабатывает запросы POST. Эта конечная точка должна быть общедоступной.
-
Программно обновите URL конечной точки обратного вызова для эмитента. Ознакомьтесь со свойством
callbackOptionsдля эмитента в REST API. - Рекомендуем использовать для проверки подписей библиотеку Tink.
Как реализовать обратные вызовы
Каждый раз, когда пользователь добавляет или удаляет карту , Google отправляет продавцу обратный вызов с информацией об этом действии на URL обратного вызова эмитента. Продавцы должны сначала использовать открытые ключи, чтобы проверить подлинность сообщения. После того как обратные вызовы подтвердят сообщение, их можно использовать для последующих операций.
Проверьте подпись
При реализации конечной точки HTTPS рекомендуем использовать библиотеку Tink для проверки подписи сообщения. В библиотеке 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 |
Время окончания срока действия в миллисекундах с начала эпохи UNIX. По истечении этого времени сообщение должно считаться недействительным. |
eventType |
Для DELETE и SAVE можно указать del или save.
|
nonce |
Одноразовый код для отслеживания дублирующихся показов. |
Обработка запроса от сервера Google
Ниже перечислены основные поля в заголовке запроса, который отправляется на вашу конечную точку обратного вызова.
- User-Agent:
GooglebotилиGoogle-Valuables - Content-Type:
application/json
Настройте сервер так, чтобы он не отклонял запрос. Для этого в robots.txt можно задать следующие настройки:
User-agent: Googlebot Disallow:
Повторные попытки
Обратные вызовы выполняются по мере возможности. Google будет использовать стандартные стратегии повторных попыток, чтобы обеспечить устойчивость в случаях, когда конечная точка обратного вызова не отвечает или имеет периодические сбои, и будет корректно отменять попытки.
Повторяющиеся доставки
В некоторых случаях возможна повторная доставка. Рекомендуем использовать nonce, чтобы удалить дубликаты.