【问题标题】:Setting up Stripe serverless with firebase for ios使用 Firebase 为 ios 设置 Stripe 无服务器
【发布时间】: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)
          }
        }
}

【问题讨论】:

标签: swift firebase stripe-payments checkout


【解决方案1】:

不是 Firebase 专家,但我推荐以下内容:

  1. 利用适用于 iOS 的“一次性付款”文档:https://stripe.com/docs/payments/accept-a-payment#ios

这些显示了您在 iOS SDK 中设置了哪些组件以在您的应用中收集卡详细信息并确认您的应用中的付款。

  1. 使用 https://github.com/firebase/functions-samples/blob/master/stripe/functions/index.js#L85-L116 作为参考来构建您的 Firebase 函数。

这显示了您的 Firebase 函数将如何创建 PaymentIntent 并将其 client_secret 返回到您的移动应用。

【讨论】:

  • 感谢您的回复。我正在关注第一个链接,但我一定会查看第二个链接。
  • 所以我将我的 index.js 更改为那个 index.js,然后我将重新部署它。我不太清楚我必须做什么才能迅速击中这些端点(例如密钥)?有这方面的指南吗?
  • 我发现了这个:firebase.google.com/docs/functions/callable 它有一个调用添加消息的快速示例。试图弄清楚如何使其适应 JS 函数。
猜你喜欢
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多