Apple Pay 令牌的交易金额不正确

Posted

技术标签:

【中文标题】Apple Pay 令牌的交易金额不正确【英文标题】:Apple Pay token's transaction amount is incorrect 【发布时间】:2019-11-20 16:34:11 【问题描述】:

Apple Pay 令牌包含错误的交易金额信息。例如,如果交易金额为 1.10 美元,在 ios 设备上,Apple Pay 屏幕仍然显示正确的金额,但 paymentToken 解密后返回 110

我使用这个库使用我自己的公私钥对解密 Apple Pay 令牌

https://github.com/sidimansourjs/applepay-token

我的示例代码

class ViewController: UIViewController 
...
 @IBAction func payBtn(_ sender: UIButton) 
        do 
            let paymentItem = PKPaymentSummaryItem.init(label: "Test item", amount: NSDecimalNumber(value: 1.10))
            let paymentNetworks = [PKPaymentNetwork.amex, .discover, .masterCard, .visa]

            if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) 

                let request = PKPaymentRequest()
                request.currencyCode = "SGD" // 1
                request.countryCode = "SG" // 2
                request.merchantIdentifier = "merchant.com.xxxxx" // 3
                request.merchantCapabilities = PKMerchantCapability.capability3DS // 4
                request.supportedNetworks = paymentNetworks // 5
                request.paymentSummaryItems = [paymentItem] // 6

                guard let paymentVC = PKPaymentAuthorizationViewController(paymentRequest: request) else 
                    displayDefaultAlert(title: "Error", message: "Unable to present Apple Pay authorization.")
                    return
                

                paymentVC.delegate = self
                self.present(paymentVC, animated: true, completion: nil)

             else 
                displayDefaultAlert(title: "Error", message: "Unable to make Apple Pay transaction.")
            
         catch 
            print(error.localizedDescription)
        

    


extension ViewController: PKPaymentAuthorizationViewControllerDelegate 
    func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) 
        dismiss(animated: true, completion: nil)
    
    func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) 

        let token = String(data: payment.token.paymentData, encoding: .utf8)
        let utf8str = token!.data(using: .utf8)

        if let base64Encoded = utf8str?.base64EncodedString()
        
            print("Encoded:  \(base64Encoded)")

            //Send token to backend server to decrypt
        
    


我在尝试向 Adyen(支付网关)发出支付请求时发现了这一点。请求必须同时包含 amount 字段和 paymentToken 字段,但从未成功,因为 amountpaymentToken 中的金额不匹配。然后我尝试amount 110 而不是 1.10 然后请求成功,但具有讽刺意味的是,在 Adyen 仪表板中它仍然以某种方式理解交易金额为 1.10 美元

我预计 Apple Pay 令牌中的 transactionAmount 是 1.10

请帮助解释为什么设备上和令牌中显示的 Apple Pay 金额存在这种差异

【问题讨论】:

支付处理器需要货币的最小单位,所以 110 = 1.10 你有这方面的参考吗? 【参考方案1】:

按照@Don 的建议找到答案 新加坡元 SGD 的最小单位是分,即一美元的 1/100。因此,我需要乘以 100 将美元金额转换为美分整数。然后,在发送到 Adyen 时使用此值

【讨论】:

以上是关于Apple Pay 令牌的交易金额不正确的主要内容,如果未能解决你的问题,请参考以下文章

从我的 Android 应用调用 Google Pay 意图时出现错误“您已超过银行设置的最大交易金额”

如何在 Google Pay 和 Apple Pay 中为 Authorize.net 生成支付令牌(在移动应用交易中)?

是否可以从 Apple Pay 令牌中获取卡类型?

Authorize.Net Paypal Express PHP API:交易未在 Authorize.Net 中更新,也未捕获正确金额的问题

更新连接中使用的列

带有企业电子邮件的静态 Pay Pal 链接,没有默认货币和金额