适用于网页 API 的 Google Pay API for Passes 的参考

您的用户可以使用 Google Pay API for Passes 将对象从网页保存到 Google Pay。用户可以直接从您的网站保存他们的支付卡。

本文中的参考信息详细介绍了用于呈现 Google Pay API for Passes 按钮的 HTML 元素 g:savetoandroidpay 以及向 Google 说明您的网络服务的 JSON 网络令牌

Google Pay API for Passes 的 JavaScript

若想在加载时自动解析 g:savetoandroidpay HTML 标记,请包含标准 JavaScript

<script src="https://apis.google.com/js/platform.js" type="text/javascript"></script>

若想实现 AJAX 应用以及显式呈现 Google Pay API for Passes 按钮,请包含 "parsetags": "explicit" 参数。

<script src="https://apis.google.com/js/platform.js" type="text/javascript">
  {"parsetags": "explicit"}
</script>

g:savetoandroidpay HTML 标记

g:savetoandroidpay 命名空间标记定义了“保存到 Google Pay”按钮的展示位置和各种属性。如果您呈现的是 HTML 和 JWT 服务器端,请使用此标记。

<g:savetoandroidpay jwt="JWT" onsuccess="successHandler" onfailure="failureHandler" />
字段 类型 是否必需 说明
height 字符串 要显示的按钮的高度。值包括:small(高度为 30 像素)和 standard(高度为 38 像素)。height 默认为 small。要查看不同 height 设置的按钮示例,请参阅 Google Pay API for Passes 按钮
jwt 字符串 Google Pay API for Passes 的 JWT。
onsuccess 字符串 保存成功回调处理程序函数的字符串名称。
onfailure 字符串 保存失败回调处理程序函数的字符串名称。此函数会收到一个包含 errorCode 和 errorMessage 的错误对象。
size 字符串 要显示的按钮的宽度。您可以将 size 设置为 matchparent,使其宽度与父元素的宽度相匹配。您也可以不定义 size,以拉伸宽度并使其适合 text 设置的宽度。要查看不同 size 设置的按钮示例,请参阅 Google Pay API for Passes 按钮
text 字符串 已弃用
textsize 字符串 若指定为 textsize=large,显示器将显著增大文本大小和按钮大小,非常适合有特殊界面要求的场合。
theme 字符串 要显示的按钮的主题背景。值包括:darklight。默认的主题背景为 dark。要查看不同 theme 设置的按钮示例,请参阅 Google Pay API for Passes 按钮

Google Pay API for Passes 的 JWT

Google Pay API for Passes 的 JWT 定义了要保存的对象和类。

协议

{
  "iss": "example_service_account@developer.gserviceaccount.com",
  "aud": "google",
  "typ": "savetoandroidpay",
  "iat": 1368029586,
  "payload": {
    "eventTicketClasses": [{
      ... //Event ticket Class JSON
    }],
    "eventTicketObjects": [{
      ... //Event ticket Object JSON
    }],
    "flightClasses": [{
      ... //Flight Class JSON
    }],
    "flightObjects": [{
      ... //Flight Object JSON
    }],
    "giftCardClasses": [{
      ... //Gift card Class JSON
    }],
    "giftCardObjects": [{
      ... //Gift card Object JSON
    }],
    "loyaltyClasses": [{
      ... //Loyalty Class JSON
    }],
    "loyaltyObjects": [{
      ... //Loyalty Object JSON
    }],
    "offerClasses": [{
      ... //Offer Class JSON
    }],
    "offerObjects": [{
      ... //Offer Object JSON
    }],
    "transitClasses": [{
      ... //Transit Class JSON
    }],
    "transitObjects": [{
      ... //Transit Object JSON
    }]
  },
  "origins": ["http://baconrista.com", "https://baconrista.com"]
}

Java

WobCredentials credentials = null;
WobUtils utils = null;

