【发布时间】:2020-11-04 08:26:43
【问题描述】:
因此,对于如何在 iOS 中使用 Firebase 设置 Stripe 无服务器,并没有真正的指南。有人知道这方面的一些现有资源吗?我一直在参考他们为 web 设置它的指南,我猜后端将是相同的,因为它使用了 firebase。我目前在这里使用本指南:How to set up firebase as server and execute stripe payment。我已经按照说明在 JS 中创建了 index.js 中的 create Payment 方法。但是,我需要得到我认为的秘密,我不知道该怎么做,因为它没有被涵盖。我已通过 CLI 命令将秘密保存到 firebase,但我不确定如何检索它?我一直在浏览条纹 iOS 文档,并创建了结帐,但通过后端在我的 ios 应用程序中获取密钥我不知道该怎么做?
这是我目前的代码,当点击它时,它只会进入guard let paymentIntentClientSecret
仍在努力寻找更好的解决方案。
import UIKit
import Stripe
import FirebaseFunctions
class CheckoutViewController: UIViewController, STPAuthenticationContext {
func authenticationPresentingViewController() -> UIViewController {
return self
}
var paymentIntentClientSecret: String?
lazy var functions = Functions.functions()
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()
}
@objc
func pay() {
guard let paymentIntentClientSecret = paymentIntentClientSecret else {
return;
}
// 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(withParams: paymentIntentParams, authenticationContext: 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
}
}
}
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() {
let arguments = ["amount": 100,"currency": "usd","payment_method":"card"] as [String : Any]
functions.httpsCallable("createStripePayment").call(arguments) { (result, error) in
if let error = error as NSError? {
if error.domain == FunctionsErrorDomain {
let code = FunctionsErrorCode(rawValue: error.code)
let message = error.localizedDescription
let details = error.userInfo[FunctionsErrorDetailsKey] as! String
print("Error " + message + details)
}
// ...
}
//if let text = (result?.data as? [String: Any])?["text"] as? String {
//self.resultField.text = text
//print("API Call came back with " + text)
}
}
}
【问题讨论】:
-
我找到了这个:iosapptemplates.com/blog/ios-development/stripe-firebase-swift,接下来几天会继续关注。
标签: swift firebase stripe-payments checkout