Rumah > pembangunan bahagian belakang > Golang > 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

王林
Lepaskan: 2024-02-10 14:18:19
ke hadapan
750 orang telah melayarinya

提供的 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
Salin selepas log masuk

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>
}
Salin selepas log masuk

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>
    )
}
Salin selepas log masuk

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)
Salin selepas log masuk

Tetapi di bahagian hadapan, anda bukan:

const loadedStripe = await loadStripe(publishableKey)
Salin selepas log masuk

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}}',
});
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan