Apple Pay 令牌的交易金额不正确
Apple Pay token's transaction amount is incorrect
Apple Pay 令牌包含错误的交易金额信息。例如,如果交易金额为 1.10 美元,在 iOS 设备上,Apple Pay 屏幕静止显示正确的金额,但 paymentToken returns 110 解密时
我使用这个库使用我自己的 public-私钥对解密 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
字段,但从未成功,因为 amount
和 paymentToken
中的金额不匹配。然后我尝试 amount
110 而不是 1.10 然后请求成功,但具有讽刺意味的是,在 Adyen 仪表板中它仍然理解交易金额为 $1.10
我预计 Apple Pay 令牌中的 transactionAmount
为 1.10
请帮助解释为什么设备上和令牌中显示的 Apple Pay 金额存在差异
找到@Don 建议的答案
新加坡元 SGD 的最小单位是分,即一美元的 1/100。因此,我需要通过乘以 100 将美元金额转换为美分整数。然后,在发送给 Adyen
时使用此值
Apple Pay 令牌包含错误的交易金额信息。例如,如果交易金额为 1.10 美元,在 iOS 设备上,Apple Pay 屏幕静止显示正确的金额,但 paymentToken returns 110 解密时
我使用这个库使用我自己的 public-私钥对解密 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
字段,但从未成功,因为 amount
和 paymentToken
中的金额不匹配。然后我尝试 amount
110 而不是 1.10 然后请求成功,但具有讽刺意味的是,在 Adyen 仪表板中它仍然理解交易金额为 $1.10
我预计 Apple Pay 令牌中的 transactionAmount
为 1.10
请帮助解释为什么设备上和令牌中显示的 Apple Pay 金额存在差异
找到@Don 建议的答案 新加坡元 SGD 的最小单位是分,即一美元的 1/100。因此,我需要通过乘以 100 将美元金额转换为美分整数。然后,在发送给 Adyen
时使用此值