// Instantiate the WobUtils class which contains handy functions
// Wob utils can be found in the quickstart sample
try {
  credentials = new WobCredentials(
    ServiceAccountEmailAddress,
    ServiceAccountPrivateKeyPath,
    ApplicationName,
    IssuerId);
  utils = new WobUtils(credentials);
} catch (GeneralSecurityException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

// Add valid domains for the Save to Wallet button
List<String> origins = new ArrayList<String>();
origins.add("http://baconrista.com");
origins.add("https://baconrista.com");
origins.add(req.getScheme() + "://" + req.getServerName() + ":" + req.getLocalPort());

//Generate Objects and Classes here
//........

WobPayload payload = new WobPayload();
payload.addObject({WalletObject/WalletClass});

// Convert the object into a Save to Android Pay Jwt
String jwt = null;
try {
  jwt = utils.generateSaveJwt(payload, origins);
} catch (SignatureException e) {
  e.printStackTrace();
}

PHP

$requestBody = [
  "iss"=> SERVICE_ACCOUNT_EMAIL_ADDRESS,
  "aud" => "google",
  "typ" => "savetoandroidpay",
  "iat"=> time(),
  "payload" => {
    "eventTicketClasses" => [ ], # Event ticket classes
    "eventTicketObjects" => [ ], # Event ticket objects
    "flightClasses" => [ ],      # Flight classes
    "flightObjects" => [ ],      # Flight objects
    "giftCardClasses" => [ ],    # Gift card classes
    "giftCardObjects" => [ ],    # Gift card objects
    "loyaltyClasses" => [ ],     # Loyalty classes
    "loyaltyObjects" => [ ],     # Loyalty objects
    "offerClasses" => [ ],       # Offer classes
    "offerObjects" => [ ],       # Offer objects
    "transitClasses" => [ ],     # Transit classes
    "transitObjects" => [ ]      # Transit objects
  },
  "origins" => ["http://baconrista.com", "https://baconrista.com"]
]
// Generate the Save to Android Pay Jwt
echo $jwt = $assertObj->makeSignedJwt($requestBody, $client);

Python

jwt = {
  'iss': config.SERVICE_ACCOUNT_EMAIL_ADDRESS,
  'aud': 'google',
  'typ': 'savetoandroidpay',
  'iat':  int(time.time()),
  'payload': {
    'webserviceResponse': {
      'result': 'approved',
      'message': 'Success.'
    },
    'eventTicketClasses': [], # Event ticket classes
    'eventTicketObjects': [], # Event ticket objects
    'flightClasses': [],      # Flight classes
    'flightObjects': [],      # Flight objects
    'giftCardClasses': [],    # Gift card classes
    'giftCardObjects': [],    # Gift card objects
    'loyaltyClasses': [],     # Loyalty classes
    'loyaltyObjects': [],     # Loyalty objects
    'offerClasses': [],       # Offer classes
    'offerObjects': [],       # Offer objects
    'transitClasses': [],     # Transit classes
    'transitObjects': []      # Transit objects
  },
  'origins' : ['http://baconrista.com', 'https://baconrista.com']
}

// Generate the Save to Android Pay Jwt
signer = crypt.Signer.from_string(app_key)
signed_jwt = crypt.make_signed_jwt(signer, jwt)
response = webapp2.Response(signed_jwt)

注意:这些 JWT 使用 RSA-SHA256 进行签名。签名密钥是 OAuth 服务帐号生成的密钥。

字段 类型 是否必需 说明
iss 字符串 您的 OAuth 2.0 服务帐号生成的电子邮件地址。
aud 字符串 受众。Google Pay API for Passes 对象的受众将始终为 google
typ 字符串 JWT 的类型。Google Pay API for Passes 对象的受众将始终为 savetoandroidpay
iat 整数 发布时间(单位为秒,自纪元开始的时间算起)。
payload 对象 有效负载对象。有关创建有效负载的示例,请参阅 JWT 生成指南。有效负载数组只应包含一个对象或类。
payload.eventTicketClasses 数组 要保存的活动门票类
payload.eventTicketObjects 数组 要保存的活动门票对象
payload.flightClasses 数组 要保存的机票类
payload.flightObjects 数组 要保存的机票对象
payload.giftCardClasses 数组 要保存的礼品卡类
payload.giftCardObjects 数组 要保存的礼品卡对象
payload.loyaltyClasses 数组 要保存的会员卡类
payload.loyaltyObjects 数组 要保存的会员卡对象
payload.offerObjects 数组 要保存的优惠对象
payload.offerClasses 数组 要保存的优惠类
payload.transitObjects 数组 要保存的公交对象
payload.transitClasses 数组 要保存的公交类
origins 数组 用于将 JWT 保存功能列入白名单的域名数组。如果未定义 origins 字段,Google Pay API for Passes 按钮将不会呈现。如果未定义“origins”字段,您可能会在浏览器控制台中收到“Load denied by X-Frame-Options”或“Refused to display”消息。

您编码的 JWT 应与以下示例类似:

eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJnb29nbGUiLCJvcmlnaW5zIjpbImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIsImh0dHA6Ly93d3cuZ29vZ2xlLmNvbSJdLCJpc3MiOiJzMmFwLXRvb2wuZ29vZ2xlLmNvbUBhcHBzcG90LmdzZXJ2aWNlYWNjb3VudC5jb20iLCJpYXQiOjE1NTE5ODcxNTEsInR5cCI6InNhdmV0b3dhbGxldCIsInBheWxvYWQiOnsib2ZmZXJPYmplY3RzIjpbeyJpZCI6IjMyMDI0MTMyNDE4NDM2OTk0MDEuMDFfT2ZmZXJPYmplY3RJZCJ9XX19.maHX40WWT29TC_kEb90EKQBH9AiTYAZR3153K8UI7fznVnfjVdlwsH_GKTECV3PGXdNnKCcmatUbKsONC0bxrnAHYG02kuvA1D3hSctz_amU66ntsvGIDe13mpxTzhI8fPvt9KMP1iaO7uOJuLQIHwipu4uRFAjyFaHGVaSFaP9c53qQyb_Zgyyk50M-MhH2n4kDpstNCqUJKWaadQkOWjrtMjwGzQ_ME04lbR4wb_mfK1A7Rc1UieWkxM9aMl5TOPubBKxKRRk_CqillN8XoTl9MI5RRGPuElVO28zGpYlFS6BarzDaaUfmbRZGvfF8ZiKrHZKxVrJjfZIJ2TCcDw

用于验证 JWT 的预览工具

您可以使用 Google Pay API for Passes Merchant Center 中的预览工具验证 JWT 内容或任何类或对象。您可以在发卡机构帐号的预览工具下的左侧找到这款工具。

gapi.savetoandroidpay.render 函数

此函数用于显式呈现 Google Pay API for Passes 按钮。

gapi.savetoandroidpay.render("dom-container",{
  "jwt": "JWT",
  "onsuccess": "successHandler",
  "onfailure": "failureHandler"
});
字段 类型 是否必需 说明
dom-container 字符串 用于放置 Google Pay API for Passes 按钮的容器的 ID。
jwt 字符串 定义要保存的内容的 JWT。
onsuccess 字符串 保存成功回调处理程序函数的字符串名称。
onfailure 字符串 保存失败回调处理程序函数的字符串名称。此函数会收到一个包含 errorCode 和 errorMessage 的错误对象。

Google Pay API for Passes 错误代码和消息

下表列出了当对象使用 javascript 按钮未能成功保存时,在错误对象中传送给失败回调函数的错误代码和默认错误消息。

        {
          "errorCode": "errorCode",
          "errorMessage": "errorMessage"
        }
errorCode errorMessage
SERVICE_FAILURE Google Pay 服务器上发生的错误。
CLASS_NOT_FOUND 未找到对象中引用的类。
CLASS_MISMATCH 必须存在相同类型的对象,并且对象必须引用封闭的类。
ORIGIN_MISMATCH 按钮的来源与来源列表中指定的来源不匹配。
INVALID_NUM_TYPES 只能指定一种类型的对象。
INVALID_SIGNATURE 签名无法验证。
INVALID_DUPLICATE_IDS 不允许重复的对象或类。
INVALID_JWT JWT 无效。
INVALID_EXP_IAT JWT 已过期或在未来发布。
INVALID_AUD AUD 字段的值无效。
INVALID_TYP TYP 字段的值无效。
INVALID_NUM_OBJECTS 对于会员卡、礼品卡和优惠,只能指定一个对象,并且最多只能指定一个类。
MALFORMED_ORIGIN_URL 来源网址格式错误。网址必须包含协议和网域。
MISSING_ORIGIN 必须指定来源。
MISSING_FIELDS 封闭的对象或类缺少必需字段。

本地化

JavaScript 按钮中的语言根据以下条件进行更改:

  1. 如果用户已登录 Google,则该按钮会以用户的 Google 帐号个人资料中提供的首选语言呈现。用户可以阅读更改语言,以了解如何更改其 Google 帐号的首选语言。
  2. 如果用户未登录 Google,则该按钮将使用 HTTP 标头中的 ACCEPT-LANGUAGE 值。

如果您发现按钮没有根据上述逻辑以正确的语言呈现,或者措辞不自然,请联系我们的支持团队