Maison  >  Article  >  développement back-end  >  Le client_secret fourni ne correspond à aucun SetupIntent associé à ce compte

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

王林
王林avant
2024-02-10 14:18:19708parcourir

提供的 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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer