借助会员注册和登录功能,用户可以直接通过 Google 钱包搜索您的会员卡,并加入或登录他们的账号。系统会将用户转到您的适合移动设备浏览的网站以完成此流程,之后他们就能将官方卡添加到 Google 钱包了。
实现此功能是将“静态”用户添加的卡券转换为“动态”API 关联的卡券的前提条件。本指南简要介绍了为您的会员卡启用注册、登录和卡券升级功能时需要执行的实施步骤。
概览
首先,请确保您之前已设置好项目并可以访问 Google 钱包 API。
您必须按照以下四个步骤来实现此功能:
- 设置测试卡券:配置 Google 钱包以测试您的流程。
- 开发页面:使用 Google 钱包
SharedDataType构建注册/登录页面。 - 实现推回:在操作后将会员卡发送到 Google 钱包。
- 申请验证:提交以供审核并申请升级激活。
为什么要实施会员注册?
为了了解此集成带来的价值,请务必区分 Google 钱包中存在的两种类型的卡券:L1(用户添加)和 L2(合作伙伴发放)。
L1 与 L2 之间的区别
| 功能 | L1 通行证(用户添加) | L2 通行证(合作伙伴发放) |
|---|---|---|
| 来源 | 在用户手动扫描实体卡或输入号码时创建。 | 在用户通过您的流程注册或登录后,使用 Wallet API 创建并推送。 |
| 控制 | 静态。合作伙伴无法查看或控制此卡券。 | 动态。合作伙伴可以使用 API 完全控制。 |
| 功能 | 条形码的静态图片。无法更新。 | 可以更新积分余额、会员等级、显示个性化优惠和接收通知。 |
升级路径:通往计划的“桥梁”
通过构建会员注册流程(“目的地”),您可以让 Google 构建“桥梁”,将用户从静态 L1 卡券升级到您的官方 L2 卡券。主要有两种升级触发器:
- L1 到 L2 的卡券升级:如果用户之前手动添加了您的卡券 (L1),Google 钱包可以提示他们访问您的新登录流程,以升级为正式的动态卡券 (L2)。
- Gmail 导入的卡券升级:如果 Google 钱包检测到用户使用 Gmail 的会员卡,则可以提示用户访问您的流程并进行身份验证,以接收正式的 L2 卡券。
第 1 步:在 Google 钱包中设置测试卡券
确定注册和登录网址、会员卡徽标和所选的用户字段。然后,使用 loyaltyclass 中的 discoverableProgram 嵌套字段来设置适当的值。
在 discoverableProgram 中设置值,为您已启用注册/登录功能的会员卡创建草稿版本。为确保测试人员可以看到此版本,请验证测试人员是否有权访问您的 Google Pay 和钱包控制台。如需详细了解如何与他人共享 Google Pay 和 Google 钱包控制台的访问权限,请参阅了解“用户”页面。
如需在开发过程中完成实现功能的验证,请使用 Google Pay 和钱包控制台中的“与支持团队联系”微件与我们联系。在控制台中,选择主题中的 Google Wallet API,并在子主题中选择会员回馈活动注册/报名。
第 2 步:开发注册和登录页面
当用户选择登录或注册您的会员卡时,系统会将他们转到您网站上的定制网页以完成注册或登录流程。如果用户选择注册,Google 钱包会要求用户批准与您共享其用户数据。
您需要提供以下两个页面之一或全部,以便用户完成这些操作:
- 用户可登录现有账号的登录网址。
- 用户可创建新账号的注册网址。
您的登录和注册页面必须符合以下要求:
- 提供适合移动设备的用户体验。
- 在注册流程中尽量减少必填字段的数量。
- 允许用户在一个页面内完成登录或注册。
- 同时使用
HTTPS加密与有效证书,确保安全地传输用户数据。 - 确保登录和注册页面的正常运行时间至少达到 99.9%。
除上述要求外,我们还建议您允许用户在注册您的会员卡时无需填写任何表单或保留页面(只是为了让用户接受您的服务条款)。
- 通过利用
SharedDataType中提供的用户数据,您可以创建一个账号并立即推回他们的会员卡。 - 您随后可以通过电子邮件向用户发送一次性密码,或用于配置其密码和可选账号详情的链接。
- 此举有助于减少用户放弃注册流程的概率,因为每增加一个步骤都可能会导致用户放弃注册。
在显示登录或注册页面时,Google 钱包会创建一个 Android WebView,并对您提供的网址发出一个 POST 请求。用户数据在参数 SharedDataType 中提供,该参数包含在使用 Content-Type 为 application/x-www-form-urlencoded 和 UTF-8 编码的 POST 请求中。SharedDataType 参数的值是 Base64 编码的 JSON 对象。
根据用户选择的操作以及您已指定要向用户请求的字段,JSON 对象可能包含以下字段。
| 字段 | 注册 |
|---|---|
| 电子邮件 | ✓ |
| firstName | ✓ |
| lastName | ✓ |
| addressLine [1-3] | ✓ |
| city | ✓ |
| 州 | ✓ |
| zipcode | ✓ |
| country | ✓ |
| 电话 | ✓ |
请参阅以下 SharedDataType 中包含的已解码 JSON 对象示例。
资源
{
"firstName": "Jane",
"lastName": "Doe",
"addressLine1": "1600 Amphitheatre Pkwy",
"addressLine2": "Apt 123",
"addressLine3": "Attn:Jane",
"city": "Mountain View",
"state": "CA",
"zipcode": "94043",
"country": "US",
"email": "jane.doe@example.com",
"phone": "555-555-5555"
}
第 3 步:立即将会员卡推回 Google 钱包
完成身份验证(登录)或创建账号(注册)后,您的网页应立即将用户的会员卡推回 Google 钱包。
您可以通过重定向至遵循以下结构的链接,将会员卡推回 Google 钱包。
https://pay.google.com/gp/v/save/{jwt_generated}
网址的安全长度为 2000 个字符。您的链接不应超出此限制。编码到 JWT 中的对象要精简,只包含用户专属数据。尽量将大部分数据放入对象的类中,而且应在生成 JWT 之前创建类。对于不符合长度限制的较大对象,请考虑先在 Google Wallet API 中创建对象,并且只将对象 ID 发送到 JWT。
典型的通信流程
完成注册或登录的用户的通信流程如下图所示。“您的服务器”之间的所有操作都由您负责实现。

