使用 React 制作电子商务应用程序。这是一个“handleSubmit”函数,每次我尝试结帐时都会返回错误。
我导入了“db”并声明了“ paymentIntent”。浏览器中仍然出现此错误。
const handleSubmit = async (event) => {
//do fancy stripe stuff
event.preventDefault()
setProcessing(true)
// const payload = await stripe
const payload = await stripe.confirmCardPayment(clientSecret, {
payment_method: {
card: elements.getElement(CardElement)
}
}).then(({ paymentIntent }) => {
//paymetnIntent = payment Confirmation
db
.collection('users')
.doc(user?.uid)
.collection('orders')
.doc(paymentIntent?.id)
.set({
basket: basket,
amount: paymentIntent.amount,
created: paymentIntent.created,
})
setSucceeded(true);
setError(null)
setProcessing(false)
dispatch({
type: 'EMPTY_BASKET'
})
history.replace('/orders')
})
}
您需要检查是否有任何
error
。 .confirmPayment()
返回一个 Promise,当它被解析时,会返回一个 结果对象。它有两个键,paymentIntent
(您已使用的那个)和 error
(您需要检查的那个):
.then(({ error, paymentIntent }) => {
// check if there is any error
if (error || !paymentIntent) {
// handle error, tell the user
// ...
// return to exit code
return;
}
db.collection('users')
.doc(user?.uid)
.collection('orders')
.doc(paymentIntent.id)
.set({
basket: basket,
amount: paymentIntent.amount,
created: paymentIntent.created,
});
setSucceeded(true);
setError(null);
setProcessing(false);
dispatch({
type: 'EMPTY_BASKET',
});
history.replace('/orders');
});
我前段时间遇到了同样的问题,我们必须注意到,在confirmCardPayment的stipe文档中,它说返回结果对象是eitherthe paymentintent或error。
因此,如果请求成功,您将收到响应的付款意图对象,
{
"id": "xxx",
"amount": 30,
"created": 123213,
...
}
或者如果请求失败,响应将是一个错误,
{
"error": {
"code": "parameter_unknown",
"message": "Error message",
"payment_intent": {
"id": "xxx",
"amount": 30,
...
}
}
}
请注意,在成功响应中,您将获得付款意图对象本身,因此响应对象中不会有
paymentIntent
属性,这就是为什么您将其获取为 undefined
的原因。所以在你的代码中你必须这样做,
.then(({ id, amount, created, error }) => {
if(error) {
// error handling
// dispatch error action
} else {
db.collection('users')
.doc(user?.uid)
.collection('orders')
.doc(id) // destructured id from paymentIntent object
.set({
basket: basket,
amount, // destructured amount from paymentIntent object
created, // destructured created from paymentIntent object
})
setSucceeded(true);
setError(null)
setProcessing(false)
dispatch({
type: 'EMPTY_BASKET'
})
history.replace('/orders')
}
})
尝试在 then 正文开头的行后面添加 console.log( paymentIntent) 并检查其格式。如果它在 paymentIntent 中包含 amount 属性,则在提取 amount 属性之前添加 checks,因为加载该属性可能需要一些时间。所以,
.set({
basket: basket,
amount: paymentIntent?.amount, //Add check here
created: paymentIntent?.created, //Also check here
})