Maison > développement back-end > Golang > le corps du texte

Le client_secret fourni ne correspond à aucun SetupIntent associé à ce compte

王林
Libérer: 2024-02-10 14:18:19
avant
707 Les gens l'ont consulté

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

l'éditeur php Yuzai a édité un article concis et clair pour expliquer les problèmes qui peuvent être rencontrés lors de l'utilisation de SetupIntent. Parmi elles, une erreur possible est "Le client_secret fourni ne correspond à aucun SetupIntent associé à ce compte", ce qui peut entraîner l'échec de l'opération. L'article explique la cause et la solution de cette erreur dans un langage simple et clair, aidant les lecteurs à résoudre rapidement le problème et à améliorer l'efficacité de l'utilisation de SetupIntent.

Contenu de la question

J'essaie de lier un compte bancaire externe à un compte connecté Stripe. Les types de comptes sont personnalisés. J'ai créé avec succès le SetupIntent associé au compte connecté (illustré ci-dessous) et j'ai reçu la clé client :

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
Copier après la connexion

client_secret est transmis au frontend où nous lançons le processus d'autorisation pour collecter des informations bancaires afin de pouvoir lier des comptes externes.

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>
}
Copier après la connexion

Enfin dans le 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>
    )
}
Copier après la connexion

Il essaie de charger l'élément et l'affiche rapidement pendant une seconde avant de planter. Quand je regarde l'onglet réseau, nous obtenons l'erreur : Fourni client_secret 与此帐户上的任何关联的 SetupIntent 不匹配。

Et lorsque j'exécute la commande curl pour récupérer le SetupIntent, je peux voir avec succès qu'il est créé pour le compte. Je ne comprends pas pourquoi cette erreur se produit.

De plus, j'ai revérifié la clé API générée et la bonne clé a été utilisée.

J'ai lu la documentation Stripe mais j'ai toujours ce problème. J'ai également essayé de coder en dur la clé client et de la rendre publiable lorsqu'elle est générée via Curl, mais j'ai toujours eu la même erreur.

Échec lors de la transmission du secret client au composant Element.

Solution

Vous effectuez un appel côté serveur au nom d'un compte connecté :

params.SetStripeAccount(connectedId)
Copier après la connexion

Mais en amont, vous n'êtes pas :

const loadedStripe = await loadStripe(publishableKey)
Copier après la connexion

Donc, Stripe recherche une intention sur votre compte pour confirmation, et non sur le compte connecté.

Vous devez tout authentifier de la même manière - dans votre cas, cela signifie authentifier votre interface au nom de l'ID de compte à partir duquel vous vous connectez :

const stripePromise = loadStripe('{{PLATFORM_PUBLISHABLE_KEY}}', {
  stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}',
});
Copier après la connexion

Connexe Documentation Stripe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!