Apple Pay 适用于模拟器,但不适用于设备
Apple Pay works on simulator but not on device
我可以在模拟器上显示 Apple Pay 视图控制器,但不能在设备上显示。
已添加授权并安装了证书。
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest!
override func viewDidLoad() {
super.viewDidLoad()
}
func rydes(shipping: Double) -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let discount = PKPaymentSummaryItem(label: "Discount", amount: -0.00)
let shipping = PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "\(shipping)"))
let subTotal = ryde.amount.adding(discount.amount)
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, discount, shipping, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelect shippingMethod: PKShippingMethod, completion: @escaping (PKPaymentAuthorizationStatus, [PKPaymentSummaryItem]) -> Void) {
completion(PKPaymentAuthorizationStatus.success, rydes(shipping: Double(shippingMethod.amount)))
} // paymentAuthorizationViewController( didSelectShippingMethod )
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantId = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantId
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes(shipping: 0.00)
// . . . shipping - not really needed
let samedayShipping = PKShippingMethod(label: "Same Day", amount: 12.99)
samedayShipping.detail = "Guaranteed same day delivery."
samedayShipping.identifier = "sameday"
let twodayShipping = PKShippingMethod(label: "Two Day", amount: 4.99)
twodayShipping.detail = "Guaranteed within two days."
twodayShipping.identifier = "twoday"
let freeShipping = PKShippingMethod(label: "Same Day", amount: 0.00)
freeShipping.detail = "Guaranteed same day."
freeShipping.identifier = "freeShipping"
paymentRequest.shippingMethods = [samedayShipping, twodayShipping, freeShipping]
// . . . shipping - not really needed
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}
上面的代码只是 returns 这一行 - 告诉用户他们需要设置 Apple Pay!
我使用的是 iPhone 6s,因为设备和 Apple Pay 和电子钱包已通过有效的借记卡和信用卡启用。我来自加拿大,所以我在一个有效的地区。
编辑代码
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest! // apple pay
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
func rydes() -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let subTotal = ryde.amount
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantID = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantID
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes()
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}
在我的应用程序启用 Apple Pay 期间,我遇到了同样的问题。确保您已在 PKPayment Summary Item 中输入所有有效的运费、服务和总付款价值。
此外,总付款值应大于 0.0 以显示付款网关方式视图。如果任何值为 0.0,则不要添加为 SummaryItem。
有效 PKPaymentSummaryItem 代码:
{
// 12.75 subtotal
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275
exponent:-2 isNegative:NO];
self.subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"Subtotal" amount:subtotalAmount];
// 2.00 discount
NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithMantissa:200 exponent:-2 isNegative:YES];
self.discount = [PKPaymentSummaryItem summaryItemWithLabel:@"Discount" amount:discountAmount];
// 12.75 - 2.00 = 10.75 grand total
NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
self.total = [PKPaymentSummaryItem summaryItemWithLabel:@"My Company Name" amount:totalAmount];
self.summaryItems = @[self.subtotal, self.discount, self.total];
request.paymentSummaryItems = self.summaryItems;
}
这将尝试解决您的上述问题。
编辑:
只需删除下面的代码并再次检查,或者如果折扣或运费的值大于 0.0,则检查条件,然后您可以将运费和折扣作为摘要项目发送:
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
//change some value here:
let discount = PKPaymentSummaryItem(label: "Discount", amount: -0.00)
let shipping = PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "\(shipping)"))
Make sure your subtotal or total is greater that 0.0.
let subTotal = ryde.amount.adding(discount.amount)
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
如果您可以在模拟器上看到 apple pay 选项,但对为什么它在真实设备上没有显示感到困惑,那么这个答案适合您。
最初,您可能在真实设备上看不到 Apple Pay 选项,因为您可能没有将任何卡添加到钱包应用程序。
在这种情况下,您必须按照Apple Pay - Sandbox Testing - Apple Developer设置一个沙盒帐户来测试apple pay。
步骤:
- 转到 https://appstoreconnect.apple.com/access/testers 并添加您的测试帐户。使用未用于任何 Apple 服务的新电子邮件地址。
- 从您的 iPhone,转到设置,从您登录的 Apple ID 注销,然后登录到您的新测试员帐户。
- Select 您所在的地区,可以使用 Apple Pay。 E.j。美国(如果还没有的话)
- 打开钱包应用程序并添加一张新卡。
Name: Any
Card Number: 3499 569590 41362
Security Code: 1111
Expiration Date: 12/2022
- 成功添加卡后,打开您的iOS应用程序,您现在可以看到苹果支付。
确保您已将一张卡添加到您正在测试的设备上的 Apple Pay 钱包中 :) 很简单,但对我来说是解决方法。
我可以在模拟器上显示 Apple Pay 视图控制器,但不能在设备上显示。
已添加授权并安装了证书。
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest!
override func viewDidLoad() {
super.viewDidLoad()
}
func rydes(shipping: Double) -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let discount = PKPaymentSummaryItem(label: "Discount", amount: -0.00)
let shipping = PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "\(shipping)"))
let subTotal = ryde.amount.adding(discount.amount)
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, discount, shipping, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didSelect shippingMethod: PKShippingMethod, completion: @escaping (PKPaymentAuthorizationStatus, [PKPaymentSummaryItem]) -> Void) {
completion(PKPaymentAuthorizationStatus.success, rydes(shipping: Double(shippingMethod.amount)))
} // paymentAuthorizationViewController( didSelectShippingMethod )
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantId = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantId
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes(shipping: 0.00)
// . . . shipping - not really needed
let samedayShipping = PKShippingMethod(label: "Same Day", amount: 12.99)
samedayShipping.detail = "Guaranteed same day delivery."
samedayShipping.identifier = "sameday"
let twodayShipping = PKShippingMethod(label: "Two Day", amount: 4.99)
twodayShipping.detail = "Guaranteed within two days."
twodayShipping.identifier = "twoday"
let freeShipping = PKShippingMethod(label: "Same Day", amount: 0.00)
freeShipping.detail = "Guaranteed same day."
freeShipping.identifier = "freeShipping"
paymentRequest.shippingMethods = [samedayShipping, twodayShipping, freeShipping]
// . . . shipping - not really needed
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}
上面的代码只是 returns 这一行 - 告诉用户他们需要设置 Apple Pay!
我使用的是 iPhone 6s,因为设备和 Apple Pay 和电子钱包已通过有效的借记卡和信用卡启用。我来自加拿大,所以我在一个有效的地区。
编辑代码
class ViewController: UIViewController, PKPaymentAuthorizationViewControllerDelegate {
var paymentRequest: PKPaymentRequest! // apple pay
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
func rydes() -> [PKPaymentSummaryItem] {
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
let subTotal = ryde.amount
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
return [ryde, total]
} // rydes() func
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
completion(PKPaymentAuthorizationStatus.success)
} // paymentAuthorizationViewController( didAuthorizePayment )
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
controller.dismiss(animated: true, completion: nil)
} // paymentAuthorizationViewControllerDidFinish()
@IBAction func applePayPressed(_ sender: Any) {
print("enable apple pay")
// send user to Apple Pay to make payment
let paymentNetworks = [PKPaymentNetwork.visa, .masterCard, .interac, .discover, .amex]
let merchantID = "merchant.com.xxx"
if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
paymentRequest = PKPaymentRequest()
paymentRequest.currencyCode = "CAD"
paymentRequest.countryCode = "CA"
paymentRequest.merchantIdentifier = merchantID
paymentRequest.supportedNetworks = paymentNetworks
paymentRequest.merchantCapabilities = .capability3DS
paymentRequest.requiredShippingAddressFields = [.all]
paymentRequest.paymentSummaryItems = self.rydes()
let applePayVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest)
applePayVC.delegate = self
self.present(applePayVC, animated: true, completion: nil)
} else {
print("Tell the user they need to set up Apple Pay!")
}
} // applePayPressed func ACTION
}
在我的应用程序启用 Apple Pay 期间,我遇到了同样的问题。确保您已在 PKPayment Summary Item 中输入所有有效的运费、服务和总付款价值。
此外,总付款值应大于 0.0 以显示付款网关方式视图。如果任何值为 0.0,则不要添加为 SummaryItem。
有效 PKPaymentSummaryItem 代码:
{
// 12.75 subtotal
NSDecimalNumber *subtotalAmount = [NSDecimalNumber decimalNumberWithMantissa:1275
exponent:-2 isNegative:NO];
self.subtotal = [PKPaymentSummaryItem summaryItemWithLabel:@"Subtotal" amount:subtotalAmount];
// 2.00 discount
NSDecimalNumber *discountAmount = [NSDecimalNumber decimalNumberWithMantissa:200 exponent:-2 isNegative:YES];
self.discount = [PKPaymentSummaryItem summaryItemWithLabel:@"Discount" amount:discountAmount];
// 12.75 - 2.00 = 10.75 grand total
NSDecimalNumber *totalAmount = [NSDecimalNumber zero];
totalAmount = [totalAmount decimalNumberByAdding:subtotalAmount];
totalAmount = [totalAmount decimalNumberByAdding:discountAmount];
self.total = [PKPaymentSummaryItem summaryItemWithLabel:@"My Company Name" amount:totalAmount];
self.summaryItems = @[self.subtotal, self.discount, self.total];
request.paymentSummaryItems = self.summaryItems;
}
这将尝试解决您的上述问题。
编辑: 只需删除下面的代码并再次检查,或者如果折扣或运费的值大于 0.0,则检查条件,然后您可以将运费和折扣作为摘要项目发送:
let ryde = PKPaymentSummaryItem(label: "Your Fare", amount: 1.00)
//change some value here:
let discount = PKPaymentSummaryItem(label: "Discount", amount: -0.00)
let shipping = PKPaymentSummaryItem(label: "Shipping", amount: NSDecimalNumber(string: "\(shipping)"))
Make sure your subtotal or total is greater that 0.0.
let subTotal = ryde.amount.adding(discount.amount)
let total = PKPaymentSummaryItem(label: "rydes", amount: subTotal)
如果您可以在模拟器上看到 apple pay 选项,但对为什么它在真实设备上没有显示感到困惑,那么这个答案适合您。
最初,您可能在真实设备上看不到 Apple Pay 选项,因为您可能没有将任何卡添加到钱包应用程序。
在这种情况下,您必须按照Apple Pay - Sandbox Testing - Apple Developer设置一个沙盒帐户来测试apple pay。
步骤:
- 转到 https://appstoreconnect.apple.com/access/testers 并添加您的测试帐户。使用未用于任何 Apple 服务的新电子邮件地址。
- 从您的 iPhone,转到设置,从您登录的 Apple ID 注销,然后登录到您的新测试员帐户。
- Select 您所在的地区,可以使用 Apple Pay。 E.j。美国(如果还没有的话)
- 打开钱包应用程序并添加一张新卡。
Name: Any
Card Number: 3499 569590 41362
Security Code: 1111
Expiration Date: 12/2022
- 成功添加卡后,打开您的iOS应用程序,您现在可以看到苹果支付。
确保您已将一张卡添加到您正在测试的设备上的 Apple Pay 钱包中 :) 很简单,但对我来说是解决方法。