Ios 找不到具有指定主机名的服务器。加载页面时出错。条带,firebase后端
下面我将使用Firebase实时数据库作为后端,为iOS应用程序实现一个支付系统 当我运行我的应用程序时,按下一个按钮从Stripe调出checkout controller,我得到以下错误: 找不到具有指定主机名的服务器。加载页面时出错 它可能是指这一行: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
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
的值上添加一个尾随斜杠。这样做了,现在我得到一个不同的错误:无法解码来自服务器的响应。加载页面时出错。请检查服务器端日志,查看是否存在错误。您好,您可以指定从日志中获得的错误吗?