Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.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 找不到具有指定主机名的服务器。加载页面时出错。条带,firebase后端_Ios_Firebase_Firebase Realtime Database_Google Cloud Functions_Stripe Payments - Fatal编程技术网

Ios 找不到具有指定主机名的服务器。加载页面时出错。条带,firebase后端

Ios 找不到具有指定主机名的服务器。加载页面时出错。条带,firebase后端,ios,firebase,firebase-realtime-database,google-cloud-functions,stripe-payments,Ios,Firebase,Firebase Realtime Database,Google Cloud Functions,Stripe Payments,下面我将使用Firebase实时数据库作为后端,为iOS应用程序实现一个支付系统 当我运行我的应用程序时,按下一个按钮从Stripe调出checkout controller,我得到以下错误: 找不到具有指定主机名的服务器。加载页面时出错 它可能是指这一行:let BackendUrl=”https://appName-a3119-default-rtdb.firebaseio.com“firebase实时数据库控制台提供给我的url。 我的代码如下所示: import UIKit impor

下面我将使用Firebase实时数据库作为后端,为iOS应用程序实现一个支付系统

当我运行我的应用程序时,按下一个按钮从Stripe调出checkout controller,我得到以下错误:

找不到具有指定主机名的服务器。加载页面时出错

它可能是指这一行:
let BackendUrl=”https://appName-a3119-default-rtdb.firebaseio.com“
firebase实时数据库控制台提供给我的url。

我的代码如下所示:

import UIKit
import Stripe

let BackendUrl = "https://appName-a3119-default-rtdb.firebaseio.com"

class CheckoutViewController: UIViewController {

    var paymentIntentClientSecret: String?

    lazy var cardTextField: STPPaymentCardTextField = {
        let cardTextField = STPPaymentCardTextField()
        return cardTextField
    }()
    lazy var payButton: UIButton = {
        let button = UIButton(type: .custom)
        button.layer.cornerRadius = 5
        button.backgroundColor = .systemBlue
        button.titleLabel?.font = UIFont.systemFont(ofSize: 22)
        button.setTitle("Pay", for: .normal)
        button.addTarget(self, action: #selector(pay), for: .touchUpInside)
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let stackView = UIStackView(arrangedSubviews: [cardTextField, payButton])
        stackView.axis = .vertical
        stackView.spacing = 20
        stackView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(stackView)
        NSLayoutConstraint.activate([
            stackView.leftAnchor.constraint(equalToSystemSpacingAfter: view.leftAnchor, multiplier: 2),
            view.rightAnchor.constraint(equalToSystemSpacingAfter: stackView.rightAnchor, multiplier: 2),
            stackView.topAnchor.constraint(equalToSystemSpacingBelow: view.topAnchor, multiplier: 2),
        ])
        startCheckout()

    }

    func displayAlert(title: String, message: String, restartDemo: Bool = false) {
        DispatchQueue.main.async {
            let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
            if restartDemo {
                alert.addAction(UIAlertAction(title: "Restart demo", style: .cancel) { _ in
                    self.cardTextField.clear()
                    self.startCheckout()
                })
            }
            else {
                alert.addAction(UIAlertAction(title: "OK", style: .cancel))
            }
            self.present(alert, animated: true, completion: nil)
        }
    }

    func startCheckout() {
        // Create a PaymentIntent by calling the sample server's /create-payment-intent endpoint.
        let url = URL(string: BackendUrl + "create-payment-intent")!
        let json: [String: Any] = [
            "currency": "usd",
            "items": [
                "id": "photo_subscription"
            ]
        ]
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try? JSONSerialization.data(withJSONObject: json)
        let task = URLSession.shared.dataTask(with: request, completionHandler: { [weak self] (data, response, error) in
            guard let response = response as? HTTPURLResponse,
                response.statusCode == 200,
                let data = data,
                let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any],
                let clientSecret = json["clientSecret"] as? String,
                let publishableKey = json["publishableKey"] as? String else {
                    let message = error?.localizedDescription ?? "Failed to decode response from server."
                    self?.displayAlert(title: "Error loading page", message: message)
                    
                    return print(message, "Error loading page.")
            }
            print("Created PaymentIntent")
            self?.paymentIntentClientSecret = clientSecret
            // Configure the SDK with your Stripe publishable key so that it can make requests to the Stripe API
            // For added security, our sample app gets the publishable key from the server
            Stripe.setDefaultPublishableKey(publishableKey)
        })
        task.resume()
    }
    

    @objc func pay() {
        guard let paymentIntentClientSecret = paymentIntentClientSecret else {
            print(self.paymentIntentClientSecret, " paymentIntentClientSecret is null")
            return;
        }
        
        print("paymentIntentClientSecret was not nil")
        // Collect card details
        let cardParams = cardTextField.cardParams
        let paymentMethodParams = STPPaymentMethodParams(card: cardParams, billingDetails: nil, metadata: nil)
        let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntentClientSecret)
        paymentIntentParams.paymentMethodParams = paymentMethodParams

        // Submit the payment
        let paymentHandler = STPPaymentHandler.shared()
        paymentHandler.confirmPayment(paymentIntentParams, with: self) { (status, paymentIntent, error) in
            switch (status) {
            case .failed:
                self.displayAlert(title: "Payment failed", message: error?.localizedDescription ?? "")
                break
            case .canceled:
                self.displayAlert(title: "Payment canceled", message: error?.localizedDescription ?? "")
                break
            case .succeeded:
                self.displayAlert(title: "Payment succeeded", message: paymentIntent?.description ?? "", restartDemo: true)
                break
            @unknown default:
                fatalError()
                break
            }
        }
    }
}

extension CheckoutViewController: STPAuthenticationContext {
    func authenticationPresentingViewController() -> UIViewController {
        return self
    }
}

尝试在
BackendUrl

的值上添加一个尾随斜杠。这样做了,现在我得到一个不同的错误:无法解码来自服务器的响应。加载页面时出错。请检查服务器端日志,查看是否存在错误。您好,您可以指定从日志中获得的错误吗?