使用回调进行保存和删除

本指南介绍了如何使用 Google Pay API for Passses 进行回调。用户每次保存和删除有价卡券时,Google 都会使用用户的保存/删除操作数据和签名,在预先配置的类级别 HTTPS 端点上回调合作伙伴。

前提条件

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

  • 设置一个处理 POST 请求的 HTTPS 端点。此端点需要公开。
  • 以编程方式更新每个类的回调端点。请在 REST API 中按类查看 callbackOptions 属性。
  • (推荐)使用 Tink 库来验证签名。

实现回调

对于用户对对象执行的每个保存或删除操作,Google 都会使用每个类网址的保存或删除操作详情,对商家进行回调。商家应首先使用公钥验证消息的真实性。一旦回调能够验证消息,该回调就可以用于下游操作。

验证签名

我们建议您在实现 HTTPS 端点时使用 Tink 库验证消息签名。Tink 库提供了 PaymentMethodTokenRecipient,这是一个可自动验证签名并在成功验证后返回实际消息的实用程序。

以下示例展示了如何使用 Tink 库实现 PaymentMethodTokenRecipient:

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

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


<issuer_id.class_id>
objectId

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


<issuer_id.object_id>
expTimeMillis 自纪元开始的有效期(以毫秒为单位)。在有效期之后,该消息应被视为无效。
eventType 可以是“del”(删除)或“save”(保存)。
nonce 用于跟踪任何重复递送的 Nonce。

处理来自 Google 服务器的请求

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

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

适当配置您的服务器,以便它不拒绝请求。例如,您可能需要在 robots.txt 中设置以下代码:

User-agent: Google-Valuables
Disallow:

重试

系统会尽最大努力进行回调。Google 会尝试传递此消息三天,以防遇到暂时故障。三天后,此消息将被舍弃,且将来不会进行重试。

递送重复

在某些情况下可能会有重复的递送。我们建议您使用 Nonce 消除重复递送。