NodeJS 当CVV和到期日期不正确时,Stripe成功向客户端收费

j2qf4p5b  于 2023-08-04  发布在  Node.js
关注(0)|答案(2)|浏览(111)

上下文

我有一个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>
            )}
        </>
    )
};


非常感谢您的帮助!

62lalag4

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支持团队非常优秀,他们是快速响应者。

rfbsl7qr

rfbsl7qr2#

您是否在使用4242 test card测试集成?如果是这样的话,只要到期日是一个有效的未来日期,并且cvc是任何3位数(美国运通是4位数)的号码,交易就会成功。
如果此问题发生在生产中,您应该联系Stripe support并提供相关的PaymentIntent ID,他们会帮助您。

相关问题