Apple Pay работает на симуляторе, но не на устройстве

Невозможно найти решение моей проблемы. Я могу отображать контроллер Apple Pay View на симуляторе, но не на устройстве.

Добавлено право и сертификат установлен.

Пожалуйста, порекомендуйте.

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

}

Приведенный выше код просто возвращает эту строку - сообщите пользователю, что ему нужно настроить Apple Pay!

В качестве устройства я использую iPhone 6s, и Apple Pay и Wallet включены с действующей дебетовой картой и кредитной картой. Я из Канады, поэтому я нахожусь в допустимом регионе.

Любая помощь будет оценена.

Отредактированный код

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

}

Entitlements консольная печать

3 ответа

Решение

С такой же проблемой я сталкиваюсь при включении Apple Pay в мое приложение. Убедитесь, что вы ввели всю действительную стоимость доставки, обслуживания и общую сумму платежа в сводную позицию PKPayment.

Кроме того, общая стоимость платежа должна быть больше 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 на реальных устройствах, потому что у вас может не быть карт, добавленных в приложение Wallet.

В этом случае вам необходимо выполнить Apple Pay - Sandbox Testing - Apple Developer и настроить учетную запись песочницы для тестирования Apple Pay.

Шаги:

  1. Перейдите на https://appstoreconnect.apple.com/access/testers и добавьте свою учетную запись тестера. Используйте новый адрес электронной почты, который не использовался ни с какими службами Apple.
  2. На своем iPhone перейдите в настройки, выйдите из учетной записи Apple ID и войдите в свою новую учетную запись тестера.
  3. Выберите свой регион, в котором доступна оплата через Apple Pay. Ej Соединенные Штаты (если еще не)
  4. Откройте приложение Wallet и добавьте новую карту.

Имя: Любой
Номер карты: 3499 569590 41362
Защитный код: 1111
Срок действия: 12/2022

  1. После успешного добавления карты откройте приложение iOS, и вы увидите, что теперь Apple Pay.

Убедитесь, что у вас есть карта, добавленная в ваш кошелек Apple Pay на устройстве, которое вы тестируете :) Просто, но это решение для меня.

Другие вопросы по тегам