


Le client_secret fourni ne correspond à aucun SetupIntent associé à ce compte
Feb 10, 2024 pm 02:18 PMl'é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
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> }
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> ) }
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)
Mais en amont, vous n'êtes pas :
const loadedStripe = await loadStripe(publishableKey)
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}}', });
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

GO Language Pack Import: Quelle est la différence entre le soulignement et sans soulignement?

Comment mettre en œuvre le transfert d'informations à court terme entre les pages du cadre Beego?

Comment écrire des objets et des talons simulés pour les tests en Go?

Comment puis-je utiliser des outils de traçage pour comprendre le flux d'exécution de mes applications GO?

Comment convertir la liste des résultats de la requête MySQL en une tranche de structure personnalisée dans le langage Go?

Comment rédigez-vous des tests unitaires en Go?

Comment écrire des fichiers dans GO Language de manière pratique?

Comment puis-je définir des contraintes de type personnalisé pour les génériques en Go?
