Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何向Stripe发送Apple Pay支付令牌以完成收费?_Ios_Swift_Swiftui_Stripe Payments - Fatal编程技术网

Ios 如何向Stripe发送Apple Pay支付令牌以完成收费?

Ios 如何向Stripe发送Apple Pay支付令牌以完成收费?,ios,swift,swiftui,stripe-payments,Ios,Swift,Swiftui,Stripe Payments,我使用的是swiftUI。我的代码目前仅使用PassKit。它与swiftUI很好地集成,我可以从apple pay获得加密的payment.token。我想使用该令牌,并在客户端对其进行令牌化(根据stripe docs,这是遵守法律的最佳方式),然后将其发送给stripe以完成支付。为了在保持兼容的同时发送和完成所有这些,我对调用什么API端点有疑问。文档仅显示使用Stripe SDK,这很难与swiftui集成 import PassKit import Stripe typealia

我使用的是swiftUI。我的代码目前仅使用PassKit。它与swiftUI很好地集成,我可以从apple pay获得加密的payment.token。我想使用该令牌,并在客户端对其进行令牌化(根据stripe docs,这是遵守法律的最佳方式),然后将其发送给stripe以完成支付。为了在保持兼容的同时发送和完成所有这些,我对调用什么API端点有疑问。文档仅显示使用Stripe SDK,这很难与swiftui集成

import PassKit
import Stripe


typealias PaymentCompletionHandler = (Bool) -> Void

class PaymentHandler: NSObject{

static let supportedNetworks: [PKPaymentNetwork] = [
    .amex,
    .masterCard,
    .visa
]

var paymentController: PKPaymentAuthorizationController?
var paymentSummaryItems = [PKPaymentSummaryItem]()
var paymentStatus = PKPaymentAuthorizationStatus.failure
var completionHandler: PaymentCompletionHandler?

    func startPayment(client: ClientData, completion: @escaping PaymentCompletionHandler) {
        let cartTotal = client.cart.totalPrice
        let salesTax = client.cart.tax

        let amount = PKPaymentSummaryItem(label: "Amount", amount: NSDecimalNumber(value: cartTotal), type: .final)
        let tax = PKPaymentSummaryItem(label: "Tax", amount: NSDecimalNumber(value: salesTax), type: .final)
        let total = PKPaymentSummaryItem(label: "ToTal", amount: NSDecimalNumber(value: cartTotal + salesTax), type: .final)

    paymentSummaryItems = [amount, tax, total];
    completionHandler = completion

    // Create our payment request
    let paymentRequest = PKPaymentRequest()
    paymentRequest.paymentSummaryItems = paymentSummaryItems
    paymentRequest.merchantIdentifier = "merchant.com.xxxxx"
    paymentRequest.merchantCapabilities = .capability3DS
    paymentRequest.countryCode = "US"
    paymentRequest.currencyCode = "USD"
//    .phoneNumber, .emailAddress, .postalAddress
    paymentRequest.requiredShippingContactFields = []
    paymentRequest.supportedNetworks = PaymentHandler.supportedNetworks

    // Display our payment request
    paymentController = PKPaymentAuthorizationController(paymentRequest: paymentRequest)
    paymentController?.delegate = self
    paymentController?.present(completion: { (presented: Bool) in
        if presented {
            NSLog("Presented payment controller")
        } else {
            NSLog("Failed to present payment controller")
            self.completionHandler!(false)
         }
     })
  }
}

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

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

//    // Perform some very basic validation on the provided contact information
//    if payment.shippingContact?.emailAddress == nil || payment.shippingContact?.phoneNumber == nil {
//        paymentStatus = .failure
//    } else {
//        // Here you would send the payment token to your server or payment provider to process
//        // Once processed, return an appropriate status in the completion handler (success, failure, etc)
//        paymentStatus = .success
//    }
    let data = payment.token.paymentData
    let json = try! JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]

    print(json)
    paymentStatus = .success
    completion(paymentStatus)
}

func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
    controller.dismiss {
        DispatchQueue.main.async {
            if self.paymentStatus == .success {
                print()
                self.completionHandler!(true)
            } else {
                self.completionHandler!(false)
            }
        }
    }
}

}

我正在考虑在.success上的PaymentAuthorizationControllerdFinish()函数中发送令牌/令牌化它,并让stripe完成充电

目前我认为步骤如下:

  • 点击apple Pay->将id发送回客户端时,在后端创建一个新的条带客户

  • 创建支付意图->将id发送回客户

  • 3。。。?我在这里丢失了发送条带以及支付来源,在我的情况下是一个加密的支付令牌由苹果公司

    我已尝试向发送请求?api并发送整个令牌,但它表示请求无效。我知道这是野蛮的强迫,但我很绝望:/

    更新2

    我曾经

        STPAPIClient.shared().createPaymentMethod(with: payment) { (source, err) in
            
            
            if let err = err {
                print(err.localizedDescription)
                self.paymentStatus = .failure
                completion(self.paymentStatus)
            }
            // returns a hashable [dictionary]
          
            guard let sourceDetails = source?.allResponseFields else
            {
                self.paymentStatus = .failure
                return
            }
            print(sourceDetails)
        
    
                AF.request("http://localhost:5001/rxxxxx/us-central1/paymentIntent", method: .post, parameters: ["data" : sourceDetails]).response { (response) in
                    if let data = response.data {
                        guard let res = String(data: data, encoding: .utf8) else {return}
                        print(res)
                    } else {
                        print("almo fire err")
                    }
    
    
                }
    
    我的后端从Stripe返回一个成功响应 [已删除]

    
    However, nothing has been charged or created in my Stripe dashboard.
    
    
    **UPDATE 3**
    
    I was able to confirm the payment intent using postman and calling the API and passing in the PayMent Method id directly. Still trying to implement using typescript.
    
    
    LAST QUESTION. Is this PCI compliance? I have zero idea how all this is working. No client is created in dashboard, is this even working? The charges are being posted though. I am just confused because everything that i passed around didn't even show a full card number....
    

    如果您没有使用Stripe iOS SDK,请尝试将PKPayment的属性传递给Stripe上的/v1/tokens端点,参数如下:和

    这将返回一个令牌对象。通过/v1/payment_methods端点使用该令牌对象(因为令牌是遗留的)创建PaymentMethod对象,并传递
    卡:{Token:tok_visa}
    ,这将返回PaymentMethod对象:


    现在,您可以将PaymentMethod附加到PaymentIntent并在服务器端确认。

    您好,对不起,我很抱歉。我确实有sdk,但由于swiftui的原因,无法遵循常规教程。因此,我将有效负载传递给以下API之一:?它不会返回任何我可以用来填充支付方法API的内容,比如信用卡详细信息。我尝试从stripe sdk使用createTokenWithPayment,但无法将其enocde为json发送到我的服务器并填写CreateCharge API。我尝试使用STPAPIClient.shared().createSource并将其传递到我的服务器中的createCharges是否正确?sdk方法创建的令牌是否是名为sources的createCharges参数的有效参数?您好。我发布了另一个更新。请看一看@嗯,看来你有一个付款意向和一个代币。您需要将该令牌发送到后端以确认服务器上的PaymentIntent。实际上,您似乎没有令牌对象。我鼓励您在iOS应用程序上使用STPAPIClient.shared.createTokenWithPayment()方法从Stripe获取令牌,以交换Apple Pay令牌