以编程方式将 credit/bank 卡添加到用户的苹果钱包

Programmatically add a credit/bank card to a user's apple wallet

我在一家银行工作,我正在从事一个以编程方式将用户的 credit/bank 卡添加到他们的苹果钱包的项目。此卡已由我行发行。

我们的应用程序已经拥有授权 com.apple.developer.payment-pass-provisioning。我能够填充配置并调用 PKAddPaymentPassViewController。模态加载正确,一旦用户单击下一步,我就会收到包含证书、随机数和随机数签名的响应。

我现在正在尝试调用需要字段 activationData、encryptedPassData、wrappedKey、ephemeralPublicKey 的 PKAddPaymentPassRequest

我正在阅读这里的文档

https://developer.apple.com/documentation/passkit/pkaddpaymentpassrequest?language=objc

我的理解是应用程序需要将证书、随机数和 nonceSignature 传递给我们的 api 然后使用这些证书加密信用卡信息等。我们的 api 将响应activationData、encryptedPassData、wrappedKey、ephemeralPublicKey,然后应用可以使用该数据调用 PKAddPaymentPassRequest 以完成该过程。

我不确定从 api 方面开始。如何使用证书正确生成所需的加密字符串?支付通行证的 json 格式是什么?有很多不同通行证的例子,但没有支付通行证。

是否有获取证书并生成 encryptedPassData 和其他字段的示例代码?我看到 developer.apple.com 上有一些通行证示例代码,但没有任何支付通行证的示例代码。

这个问题是我能找到的最接近我要问的问题。有一些评论询问服务器端实现,但答案不清楚

您可以通过在 server-side

上创建 .pkpass 来将信用卡添加到苹果钱包中

并在 ios 端下载该文件,它将添加到 ios 钱包

这是使用完成处理程序从服务器下载 .pkpass(存折文件)并显示 pkpassviewcontroller 以进一步添加到苹果钱包的代码。

  import PassKit


let url : NSURL! = NSURL(string: "YOUR .pkpass URL GOES HERE")
        let request: NSURLRequest = NSURLRequest(url:
            url as URL)
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)

    let task : URLSessionDataTask = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in

        var error: NSError?
        let pass = try? PKPass(data: data!, error: &error)
        if error != nil {
            DispatchQueue.main.async {
                let alertView = UIAlertView(title: "Error", message: (error?.localizedDescription)!, delegate: nil, cancelButtonTitle: "OK", otherButtonTitles: "Cancel")
                alertView.show()
            }
        }
        else {
            let passLibrary = PKPassLibrary()
            if passLibrary.containsPass(pass!) {
                DispatchQueue.main.async {
                    let alertView = UIAlertView(title: "Already Exist", message: "This pass already added in wallet. Thanks!", delegate: nil, cancelButtonTitle: "OK", otherButtonTitles: "Cancel")
                    alertView.show()
                    self.hideLoading()
                }
            } else {
                let pkvc = PKAddPassesViewController(pass: pass!)
                pkvc.delegate = self
                self.present(pkvc, animated: true, completion: {() -> Void in
                    // Do any cleanup here
                    self.hideLoading()
                })

            }
        }

    })
    task.resume()

PHP library to create passes for iOS wallet app

https://github.com/flexible-agency/php-pkpass

实施细节被视为机密,您必须联系 apple 以获得适当的文档