无法使用 Firebase 和 Stripe 正确解析 Json

2024-02-19

错误是- 线程 7:“无法解析遵循协议 STPCustomerEphemeralKeyProvider 的临时密钥响应。请确保您的后端将临时密钥的未修改 JSON 发送到您的应用程序。有关详细信息,请参阅https://stripe.com/docs/mobile/ios/standard#prepare-your-api” https://stripe.com/docs/mobile/ios/standard#prepare-your-api%22

screenshot of the error is - enter image description here my MyAPIClient -

    import Stripe
       import UIKit
         class MyAPIClient: NSObject, STPCustomerEphemeralKeyProvider {
let baseURL = URL(string: "https://api.stripe.com")!

    func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) {
        let url = self.baseURL.appendingPathComponent("ephemeral_keys")
        var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)!
        urlComponents.queryItems = [URLQueryItem(name: "api_version", value: apiVersion)]
        var request = URLRequest(url: urlComponents.url!)
        request.httpMethod = "POST"
        let task = URLSession.shared.dataTask(with: request, completionHandler: { (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]) as [String : Any]??) else {
                completion(nil, error)
                return
            }
            completion(json, nil)
        })
        task.resume()
    }
}

视图控制器代码 -

   import UIKit
   import Stripe
   import FirebaseFunctions

  class paymentViewController: UIViewController {

@IBOutlet weak var paymentMethodButton: UIButton!
@IBOutlet weak var proceedToCheckoutButton: UIButton!

var paymentContext: STPPaymentContext!

override func viewDidLoad() {
    super.viewDidLoad()
    setupStripeConfig()
}

@IBAction func checkoutButtonClicked(_ sender: Any) {
    paymentContext.requestPayment()
}

@IBAction func paymentMethodClicked(_ sender: Any) {
    print("Payment Method Button Clicked")
    paymentContext.presentPaymentOptionsViewController()
}

func setupStripeConfig() {
    let config = STPPaymentConfiguration.shared()
    config.requiredBillingAddressFields = .none
    config.requiredShippingAddressFields = .none

    let customerContext = STPCustomerContext(keyProvider: MyAPIClient())
    paymentContext = STPPaymentContext(customerContext: customerContext, configuration: config, theme: .default())
    paymentContext.paymentAmount = 1000

    paymentContext.delegate = self
    paymentContext.hostViewController = self
     }
    }

   extension paymentViewController: STPPaymentContextDelegate {

  func paymentContextDidChange(_ paymentContext: STPPaymentContext) {
    self.paymentMethodButton.titleLabel?.text = paymentContext.selectedPaymentOption?.label
}


func paymentContext(_ paymentContext: STPPaymentContext, didFailToLoadWithError error: Error) {
    //When stripeID isn't valid or Ephemeral key could not be retrieved for some reason. Handle this with UIAlert stating error and make user re-enter info
    self.navigationController?.popViewController(animated: true)
}

func paymentContext(_ paymentContext: STPPaymentContext, didCreatePaymentResult paymentResult: STPPaymentResult, completion: @escaping STPPaymentStatusBlock) {

    var data = [
        "customer":"Abhishek"
    ]
    //Pull Payment Method
    Functions.functions().httpsCallable("getPaymentMethods").call(data) { (result, err) in
        if err != nil {
            print("Error \(String(describing: err))")
            return
        }

        print(result)
    }


       let idempotency = UUID().uuidString.replacingOccurrences(of: "-", with: "")
        var paymentMethod = paymentContext.selectedPaymentOption

    let dataToSend: [String : Any] = [
        "amount" : 5000,
        "customer" : "Abhishek",
    ]

       Functions.functions().httpsCallable("createPaymentIntent").call(dataToSend) { (result, err) in
        if err != nil {
            print("Error \(String(describing: err))")
            return
           }

          //var paymentParam = STPPaymentIntentParams(clientSecret: result as! String)
        print(result)
       }
   }

  func paymentContext(_ paymentContext: STPPaymentContext, didFinishWith status: STPPaymentStatus, error: Error?) {

   }

  }

该如何整理呢?


创建临时密钥的请求必须在服务器端发出(使用密钥),并且您的 iOS 代码应该向您自己的服务器发出请求,该服务器进而调用 Stripe 的 API。

现在,您的代码(在MyApiClient)正在尝试直接调用 Stripe 的 API 来创建客户端的临时密钥。这是行不通的,如果您记录请求响应或检查仪表板以查看最近的请求,您可能会看到某种错误消息。

您应该查看 Stripe 的文档,了解如何创建临时密钥- 他们遍历所有代码,并且还有一个可用于测试的故障端点。由于您使用 Firebase,您还可以查看示例here https://github.com/stripe-samples/firebase-mobile-payments/tree/5cf9ab12c01576a8f5e3a654470467579cc2c014.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Firebase 和 Stripe 正确解析 Json 的相关文章

