轮换条形码

简介

旋转条形码看起来与普通条形码一样,但会定期更改(通常每分钟一次),并且终端/读卡器会被编程为仅接受最新的条形码。此安全措施可降低与条形码屏幕截图相关的风险,尤其是票券盗窃或未经授权的票券转售。对于因不支持 NFC(缺少硬件或软件已停用)而无法使用智能感应功能的设备,旋转条形码还可用作后备方式。

API 参考文档

如需详细了解旋转条形码,请参阅 RotatingBarcode 类型

载荷示例

JSON
{
  "rotatingBarcode": {
    "type": "QR_CODE",
    "valuePattern": "MyRotatingBarcode-{totp_timestamp_seconds}-{totp_value_0}",
    "alternateText": "Ticket#: 1234567890",
    "totpDetails": {
      "algorithm": "TOTP_SHA1",
      "periodMillis": "3000",
      "parameters": [
        {
          "key": "3132333435363738393031323334353637383930",
          "valueLength": "8"
        }
      ]
    }
  }
}

回退机制

在用户设备上,给定时间只会使用一种兑换机制,具体取决于卡券的配置方式和设备的功能。 系统会按以下优先级顺序使用兑换类型:

  1. 智能感应式付款:如果指定了智能感应式付款载荷,并且设备支持 NFC/HCE
    • 请注意,用户可以通过点击“显示代码”来覆盖此设置,这将强制显示旋转条形码/静态条形码。
  2. 旋转条形码:如果指定了旋转条形码载荷
  3. 静态条形码:如果指定了条形码载荷

指定多个兑换载荷可以确保支持所有用户,但可能会产生安全影响。具体而言,将静态条形码用作旋转条形码的后备会使使用旋转条形码带来的大部分安全优势化为乌有。静态条形码回退项仅会显示在网页视图中,或在不支持旋转条形码的客户端上显示。从今天起,我们预计所有 Google 钱包客户端都将支持旋转条形码。

保存流程

Google Wallet API 提供了多种流程,包括:

  • 在需要时或提前创建会员卡类
  • 在 JWT 中发送完整对象,或预先保存对象,然后在 JWT 中按 ID 引用它们
  • 更新已保存的对象

建议使用的 rotatingBarcode 字段与所有这些流程兼容,但为了提高安全性,我们建议您采取以下措施:

  • 调用 object:insert API 将卡券插入 Google 钱包服务器,并配置“添加到 Google 钱包”按钮,以便按 JWT 中的 ID 引用特定对象。这样可以确保生成的 JWT 不包含旋转条形码的密钥。
  • 使用范围限定为单次通行密钥的 OTP 密钥
  • 除非更新,否则该密钥应在卡券的生命周期内有效。我们预计此密钥在正常运行期间不会以任何频率更新。

下图序列图展示了典型集成中各个参与者之间的流程:

使用旋转条形码的序列图