stripe-payments - 使用异步 3DS 付款和 webhook 进行订单确认

标签 stripe-payments payment-gateway

我们的应用程序有不同的计划(基本版、高级版、专业版)。我们使用 Stripe .

  • 每个计划每月为您提供 X 个积分。
  • 我们相信每个
    成功付款后有信用的客户
    通过订阅创建、订阅更新或订阅
    循环。
  • 客户仅在成功付款后才被记入贷方;我们倾听 invoice.payment_succeeded我们服务器上的 webhook 并将用户记入我们的数据库中。

  • 我们面临的问题是这样的:
  • 客户尝试使用一些信用。我们发现他没有
    学分或计划。
  • 系统会提示客户注册计划。
  • 客户提供付款详情。
  • 客户通过 stripe.confirmCardPayment() 在客户端上授权 3DS .他被告知付款已完成。
  • 客户试图使用他的信用。此时webhook invoice.payment_succeeded事件没有到达我们的服务器来更新我们的内部客户并将其归功于他
    积分(或将他的订阅标记为 active )。所以用户仍然无法使用我们的应用程序。他被告知他
    没有任何学分。
  • 我们最终会收到付款已通过的 webhook,我们会更新
    客户订阅并记入他的信用。

  • 如您所见,第 5 步是有问题的。客户已经付款,但是当他尝试使用他的积分时,他被告知他没有任何积分,因为将记入他的积分的 webhook 尚未到达我们的服务器。
    webhook 将在下一分钟左右到达,但与此同时,客户对他支付了积分感到困惑,但在尝试使用积分时,他被告知他没有积分。
    你会如何处理这件事?
    可能的解决方案
    客户端发送 HTTP 调用以记入他的帐户
    stripe.confirmCardPayment()成功,从客户端发送一个 HTTP 调用 -> 服务器以信任用户。
    这种解决方案既不安全又容易出错。
  • 它将记入用户帐户的责任转移到客户端。没有什么能阻止客户端发送伪造的 HTTP 调用来为他自己的帐户记账。
  • 如果用户在 stripe.confirmCardPayment() 之后立即关闭浏览器成功了,将他的帐户记入贷方的调用将永远不会到达我们的服务器。

  • 客户端轮询服务器查询成功完成
    invoice.payment_succeeded事件在我们的服务器上处理并保存在表中 successful_invoices .
    stripe.confirmCardPayment()成功我们轮询我们的服务器以找出
    如果用invoice_id成功开具发票存在于该表中。
    如果是,我们隐藏加载屏幕并告诉客户他的付款已处理并且他的信用已成功记入贷方。
    这是我们目前首选的解决方案。

    最佳答案

    这是我们在各种支付网关集成中已经面临的问题。您必须等待网络钩子(Hook)确认付款。
    然后需要一个备份事件,请求网关确认付款状态是否成功,以便您可以在记录中更新相同的内容。
    通常,webhooks 会做必要的事情,否则您的应用程序中的 payment_create 事件可以请求该提供商检查状态。但是,除非您延迟检查此 post payment_create,否则这不会得到更新的可能性很小。
    我们尝试添加一个 CRON 来检查过去 1 分钟内付款的状态。上次运行中具有待处理状态的所有付款都从网关提供商处更新为已拣配状态。但是在这种情况下,您需要确保没有记录应该以事件的形式重复运行,从付款创建并同时添加到 cron。

    关于stripe-payments - 使用异步 3DS 付款和 webhook 进行订单确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66153471/

    相关文章:

    javascript - 客户不是在 Stripe 帐户上创建的

    php - 使用 Stripe Payout API 将金额转入客户的银行账户

    node.js - Firebase函数 Stripe 错误

    java - Braintree Drop-In UI 不显示 CVV 字段

    payment-gateway - 是否可以让 PayPal 标准默认展开 'Guest Payments' 选项卡?

    php - Stripe API 如何更新客户电子邮件?

    payment-gateway - 支付完成后注销Paypal Express账户

    php - 捕获时的 Auth.net 问题

    laravel-5 - Adyen - 无法解密数据

    javascript - 需要使用 Stripe(more) 重力表单插件将付款表单默认为 "card on file"