Google 钱包提供强大的工具,可用于自定义任何卡券的外观和布局,包括活动门票、登机牌、会员卡和礼品卡。本指南全面介绍了如何通过定义卡片的结构和显示动态的特定于用户的信息来定制用户体验。
在开始之前,请务必参阅相应卡券类型的特定 REST API 参考文档,查看可用字段的完整列表。
基金会:cardTemplateOverride
用于自定义卡券布局的主要工具是 classTemplateInfo.cardTemplateOverride 对象,您可以在卡券的 Class 资源(例如 EventTicketClass、LoyaltyClass)。借助此对象,您可以通过定义行及其中的项来构建卡券,从而控制信息的呈现方式。
您可以引用 Class 资源(用于共享给所有用户的信息)和 Object 资源(用于特定于用户的详细信息)中的数据。
1. 使用预定义的 Google 钱包字段进行自定义
预定义字段是指 Google Wallet API 中适用于特定卡券类型的标准属性。这些字段具有特定名称,并且由 Google 钱包以一致的方式呈现。例如,条形码、活动名称、航班号或礼品卡余额。
通过引用这些预定义字段的 fieldPath,您可以将它们排列在卡券上的任意位置。
示例:显示条形码和卡券专用详细信息
此卡券示例的第 2 行中包含“顶部行”和 3 个数据字段。第一个项目显示用户在 Object 中的具体值,例如用户特定的积分或座位号。第二个项显示 Class 中的详细信息,例如活动名称或会员回馈计划等级;第三个项再次显示 Object 中的用户特定值,例如次要积分或部分 / 教练编号。

课程定义:
...
"classTemplateInfo": {
"cardTemplateOverride": {
"cardRowTemplateInfos": [
{
"threeItems": {
"startItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.loyaltyPoints.label",
"fieldPath": "object.loyaltyPoints.balance",
}
]
}
},
"middleItem": {
"firstValue": {
"fields": [
{
"fieldPath": "class.rewardsTierLabel",
"fieldPath": "class.rewardsTier",
}
]
}
},
"endItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.secondaryLoyaltyPoints.label",
"fieldPath": "object.secondaryLoyaltyPoints.balance",
}
]
}
}
}
},
]
}
}
...
"rewardsTier": "Gold",
"rewardsTierLabel": "Tier",
...
对象定义
...
"loyaltyPoints": {
"balance": {
"string": "1500"
},
"label": "Points"
},
"secondaryLoyaltyPoints" : {
"balance": {
"money": {
"micros" : "28250000",
"currencyCode": "USD",
}
},
"label": "Balance"
}
...
设置日期和时间字段的格式
对于受支持的卡券中的任何日期或时间字段,您都可以使用 dateFormat 属性指定自定义格式。这样,您就可以控制卡券上日期的显示方式,例如仅显示时间、显示完整日期和时间,或仅显示日期。如果未指定 dateFormat,系统将使用默认格式。
"fields": [
{
"fieldPath": "object.validTimeInterval.start.date",
"dateFormat": "DATE_ONLY"
}
]
如需查看可用格式的完整列表,请参阅 DateFormat 文档。
2. 使用开发者定义的字段进行自定义
为了实现最大的灵活性,Google 钱包允许您使用 textModulesData 创建自己的自定义数据字段。此功能非常适合显示不适合放入预定义字段的独特信息,例如自定义简短备注、会员福利或特定于位置的详细信息。
您可以在 Object 或 Class 中定义具有唯一 id 的 textModulesData 项,然后在 cardTemplateOverride 中引用该 id。
设置卡片行的结构
您可以设计每张卡券包含一个、两个或三个数据项,以便有条理地整理信息。您可以添加的行数没有硬性限制,但为了提供理想的用户体验,请考虑在卡片正面显示哪些内容最为重要。
- 最佳实践:对于补充信息,请使用卡券详情视图或其他 Google 钱包功能,例如
messages、linksModuleData或linkedOfferIds。这样可以保持主卡券视图的整洁。
示例:包含自定义数据的三项行
创建一行以显示自定义详细信息。对于会员卡,这可以是积分、会员等级和余额。对于活动门票,可以是“区域”“排”和“座位”。

