What's new in Wallet and Apple Pay
System & Services 进阶 20m

Wallet 与 Apple Pay 的新动态

What's new in Wallet and Apple Pay

2022年6月6日

在 Apple 官方观看视频

一句话判断

多商户支付、自动扣款、身份验证——Apple Pay 正在从一个支付按钮变成一整套支付基础设施。

这场 Session 讲了什么

Apple 在 iOS 16 中对 Wallet 和 Apple Pay 做了多项重大更新,涵盖了从支付按钮到后端结算的全链路:

SwiftUI 原生按钮:新增 AddPassToWalletButtonPayWithApplePayButton 两个 SwiftUI 组件,大幅减少集成代码量。支持 17 种按钮文案和可自定义的尺寸。

多商户支付(Multimerchant Payments):一笔交易可以为不同商户生成各自的支付 token。典型场景是在线旅游平台同时预订机票、酒店和租车——过去商户之间要传递信用卡信息,现在各拿各的 token,用户隐私得到保护。

自动扣款增强:支持在 Wallet 中管理和查看自动扣款设置。新增两种类型——循环扣款(订阅、分期)和自动充值(储值卡)。关键创新是 Apple Pay Merchant Token,它绑定用户的 Apple ID 而非设备,换手机后扣款不会中断。

订单追踪(Order Tracking):让用户在 Wallet 中查看订单状态,提升售后体验。

身份验证:支持将身份证件添加到 Wallet,用于应用内身份验证。

值得深挖的点

多商户支付的隐私模型是这次更新中最有设计感的部分。过去平台型商户的做法是拿到用户信用卡号后分发给各子商户分别扣款,用户对信用卡号流经了哪些商户完全没有感知。新 API 让平台为每个子商户生成独立的支付 token,各商户只能拿到属于自己的那部分授权金额。支付凭证表(payment sheet)也做了相应更新,用户可以展开看到每个商户的明细。

Merchant Token 的生命周期设计解决了移动支付中长期存在的一个痛点。传统支付 token 绑定设备,用户换手机后需要重新授权。Merchant Token 绑定 Apple ID,跨设备自动同步。对于做订阅制的应用来说,这直接减少了因设备更换导致的支付中断。

macOS 支付体验重设计用 SwiftUI 重新实现了 Apple Pay 支付凭证表,视觉风格与 iOS 统一。这意味着 iOS 和 macOS 的新功能可以同步发布,不再有平台差异。

代码片段

SwiftUI 中添加 Wallet 按钮:

// 添加登机牌到 Wallet
let pass = try! PKPass(data: passData)

AddPassToWalletButton(passes: [pass]) { added in
    // 用户是否添加了 pass
    self.isPassAdded = added
}
// 默认尺寸:宽 250,高 50
// 也支持自定义更大尺寸

多商户支付请求:

let request = PKPaymentRequest()
// 设置基本配置...

// 为每个子商户创建 token 上下文
let flightContext = PKPaymentTokenContext(
    merchantIdentifier: "merchant.flight",
    externalIdentifier: "flight-airline-123",
    merchantName: "环球航空",
    amount: NSDecimalNumber(value: 200)
)

let hotelContext = PKPaymentTokenContext(
    merchantIdentifier: "merchant.hotel",
    externalIdentifier: "hotel-chain-456",
    merchantName: "海景酒店",
    amount: NSDecimalNumber(value: 300)
)

// 所有子商户金额之和必须 <= 总金额
request.paymentTokenContexts = [flightContext, hotelContext]

Apple Pay 按钮集成:

let request = PKPaymentRequest()
// 配置支付请求...

PayWithApplePayButton(
    label: .buy,
    request: request
) { authorizationChange in
    // 处理授权状态变化
} fallback: {
    // Apple Pay 不可用时的回退视图
    Text("请使用其他支付方式")
}

最佳实践

  • externalIdentifier 要稳定:对同一商户始终使用相同的 externalIdentifier,不要每次生成新的
  • Token 金额要合理:所有子商户的 token 金额之和必须小于等于交易总额
  • 处理 pass 加载失败:pass 数据格式错误或签名不正确时 PKPass 初始化会抛异常,务必 try-catch
  • SwiftUI 按钮有最小尺寸约束:自定义尺寸时不要低于最小值,否则按钮显示会异常
  • macOS 用户也需要照顾:新 SwiftUI API 同时支持所有平台,一行代码覆盖 iOS/iPadOS/macOS/watchOS

还有什么值得关注

  • Tap to Pay on iPhone(碰一碰支付)已经在 iOS 15.4 上线美国市场,不需要额外硬件
  • 身份验证功能(IDs in Wallet)目前还在早期阶段,适用场景在逐步扩展
  • Wallet 的订单追踪功能对于电商类应用来说是提升用户粘性的好手段
  • Apple Pay 目前覆盖 72 个国家和地区,日均处理超百万笔交易,全球布局在加速
WWDC 2022