上下文
我有一个Next.js项目,我想通过Stripe处理订阅付款。为此,我使用了@stripe/stripe-js
和@stripe/react-stripe-js
库。我面临的问题是,当用户输入他的卡信息时,CVV或到期日期是错误的,交易成功。我很困惑,为什么会发生这种情况,并希望解决这个问题,以避免欺诈发生在我的网站。
代码实现
我在网站上有一个按钮,看起来像这样:
<button onClick={() => handlePayment("price_9GWxvwZT9I0y2hA0wd7J8gec")}>
Checkout
</button>
字符串
通过此按钮调用的函数将创建Stripe订阅。
const handlePayment = async (price_id) => {
fetch('https://api.example.com/create_stripe_subscription', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"price_id": price_id,
"user_email": 'user@example.com',
})
}).then(response => {
if (response.ok) {
response.json().then(data => {
router.push(`/checkout?client=${data.client_secret}`)
});
}
})
};
型
API调用creates a subscription并返回客户端密码,然后将其作为查询字符串传递到结帐页面。如果这个handlePayment()
函数成功执行,则 checkout 页面包含以下代码。
import { loadStripe } from '@stripe/stripe-js';
import { Elements } from '@stripe/react-stripe-js';
import { useRouter } from "next/router"
import MetaHead from "@/components/meta-head"
import CheckoutForm from "@/components/checkout-form"
// Call outside of a component’s render to avoid recreating the `Stripe` object on every render.
const stripePromise = loadStripe(process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY);
export default function Checkout() {
const router = useRouter();
const clientSecret = router.query.client;
return (
<>
<h1>Checkout</h1>
{clientSecret && stripePromise && (
<div>
<Elements stripe={stripePromise} options={{ clientSecret: clientSecret }}>
<CheckoutForm />
</Elements>
</div >
)}
</>
);
}
型
这里的CheckoutForm
组件包含以下代码。
import { useStripe, useElements, PaymentElement } from '@stripe/react-stripe-js';
import { useState } from 'react';
export default function CheckoutForm() {
const stripe = useStripe();
const elements = useElements();
const [message, setMessage] = useState(null);
const [isProcessing, setIsProcessing] = useState(false);
const handleSubmit = async (event) => {
// Prevent default form submission, this would refresh the page.
event.preventDefault();
if (!stripe || !elements) {
// Stripe.js hasn't yet loaded, make sure to disable form submission until Stripe.js has loaded.
return;
}
setIsProcessing(true);
const { error } = await stripe.confirmPayment({
// `Elements` instance that was used to create the Payment Element.
elements,
confirmParams: {
return_url: `${window.location.origin}/admin?load=panel`,
}
});
if (error) {
setMessage(error.message);
} else {
setMessage("Unexpected state...");
}
setIsProcessing(false);
};
return (
<>
<div>
<form id="payment-form" onSubmit={handleSubmit}>
<PaymentElement />
<button disabled={isProcessing} id="submit">
Pay now
</button>
</form>
</div>
{/* Handle user messaging */}
{message && (
<span>{message}</span>
)}
</>
)
};
型
非常感谢您的帮助!
2条答案
按热度按时间62lalag41#
Stripe解决方案
我给Stripe支持团队发了邮件,他们解释了解决方案。事实证明,这不是一个bug,也不是Stripe端的问题。我这里有一个我收到的电子邮件的摘要。
不正确的CVC付款被设置为允许在我的帐户。然而,您可以设置一个规则来阻止任何不正确的CVC付款。
如果没有特定的阻止规则,客户的银行仍然可以批准收费,即使CVC或邮政编码(AVS)检查失败。银行在其系统中考虑了各种信号,并且可能会认为收费是合法的,尽管支票没有通过,然后将收费沿着给Stripe。更多详情请参阅this article。
如果您想阻止未经验证的CVC付款,您可以在Stripe Dashboard的 Radar 部分编辑规则。你可以通过this link来实现。向下滚动到 Block rules 部分,如果CVC验证失败,单击Block前面的 *,单击Enable,然后确认此操作。
您还可以添加自定义规则。为此,请单击 Block 部分下面的“+Add Rule”按钮,然后输入适用的代码。要了解有关自定义规则代码的更多信息,请访问check this document。
我希望这对其他人有帮助; Stripe支持团队非常优秀,他们是快速响应者。
rfbsl7qr2#
您是否在使用4242 test card测试集成?如果是这样的话,只要到期日是一个有效的未来日期,并且cvc是任何3位数(美国运通是4位数)的号码,交易就会成功。
如果此问题发生在生产中,您应该联系Stripe support并提供相关的PaymentIntent ID,他们会帮助您。