类定义:cardTemplateOverride 引用了三个唯一 ID:detail1、detail2 和 detail3。
...
"classTemplateInfo": {
"cardTemplateOverride": {
"cardRowTemplateInfos": [
{
"oneItem": {
"item": {
"firstValue": {
"fields": [
{
"fieldPath": "object.accountName",
}
]
}
}
}
},
{
"threeItems": {
"startItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.loyaltyPoints.label",
"fieldPath": "object.loyaltyPoints.balance",
}
]
}
},
"middleItem": {
"firstValue": {
"fields": [
{
"fieldPath": "class.rewardsTierLabel",
"fieldPath": "class.rewardsTier",
}
]
}
},
"endItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.secondaryLoyaltyPoints.label",
"fieldPath": "object.secondaryLoyaltyPoints.balance",
}
]
}
}
}
},
{
"threeItems": {
"startItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.textModulesData['row1left']",
}
]
}
},
"middleItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.textModulesData['row1mid']"
}
]
}
},
"endItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.textModulesData['row1right']"
}
]
}
}
}
},
{
"twoItems": {
"startItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.textModulesData['mem_since']",
}
]
}
},
"endItem": {
"firstValue": {
"fields": [
{
"fieldPath": "object.textModulesData['park']",
}
]
}
}
}
},
]
}
}
...
"rewardsTier": "Gold",
"rewardsTierLabel": "Tier",
对象定义:Object 为每个字段提供数据和相应的 ID。
...
"accountName": "Lorenaisabel Aliwarringlen",
"loyaltyPoints": {
"balance": {
"string": "1500"
},
"label": "Points"
},
"secondaryLoyaltyPoints" : {
"balance": {
"money": {
"micros" : "28250000",
"currencyCode": "USD",
}
},
"label": "Balance"
},
"textModulesData": [
{
"header": "Visits",
"body": "17",
"id": "row1left"
},
{
"header": "Rides",
"body": "259",
"id": "row1mid"
},
{
"header": "Park hours",
"body": "140",
"id": "row1right"
},
{
"header": "Member since",
"body": "Mar 01, 2017",
"id": "mem_since"
},
{
"header": "Parking",
"body": "Included (Free)",
"id": "park"
}
]
...
变体的类数据与对象数据
您可以将类级数据与对象级数据相结合,创建动态的个性化卡券。这对于创建同一通行证的不同版本非常有用。
- 活动类别的详细信息
textModulesData:如果一组用户的详细信息相同,请使用此选项(例如,向所有 VIP 门票持有者发送“欢迎成为 VIP”消息)。 - 对象级
textModulesData:使用此级别可提供特定于某个用户的详细信息(例如,“Jane,您的座位视野受限”)。
示例:显示特定会员等级的季卡
您可以为不同的卡券变体创建不同的 Class 资源,例如活动的“普通门票”与“VIP 门票”,或航班的“经济舱”与“商务舱”。每个课程都可以有独特的设计(主打图片、颜色)和默认文字。
![]() |
![]() |
![]() |
| 会员从白银级开始 | 会员已升级为黄金级 | 另一位钻石级会员 |
“卡券详情”视图中的内容
如果 linksModuleData、imageModulesData 中的字段在 cardTemplateOverride 中被引用,则不会在卡券正面呈现。此内容会自动显示在卡券详情视图(卡券背面)中,让用户可以更轻松地访问客户服务链接、宣传图片、条款及条件和其他补充信息。
3. 除了卡片正面之外:其他模板替换
classTemplateInfo 对象提供的不仅仅是 cardTemplateOverride。您还可以自定义 Google 钱包体验的其他方面,以便更丰富、更直观地展示卡券。
如需详细了解所有可用的替换项,请参阅 ClassTemplateInfo 参考文档。
listTemplateOverride:自定义 Google 钱包应用主列表视图中的行布局,让您可以在用户打开卡券之前突出显示最重要的字段。detailsTemplateOverride:用于构建“卡券详情”视图(卡券背面)的行和布局,为您提供灵活的空间来放置补充信息、链接和文本。cardBarcodeSectionDetails:可用于自定义卡券上的条形码部分。


