Rumah  >  Artikel  >  pembangunan bahagian belakang  >  client_secret yang dibekalkan tidak sepadan dengan mana-mana SetupIntent yang berkaitan pada akaun ini

client_secret yang dibekalkan tidak sepadan dengan mana-mana SetupIntent yang berkaitan pada akaun ini

王林
王林ke hadapan
2024-02-10 14:18:19710semak imbas

提供的 client_secret 与此帐户上的任何关联的 SetupIntent 不匹配

editor php Yuzai menyunting artikel yang ringkas dan jelas untuk menerangkan masalah yang mungkin dihadapi semasa penggunaan SetupIntent. Antaranya, satu ralat yang mungkin adalah "Rahsia klien yang disediakan tidak sepadan dengan mana-mana SetupIntent yang berkaitan pada akaun ini", yang boleh menyebabkan operasi gagal. Artikel tersebut menerangkan punca dan penyelesaian ralat ini dalam bahasa yang mudah dan jelas, membantu pembaca menyelesaikan masalah dengan cepat dan meningkatkan kecekapan menggunakan SetupIntent.

Kandungan soalan

Saya cuba memautkan akaun bank luaran ke akaun yang disambungkan Stripe. Jenis akaun adalah tersuai. Saya berjaya mencipta SetupIntent yang dikaitkan dengan akaun yang disambungkan (ditunjukkan di bawah) dan menerima kunci pelanggan:

params := &stripe.SetupIntentParams{
    AttachToSelf: stripe.Bool(true),
    FlowDirections: stripe.StringSlice([]string{
        *stripe.String(string(stripe.SetupIntentFlowDirectionInbound)),
        *stripe.String(string(stripe.SetupIntentFlowDirectionOutbound)),
    }),
    PaymentMethodOptions: &stripe.SetupIntentPaymentMethodOptionsParams{
        USBankAccount: &stripe.SetupIntentPaymentMethodOptionsUSBankAccountParams{
            FinancialConnections: &stripe.SetupIntentPaymentMethodOptionsUSBankAccountFinancialConnectionsParams{
                Permissions: stripe.StringSlice([]string{*stripe.String("balances"), *stripe.String("payment_method")}),
            },
            VerificationMethod: stripe.String("instant"),
        },
    },
    PaymentMethodTypes: stripe.StringSlice([]string{
        *stripe.String(string(stripe.PaymentMethodTypeUSBankAccount)),
    }),
}

params.SetStripeAccount(connectedId)
resp, err := setupintent.New(params)
if err != nil {
    return nil, fmt.Errorf("failed to setup intent: %w", err)
}

return resp, nil

client_secret dihantar ke bahagian hadapan di mana kami memulakan proses kebenaran untuk mengumpul maklumat perbankan untuk dapat memautkan akaun luaran.

const publishableKey = process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY || ''
if (!publishableKey) {
    throw new Error('missing stripe publishable key')
}

export default function Page() {
const [clientSecret, setClientSecret] = useState('')
const [showModal, setShowModal] = useState(false)
const [stripeInstance, setStripeInstance] = useState<Stripe | null>(null)
const [linkingBankLoading, setLinkingBankLoading] = useState(false)
    useEffect(() => {
        const loadAndSetStripe = async () => {
            try {
                const loadedStripe = await loadStripe(publishableKey)
                setStripeInstance(loadedStripe)
            } catch (err) {
                console.error('stripe publishable key failed to load', err)
            }
        }

        loadAndSetStripe()
    }, [])

    const linkExternalBank = async () => {
    setLinkingBankLoading(true)

    try {
        const { data } = await linkExternalBankMutation({
            context: {
                headers: { authorization: `Bearer ${accessToken}` },
            },
        })

        if (data?.linkExternalBank.clientSecret) {
            setClientSecret(data.linkExternalBank.clientSecret)
            setShowStripeModal(true)
        }
    } catch (err) {
        console.error('error linking external bank', err)
    } finally {
        setLinkingBankLoading(false)
    }
}

<div className="flex flex-col gap-3 md:flex-row">
                        <AddFinancialConnectionCard
                            linkExternalBank={linkExternalBank}
                            linkingBankLoading={linkingBankLoading}
                        />
                        {showModal && stripeInstance && clientSecret && (
                            <Modal
                                isOpen={showModal}
                                onClose={() => setShowModal(false)}
                                clientSecret={clientSecret}
                                stripe={stripeInstance}
                            />
                        )}
                    </div>
}

Akhirnya dalam modal:

interface ModalProps {
    isOpen: boolean
    onClose: () => void
    clientSecret: string
    stripe: Stripe | null
}
export const Modal = ({ isOpen, onClose, clientSecret, stripe }: ModalProps) => {
    if (!isOpen || !stripe || !clientSecret) {
        return null
    }

    return (
        <div className="fixed inset-0 z-50 flex items-center justify-center">
            <div className="w-full max-w-lg rounded bg-white p-4 shadow-lg">
                <button onClick={onClose}>Close</button>
                <Elements stripe={stripe} options={{ clientSecret }}>
                    <BankDetailsForm clientSecret={clientSecret} />
                </Elements>
            </div>
        </div>
    )
}

Ia cuba memuatkan elemen dan memaparkannya dengan cepat untuk satu saat sebelum ranap. Apabila saya melihat tab rangkaian kita mendapat ralat: Disediakan client_secret 与此帐户上的任何关联的 SetupIntent 不匹配。

Dan apabila saya menjalankan perintah curl untuk mendapatkan SetupIntent, saya berjaya melihat bahawa ia dicipta untuk akaun. Saya keliru mengapa ralat ini berlaku.

Selain itu, saya menyemak semula kunci API yang dijana dan yang betul telah digunakan.

Saya telah membaca dokumentasi Stripe tetapi masih mengalami masalah ini. Juga mencuba pengekodan keras kunci klien dan menjadikannya boleh diterbitkan apabila dijana melalui Curl, tetapi masih mendapat ralat yang sama.

Gagal apabila menghantar rahsia pelanggan kepada komponen Element.

Penyelesaian

Anda sedang membuat panggilan sebelah pelayan bagi pihak akaun yang disambungkan:

params.SetStripeAccount(connectedId)

Tetapi di bahagian hadapan, anda bukan:

const loadedStripe = await loadStripe(publishableKey)

Jadi Stripe sedang mencari niat pada akaun anda untuk pengesahan, bukan akaun yang disambungkan.

Anda mesti mengesahkan semuanya dengan cara yang sama - dalam kes anda ini bermakna mengesahkan bahagian hadapan anda bagi pihak ID akaun yang anda sambungkan:

const stripePromise = loadStripe('{{PLATFORM_PUBLISHABLE_KEY}}', {
  stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}',
});

Berkaitan Dokumentasi jalur.

Atas ialah kandungan terperinci client_secret yang dibekalkan tidak sepadan dengan mana-mana SetupIntent yang berkaitan pada akaun ini. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam