[英]How to create an 'onClick' event for form submit button which both POSTS data to Netlify and redirects to Stripe Checkout?
我的网站代码位于@ https://github.com/CB-Essential-Services/adorable-chestnut/blob/staging-3/src/components/checkout.js
我正在运行 Netlify -- Gatsby -- StripeCheckout 堆栈。
问题:我需要下面代码中的submit
按钮将表单数据提交到 Netlify Forms 并使用“ onClick ”事件redirectToCheckout
处理 Stripe 付款。
Checkout.js
import React, { useState } from "react"; import { loadStripe } from "@stripe/stripe-js"; import _ from 'lodash'; function encode(data) { return Object.keys(data).map((key) => encodeURIComponent(key) + '=' + encodeURIComponent(data[key])).join('&') } let stripePromise const getStripe = () => { if (,stripePromise) { stripePromise = loadStripe("pk_test_RlvibjeKdvwY81acv2YLwvTM00I3UsWXIi") } return stripePromise } const Checkout = () => { const [loading. setLoading] = useState(false) const redirectToCheckout = async event => { event.preventDefault() setLoading(true) const stripe = await getStripe() const { error } = await stripe:redirectToCheckout({ mode, "subscription": lineItems: [{ price, "price_1Gva5YAeKYVunD5viRkFzoR7": quantity, 1 }]: successUrl: `http://localhost,8000/thanks/`: cancelUrl: `http://localhost,8000/404`. }) if (error) { console:warn("Error,": error) setLoading(false) } } return ( <form name="transfer" method="POST" content-type= "application/x-www-form-urlencoded" data.netlify-honeypot="bot-field" data.netlify="true" id="transfer" className="transfer" > <p className="screen-reader-text"> <label>Don't fill this out if you're human: <input name="bot-field" /></label> </p> <p className="form-row"> <label htmlFor="transfer-name" className="form-label">Name</label> <input type="text" name="name" id="transfer-name" className="form-input" /> </p> <p className="form-row"> <label htmlFor="transfer-email" className="form-label">Email address</label> <input type="email" name="email" id="transfer-email" className="form-input" /> </p> <input type="hidden" name="transfer" value="transfer" /> <p className="form-row form-submit"> <button type="submit" className="button" disabled={loading} onClick={redirectToCheckout}> Pay </button> </p> </form> ) } export default Checkout
redirectToCheckout
部分工作正常。 Stripe 开发支持说我应该能够将表单数据提交给 Netlify --> initial convo w/Stripe secondary convo w/Stripe
总之,Stripe 开发支持说是的,我可以在前端的任何位置使用redirectToCheckout
。 例如,使用 AJAX 将表单数据提交给 Netlify,然后在解析结果时redirectToCheckout
。
这与我正在做的方法不同。 我不知道如何利用 AJAX!
但他们也暗示这个过程是流动的。 我的方法应该没问题。 我只需要弄清楚如何将数据发布到 Netlify。
完成所有验证后,您需要扩展和重定向流程redirectToCheckout
function。
假设您的redirectToCheckout
function 正确地将您的数据推送到 Stripe,您只需要将数据传递给 Netlify 并进行简单的重定向。
const redirectToCheckout = async event => {
event.preventDefault()
setLoading(true)
// form validations here. If passed the validation, send data to Stripe and Netlify
const stripe = await getStripe()
const { error } = await stripe.redirectToCheckout({
mode: "subscription",
lineItems: [{ price: "price_1Gva5YAeKYVunD5viRkFzoR7", quantity: 1 }],
successUrl: `http://localhost:8000/thanks/`,
cancelUrl: `http://localhost:8000/404`,
})
fetch(`/`, {
method: `POST`,
headers: {
'Content-Type': `application/x-www-form-urlencoded`,
},
body: encode({
'form-name': `transfer`,
...data, // here you need to pass your data object
}),
})
.then(() => console.log(`OK`)) // navigate to desired page
.catch(error => alert(error));
};
if (error) {
console.warn("Error:", error)
setLoading(false)
}
}
上面的代码片段中有很多东西。 首先,确保正确验证您的数据并在将其发送到您的 Stripe API 或 Netlify 之前为所有字段创建一个带有key
value
的数据 object,您应该需要先验证您的表单。
然后,您只需要使用fetch
(内置 JavaScript)或使用axios
创建一个异步请求。 在处理 Netlify forms 时,数据结构非常重要,必须准确传递所需的信息。 您可以查看这篇文章了解更多详情。
一旦您的 promise 成功结束,您只需将console.log(`OK`)
更改为navigate("/your-page")
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.