添加和删除回调

本指南介绍了如何通过 Google Wallet API 使用回调。当 创建或删除卡券时,Google 可以执行对 HTTPS 的回调 端点 此回调是特定于类的,并且包含数据 关于事件的信息,例如类、对象和事件类型。 这可用于 跟踪用户添加和删除操作的次数。对于 例如,回调可以配置为向 Analytics 发送事件 应用程序,用于在宣传活动期间跟踪客户参与度。

前提条件

在开始之前,请先查看以下前提条件:

  • 建立一个处理 POST 请求的 HTTPS 端点。此端点需要 以供公开访问
  • 以编程方式更新每个类的回调端点。请参阅 callbackOptions 属性。
  • 推荐:使用 Tink 库来验证签名。

实现回调

对于用户在 一个对象 ,Google 会通过在 每个课程 网址。商家需要先使用公钥来验证 消息内容。回调验证消息后,可以使用回调 处理下游操作

验证签名

我们建议您使用 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,该 JSON 会序列化为字符串,其中包含以下 属性:

标识符 说明
classId

完全限定的类 ID。请使用以下格式:

<issuer_id.class_id>
objectId

完全限定对象 ID。请使用以下格式:

<issuer_id.object_id>
expTimeMillis 到期时间(以毫秒为单位,从 EPOCH 开始)。在该到期时间过后 必须视为无效。
eventType 可以是 delsave,表示 DELETESAVE
nonce 用于跟踪任何重复递送的 Nonce。

处理来自 Google 服务器的请求

下面列出了请求标头中的关键字段 发送到回调端点:

  • 用户代理:Googlebot
  • 内容类型:application/json

配置服务器,使其不拒绝请求。为此,您可以 在 robots.txt 中设置以下内容:

User-agent: Googlebot
Disallow:

重试

系统会尽最大努力进行回调。Google 将使用常见的重试策略 在回调端点无响应或 间歇性服务中断,并能从容撤回尝试。

重复递送

在某些情况下,可能会有重复的递送。我们建议您使用 nonce 可对它们进行去重处理。