【问题标题】:Submit form only when stripe payment is made仅在进行条带付款时提交表格
【发布时间】:2021-03-02 01:34:24
【问题描述】:

我有一个表单,我想仅在完成条带付款后提交其数据。条带支付对应这个JS脚本:

// Get Stripe publishable key
fetch("/config")
.then((result) => { return result.json(); })
.then((data) => {
  // Initialize Stripe.js
  const stripe = Stripe(data.publicKey);

  // new
  // Event handler
  document.querySelector("#submitBtn").addEventListener("click", () => {
    // Get Checkout Session ID
    fetch("/create-checkout-session")
    .then((result) => { return result.json(); })
    .then((data) => {
      console.log(data);
      // Redirect to Stripe Checkout
      return stripe.redirectToCheckout({sessionId: data.sessionId})
    })
    .then((res) => {
      console.log(res);
    });
  });
document.getElementById("form_post").submit();
});

到目前为止,我所做的是在 JS 脚本的末尾添加document.getElementById("form_post").submit();,如您所见,但它不起作用。使用此代码,可以进行条带付款,但我的表单未提交。

这是带有表单的 HTML 部分:

{% extends 'base.html' %}

{% block content %}
<script src="https://js.stripe.com/v3/"></script>
<script src="{{ url_for('static', filename='main.js') }}"></script>
<script defer src="https://use.fontawesome.com/releases/v5.14.0/js/all.js"></script>
  <form id="form_post" method="post" enctype=multipart/form-data>
    <label for="sername">Nom de l'entreprise</label>
    <input name="username" id="username" value="{{ request.form['username'] }}" required>
    </form>

    <section class="section">
      <div class="container">
        <button class="button is-primary" id="submitBtn">Purchase!</button>
      </div>
    </section>

{% endblock %}

有关信息,我正在使用 python 的框架 Flask。

【问题讨论】:

    标签: javascript html stripe-payments


    【解决方案1】:

    这不起作用,因为 Stripe 会将您重定向到另一个页面进行结帐会话,因此重定向后的代码将永远不会运行,除非由于网络问题或其他原因重定向失败。

    当 Stripe 将您返回到您的网站时,在付款完成后,他们会将查询参数附加到您提供的重定向 URL。您可以获取该查询参数并将其提交到您的服务器以进行任何处理。

    您需要在表单中存储有关用户的任何信息,您应该在重定向之前提前完成。然后通过处理 Stripe 发送的 webhook 或检查结帐会话的状态,在服务器端验证付款是否成功。

    【讨论】:

    • 这是正确的。结帐是重定向,因此信息会丢失。如果您需要保留一些数据,则必须在系统中重定向之前记录它。您可以在创建会话时将其传递到您的服务器,然后将其作为元数据附加到 Checkout 会话或记录在您的数据库中以供以后链接。无论哪种情况,您都应该收听checkout.session.completed webhooks 来完成您的订单。 stripe.com/docs/payments/checkout/fulfill-orders#fulfill
    • 非常感谢你们两位。确实,你们俩说的在理论上都很清楚,但是即使我按照有关 webhook 的条带教程并将其添加到我的路由中,我也不知道如何实现。
    • 没问题@Uvo。当您刚开始时,我建议您查看各种教程并尝试通过实施它们来提高您的技能。例如,您尝试执行的整个过程都在 Next.js vercel.com/guides/getting-started-with-nextjs-typescript-stripe 上为您实现,您还可以在线找到其他语言和框架的其他教程。
    • 感谢您提供的链接,但老实说,我还没有找到解决问题的方法。到目前为止,我的设想是在我的数据库中存储表单信息的表中添加一个“付款”列,当网络挂钩返回有关付款的成功答案时,我在付款列中添加一个值,表明我可以使用此表单/用户的数据。但我不知道如何将填写表格的用户和完成付款的同一用户联系起来。
    猜你喜欢
    • 2015-03-12
    • 2012-12-17
    • 2020-09-22
    • 2014-09-05
    • 2023-03-18
    • 2016-07-18
    • 2011-08-31
    • 2020-07-02
    • 1970-01-01
    相关资源
    最近更新 更多