付款成功后迅速获取条带费用ID

Posted

技术标签:

【中文标题】付款成功后迅速获取条带费用ID【英文标题】:Swift get stripe charge id when payment has succeeded 【发布时间】:2021-06-19 06:35:42 【问题描述】:

我正在使用 Stripe api 进行支付。

我正在尝试从 pay() 函数接收费用 ID,但在任何参数变量中都看不到费用 ID。这是我必须在服务器端做的事情吗?我会假设费用 ID 将在付款意图参数中,但事实并非如此。我是否必须通过其他方式获取费用 ID?

收费 ID 示例:

“id”:“ch_1IXpNqHiSsWQPbMQ3dNTp73m”

我创建了一个支付意图服务器端并像这样处理支付:https://stripe.com/docs/payments/integration-builder

@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 ?? "")
          break
      @unknown default:
          fatalError()
          break
      
    
  

参数输出:

成功:

状态:

STPPaymentHandlerActionStatus

支付意图:

可选()>);卡= 可选(;国家 = 我们; expMonth = 4; expYear = 2024;资金=信用;最后4 = 4242; 指纹 = ;网络 = ;三DSecureUsage = ;钱包=>); cardPresent = 无;创建=可选(2021-03-22 15:08:10 +0000);客户 ID = ;理想=无;每股收益=零; fpx = 无; 转帐=无;网上银行 = 无; oxxo = 无; GrabPay = 无;贝宝 = 零; przelewy24 = 无; sepaDebit = 无;软=无; upi = 无; afterpay_clearpay = 无;直播模式=否;类型=卡>); paymentMethodTypes = Optional(["card"]);收据电子邮件=无; setupFutureUsage = nil;运费 = 无;源 ID = 无;状态 = 可选(“成功”)>)

paymentIntentParams:

);授权数据 = 无;支付方法选项 = @nil; additionalAPIParameters = [:]> 卡参数:

【问题讨论】:

【参考方案1】:

PaymentIntent 的所有费用都在 charges 列表 [0] 下,但仅在服务器端返回,目前无法通过 Publishable 密钥检索。

您将获取 PaymentIntent 服务器端,它将返回整个 charges 列表,其中最近的 Charge 是该列表中的第一个元素。

[0]https://stripe.com/docs/api/payment_intents/object#payment_intent_object-charges

【讨论】:

所以你说我必须两次获取付款意图?充电前一次,充电后一次获取charge id? 您首先“创建”了 PaymentIntent,所以从技术上讲您并没有获取它,但是是的,您的移动应用程序与您的服务器对话以首先获取 PaymentIntent client_secret。然后在您的 confirmCardPayment() 完成块中,您的应用程序再次与您的服务器对话以获取该 PaymentIntent 的 Charge ID。或者,您可以只与您的客户共享 PaymentIntent ID,假设 PaymentIntent status: succeeded 如您上面的示例所示 因此通过将支付意图 id 发送到服务器端来检索 PaymentIntent。然后哪个会给我一个收费 ID 列表,第一个收费是最近的? 我觉得这种方法发送支付意图ID存在安全风险。必须有办法使用 STPPaymentContext 或 STPPaymentResult "第一次收费是最近的吗?" -> 是的。 “我觉得这种方法发送支付意图 ID 存在安全风险” -> 这不是安全风险,它只是一个 PaymentIntent ID,就像 Charge ID 是一个 ID。对于任何人用它做任何事情(比如退还付款),他们需要访问您的秘密 API 密钥,该密钥是私有的并且存在于您的后端。与客户共享 PaymentIntent ID 或 Charge ID 没有问题。如果他们使用网络检查器并查看您的移动应用程序发出的请求,他们无论如何都可以访问它,这是预期的并且不是问题。

以上是关于付款成功后迅速获取条带费用ID的主要内容,如果未能解决你的问题,请参考以下文章

为客户订阅定期付款计划后如何获取费用 ID?

从条带事件中获取产品 ID(结帐会话已完成)

如何从成功的付款中获取交易 ID?

条带结帐发送额外参数

使用贝宝快速结帐完成付款后如何获取授权ID

详细的堆栈跟踪:错误:找不到模块“条带”