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

Wallet 和 Apple Pay 有什么新功能

What's new in Wallet and Apple Pay

2020年6月23日

在 Apple 官方观看视频

一句话判断

Apple Pay 在 2020 年新增了「订单追踪」(Order Tracking)功能,用户可以在 Wallet 中查看物流状态,同时对开发者开放了 PassKit 的大量新 API——如果你做电商或餐饮 app,这些功能直接提升复购率。

这场 Session 讲了什么

这场 Session 聚焦于 Wallet 和 Apple Pay 在 iOS 14 中的更新,主要包括三个方向:

Apple Pay Order Tracking(订单追踪)。用户用 Apple Pay 完成支付后,商家可以把订单信息推送到 Wallet 中,用户可以实时查看订单状态、物流信息、预计送达时间。这取代了传统的「邮件确认 -> 打开链接查物流」的流程。

PassKit 增强。新增了 PKPaymentOrderPKShippingMethod 的扩展、以及更好的优惠券(Coupon)和购物卡(Store Card)管理。PKAddPassesViewController 支持一次性添加多张 Pass。

Apple Pay on the Web 的改进。Safari 14 中 Apple Pay on the Web 支持 Multi Merchant Payments(一笔支付分给多个商户),适合平台型电商。还新增了对 Payment Request API 的更好支持。

值得深挖的点

Order Tracking 的技术实现

订单追踪基于苹果的 Order API。商户在用户支付后,通过服务器向苹果注册一个订单(包含订单号、商品信息、物流状态),苹果会生成一个 Order URL。用户点击这个 URL 后,订单信息自动添加到 Wallet。后续物流更新通过 Webhook 推送到苹果,Wallet 中的订单状态实时刷新。

对电商 app 的价值

订单追踪的真正价值在于把「支付完成」到「收货确认」的整个流程留在苹果生态内。用户不需要打开你的 app 查物流,不需要保存邮件确认码,Wallet 就是唯一的入口。对于复购型业务来说,Wallet 中的「最近订单」本身就是一个持续的品牌触点。

代码片段

import PassKit

// 在支付完成后设置订单追踪
class ApplePayManager: NSObject, PKPaymentAuthorizationViewControllerDelegate {
    
    func startPayment() {
        let request = PKPaymentRequest()
        request.merchantIdentifier = "merchant.com.example.store"
        request.supportedNetworks = [.visa, .masterCard, .amex]
        request.merchantCapabilities = .capability3DS
        request.countryCode = "CN"
        request.currencyCode = "CNY"
        
        // 添加商品
        let item = PKPaymentSummaryItem(label: "iPhone 保护壳", amount: NSDecimalNumber(string: "199.00"))
        request.paymentSummaryItems = [item]
        
        let controller = PKPaymentAuthorizationViewController(paymentRequest: request)!
        controller.delegate = self
        present(controller, animated: true)
    }
    
    func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController,
                                             didAuthorizePayment payment: PKPayment,
                                             handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
        // 发送支付令牌到服务端
        let token = payment.token
        
        // 服务端处理后返回 orderTrackingURL(用于 Wallet 订单追踪)
        processPayment(token: token) { result in
            switch result {
            case .success(let orderInfo):
                // 设置订单追踪
                let orderDetails = PKPaymentOrderDetails(orderTrackingURL: orderInfo.trackingURL,
                                                          orderTypeIdentifier: "com.example.order")
                let authResult = PKPaymentAuthorizationResult(status: .success)
                authResult.orderDetails = orderDetails
                completion(authResult)
            case .failure:
                completion(PKPaymentAuthorizationResult(status: .failure))
            }
        }
    }
}

最佳实践

  1. 支付完成后一定要提供 orderTrackingURL。这是 iOS 14 的新能力,实现成本不高(服务端生成一个签名 URL 即可),但用户体验提升明显。用户习惯了在 Wallet 中查物流后,对你的 app 的依赖感会更强。
  2. 多商品订单要在 Payment Summary 中展示清楚PKPaymentSummaryItem 可以包含多个商品行和一个总计行。展示越清晰,用户对支付的信任度越高,纠纷率越低。
  3. Web 端 Apple Pay 和原生端保持一致的体验。如果你同时有 Web 和原生 app,订单追踪在两端都应该可用,不要出现 Web 支付后没有追踪的情况。

还有什么值得关注

  • Apple Pay 现在支持「延迟结算」(Deferred Payment),适合预订类场景(酒店、租车),用户授权支付但商户在服务完成后才扣款。
  • Wallet 的 Pass 更新现在支持通过 APNs 推送,不需要等用户主动刷新。
  • 苹果提供了 Order Tracking 的 JSON Schema 文档,你只需要按格式提供订单数据就能接入。
WWDC 2020