Ios 无法在SwiftUI中实施Apple Pay

Ios 无法在SwiftUI中实施Apple Pay,ios,swift,xcode,swiftui,applepay,Ios,Swift,Xcode,Swiftui,Applepay,我正试图在我的SwiftUI应用程序中实现Apple Pay,但我一直无法显示按钮 我通过使用UIViewRepresentable import SwiftUI import UIKit import PassKit import Foundation struct ApplePayButton: UIViewRepresentable { func makeCoordinator() -> Coordinator { Coordinator() }

我正试图在我的SwiftUI应用程序中实现Apple Pay,但我一直无法显示按钮

我通过使用
UIViewRepresentable

import SwiftUI
import UIKit
import PassKit
import Foundation

struct ApplePayButton: UIViewRepresentable {
    func makeCoordinator() -> Coordinator {
        Coordinator()
    }
    
    func updateUIView(_ uiView: PKPaymentButton, context: Context) {

    }
    
    func makeUIView(context: Context) -> PKPaymentButton {
        let paymentButton = PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .black)
        return paymentButton
    }
    
    class Coordinator: NSObject, PKPaymentAuthorizationViewControllerDelegate  {
        func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
            //
        }

        func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void) {
            print("did authorize payment")

        }

        func paymentAuthorizationViewControllerWillAuthorizePayment(_ controller: PKPaymentAuthorizationViewController) {
            print("Will authorize payment")
        }
    }
}



class ApplePayManager: NSObject {
    let currencyCode: String
    let countryCode: String
    let merchantID: String
    let paymentNetworks: [PKPaymentNetwork]
    let items: [PKPaymentSummaryItem]

    init(items: [PKPaymentSummaryItem],
           currencyCode: String = "EUR",
           countryCode: String = "AT",
           merchantID: String = "c.c.c",
           paymentNetworks: [PKPaymentNetwork] = [PKPaymentNetwork.masterCard, PKPaymentNetwork.visa]) {
        self.items = items
        self.currencyCode = currencyCode
        self.countryCode = countryCode
        self.merchantID = merchantID
        self.paymentNetworks = paymentNetworks
    }

    func paymentViewController() -> PKPaymentAuthorizationViewController? {
        if PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: paymentNetworks) {
            let request = PKPaymentRequest()
            request.currencyCode = self.currencyCode
            request.countryCode = self.countryCode
            request.supportedNetworks = paymentNetworks
            request.merchantIdentifier = self.merchantID
            request.paymentSummaryItems = items
            request.merchantCapabilities = [.capabilityCredit, .capabilityDebit]
            return PKPaymentAuthorizationViewController(paymentRequest: request)
        }
        return nil
    }
}
我不想使用
PKPaymentAuthorizationController
,因为我想使用本机按钮

当我单击按钮时,出现以下错误:

[General]付款请求无效:错误域=pkpasskiterrodomain code=1“无效的应用内付款请求”UserInfo={NSLocalizedDescription=无效的应用内付款请求,NSUnderlyingError=0x600003AEBB0{Error域=pkpasskiterrodomain code=1“PKPaymentRequest必须包含至少1个PKPaymentSummaryItem类有效对象的NSArray属性‘paymentSummaryItems’”UserInfo={NSLocalizedDescription=PKPaymentRequest必须包含至少1个PKPaymentSummaryItem类有效对象的NSArray属性‘paymentSummaryItems’}

视图:


我做错了什么?

以防万一有人像我一样挣扎:下面是完整的代码

import Foundation
import PassKit

class PaymentHandler: NSObject, ObservableObject {
    func startPayment(paymentSummaryItems: [PKPaymentSummaryItem]) {
        
        // Create our payment request
        let paymentRequest = PKPaymentRequest()
        paymentRequest.paymentSummaryItems = paymentSummaryItems
        paymentRequest.merchantIdentifier = "merchant.de.xxx"
        paymentRequest.merchantCapabilities = .capability3DS
        paymentRequest.countryCode = "AT"
        paymentRequest.currencyCode = "EUR"
        paymentRequest.requiredShippingContactFields = [.phoneNumber, .emailAddress]
        paymentRequest.supportedNetworks = [.masterCard, .visa]
        
        // Display our payment request
        let paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
        paymentController.delegate = self
        paymentController.present(completion: { (presented: Bool) in })
    }
}


/**
 PKPaymentAuthorizationControllerDelegate conformance.
 */
extension PaymentHandler: PKPaymentAuthorizationControllerDelegate {

    func paymentAuthorizationController(_ controller: PKPaymentAuthorizationController, didAuthorizePayment payment: PKPayment, completion: @escaping (PKPaymentAuthorizationStatus) -> Void) {
        completion(.success)
        print("paymentAuthorizationController completion(.success)")
    }

    func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
        print("DidFinish")
    }
    
    func paymentAuthorizationControllerWillAuthorizePayment(_ controller: PKPaymentAuthorizationController) {
        print("WillAuthorizePayment")
    }

}

struct PaymentButton: UIViewRepresentable {
    func updateUIView(_ uiView: PKPaymentButton, context: Context) { }
    
    func makeUIView(context: Context) -> PKPaymentButton {
        return PKPaymentButton(paymentButtonType: .plain, paymentButtonStyle: .automatic)
    }
}
在视图中使用它:

PaymentButton()
    .frame(width: 228, height: 40, alignment: .center)
    .onTapGesture {
        paymentHandler.startPayment(paymentSummaryItems: paymentSummaryItems)
    }

您是如何传递项目的?错误消息显示您没有items@Paulw11我在问题中添加了视图代码。
var applePayManager=applePayManager(items:[PKPaymentSummaryItem(标签:“某些产品”,金额:9.99)])
我需要在这里设置委托吗?因为我尝试过,但我不能。我不太喜欢在视图中分配对象,比如
ApplePayManager
,因为视图是短暂的。从环境中传入一个实例。使用调试器查看
items
是否真的为空。我这样做了
request.paymentSummaryItems=[PKPaymentSummaryItem(标签:“某些产品”,金额:9.99)]
现在什么也没有发生。因此,
paymentViewController
应该打开付款表了吧?代理怎么办?我需要在
makeUIView(上下文:context)中设置它吗->PKPaymentButton
我尝试过,但无法尝试,因为没有
PKPaymentButtonDelegate
@Paulw11I也收到此警告:
调用“paymentViewController()”的结果未被使用
此处
。OnTap手势{applePayManager.paymentViewController()
PaymentButton()
    .frame(width: 228, height: 40, alignment: .center)
    .onTapGesture {
        paymentHandler.startPayment(paymentSummaryItems: paymentSummaryItems)
    }