В этом руководстве рассказывается, как использовать обратные вызовы с Google Wallet API. Когда карта создается или удаляется, Google может выполнить обратный вызов конечной точки HTTPS по вашему выбору. Этот обратный вызов зависит от класса и включает данные о событии, такие как класс, объект и тип события. Это позволяет отслеживать количество добавленных и удаленных пользователей. Например, обратные вызовы можно настроить так, чтобы отправлять события в приложение для анализа данных и отслеживать вовлечение клиентов во время рекламных акций.
Требования
Прежде чем начать, ознакомьтесь со следующими требованиями:
- Настройте конечную точку HTTPS, которая обрабатывает запросы POST. Эта конечная точка должна быть общедоступной.
-
Программно обновите конечную точку обратного вызова для каждого курса. Ознакомьтесь со свойством
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, сериализованный в строку со следующими свойствами:
| Идентификатор | Описание |
|---|---|
classId |
Полный идентификатор класса. Используется следующий формат: <issuer_id.class_id> |
objectId |
Полный идентификатор объекта. Используется следующий формат: <issuer_id.object_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, чтобы удалить дубликаты.