第 4 步:请求验证和激活
完成开发工作并测试注册/登录流程后,您必须提交请求,以便我们审核您的实现并将其完全激活。
- 前往 Google Pay 和 Wallet 控制台。
- 使用与支持团队联系微件。
- 告知支持团队您已完成会员注册集成。
在对您的实现进行全面审核以确认与 Google 钱包应用结合使用的正确功能后,我们就会为您的会员卡公开推出会员注册/登录功能。
为了确保最佳的用户体验,我们会定期检查您的注册/登录实现情况,以确保始终符合功能要求。如果出现差异,系统会通知您,并可能会停用登录/注册功能,直到问题得到解决为止。
常见问题解答
对会员卡中使用的图片是否有要求? 是的,您的图片应托管在
HTTPS位置,否则将无法在 Google 钱包中显示。是否有工具可以简化 JWT 的实施和调试? 是的,借助诸如 www.jwt.io 之类的平台可以在开发流程中解码和调试令牌,从而验证您要提交的内容。请注意,Google 没有任何关联公司,也不会特别推荐任何此类第三方。
如何正确处理 Base64 编码的
SharedDataType数据? 确保您在整个流程中使用的是 UTF-8 编码。JSON 字符串会先进行 UTF-8 编码,然后使用 android.util.Base64(包含 NO_WRAP 和 网址_SAFE 选项)进行编码。这与 RFC 3548 第 4 节相对应。