随机推荐

  • 删除 R 中选择性 NA 的有价值行[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 1 2 abc NA NA NA NA 2 3 abd be f NA NA 4 5 NA NA NA NA NA 现在 我想删除那些包含从第 3 列开始的所有 NA 的行 我正在做这样的
  • 每2秒更换一次图片

    我积累了一点 所以如果有人有任何想法 那会很有帮助 目前该程序正在编译并运行 但我不知道如何完成它 我正在使用日食 我想做的是 当我启动程序时 每 2 秒更换 4 张不同的图片 所以如果您有任何建议 请不要害羞 这是程序 Here is t
  • MySQL 查询和数据透视表

    我的 MySQL 数据库具有以下列标题 month typeOfWork totalHours 我有兴趣根据工作类型和月份显示结果 例如 所有 typeOfWork 条目将显示在左侧第一列中 并且每个字段将汇总每列指定月份中的特定 type
  • 在 Swift 中使用 Parse 获取 Twitter 个人资料图像

    在 Swift 中没有找到任何关于此的信息 所以我问 如何使用 Parse 从 Twitter 获取已登录用户的个人资料图片 用户已经通过解析内部登录 signupController 登录 var username PFUser curr
  • Dask 数据帧并行任务

    我想从数据帧创建功能 附加列 并且我有以下许多功能的结构 遵循本文档https docs dask org en stable delayed best practices html https docs dask org en stabl
  • 有什么办法可以逃避弹性beanstalk环境变量中的“非法字符”?

    我正在尝试为 Rails 应用程序创建一个新的弹性 beanstalk 环境 并且将现有 RDS 实例的详细信息作为环境变量传递 该 RDS 实例是根据前一个 Elastic beanstalk 实例的快照创建的 但是该实例是由 Elast
  • NightwatchJS .elements 返回字符串而不是对象

    我正在使用 nightwatch 并尝试迭代元素列表 但是 当我没有获取对象或元素时 但我得到了一个字符串数组 CODE browser elements css selector ele function r browser perfor
  • Spring Repository 接口中使用 sort() 和 limit() 进行查询

    我是 Spring Data with MongoDB 的新手 希望在我的 MongoRepository 扩展接口中拥有一个自动生成的查询方法 该方法需要过滤 排序和限制 查询如下所示 created is the field I nee
  • 在 QT 中将配置设置保存到 XML 文件吗?

    我想将配置设置保存到 QT 中的 XML 文件并从那里读取它 在 QT 中执行此操作的最佳方法是什么 任何样品 想法都受到高度赞赏 Thanks 您可以使用以下方式注册您的 XML 文件格式QSettings registerFormat
  • CakePHP:验证消息不显示

    我是 cakePHP 的新手 我按照一些教程制作了一个简单的表单 在这个 html 表单上我使用了验证 现在的问题是验证正在工作 但消息没有显示我希望它显示的内容 我尝试了下面的代码 Model public validate array
  • JS - 如何提交表单 onclick 并发送提交按钮

    我需要通过按钮提交表单 这超出了 JavaSript 表单的范围
  • 使用向上/向下滑动动画显示和隐藏视图

    我有一个LinearLayout我想用一个来显示或隐藏Animation每当我改变布局的可见性时 它就会向上或向下推动布局 我见过一些样品 但没有一个适合我的需要 我已经为动画创建了两个 xml 文件 但当我更改动画的可见性时 我不知道如何
  • addClass 不适用于 iPhone Chrome

    changing navbar background color by scrolling window scroll function if this scrollTop gt 20 tab nav addClass tab scroll
  • 使用 imshow 绘制时间序列

    我试图使标题尽可能清晰 尽管我不确定它是否完全清晰 我有三个系列的数据 随时间变化的事件数量 我想做一个代表三个时间序列的子图 你会发现附件是我能想到的最好的 上一个时间序列明显较短 这就是为什么它在此处不可见的原因 我还添加了相应的代码
  • 通过单击图像显示/隐藏 div

    我希望能够单击图像来显示 隐藏 div 带有文本 我已经对一张图像进行了此操作 但我有多个图像需要切换文本 JavaScript 代码 document ready function slidingDiv hide show hide sh
  • 比较 Realm 对象列表

    我想比较 2 个 Realm 对象列表 看看它们是否相同 这是该物体的样子 class ScheduleRealm Object let scheduleList List
  • 使用 JavaScript 在画布中获取鼠标位置

    我正在研究 jquery 和 html5 canvas 我想做的只是一个简单的 html5 绘图示例 当鼠标移动时 我在鼠标下方绘制红色方块 我的代码很简单 但在获取画布内的鼠标光标位置时遇到问题 现在 我正在使用 x event offs
  • 使用 EPPLUS 缓慢加载 .CSV 文件

    我有大量 csv 文件 需要在应用一些格式后将其转换为 xlsx 包含大约 20 000 行和 7 列的文件需要 12 分钟才能转换 如果文件包含超过 100 000 个 则运行时间 gt 1 小时 不幸的是 这对我来说是不能接受的 代码片
  • 不明白为什么我在 Mongoose Pre save hook 上收到错误警告

    我想使用预保存挂钩对我的密码进行哈希处理 我的密码得到了很好的哈希处理 但为什么我在预保存挂钩的 保存 方法名称上收到错误警告 错误警告 没有重载与此调用匹配 最后一次超载出现以下错误 类型 save 的参数不可分配给类型 RegExp 的
  • 无法使用 Firebase 和 Stripe 正确解析 Json

    错误是 线程 7 无法解析遵循协议 STPCustomerEphemeralKeyProvider 的临时密钥响应 请确保您的后端将临时密钥的未修改 JSON 发送到您的应用程序 有关详细信息 请参阅https stripe com doc