Das angegebene client_secret stimmt mit keinem zugeordneten SetupIntent für dieses Konto überein

王林
Freigeben: 2024-02-10 14:18:19
nach vorne
708 Leute haben es durchsucht

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

php-Redakteur Yuzai hat einen prägnanten und klaren Artikel verfasst, um die Probleme zu erläutern, die bei der Verwendung von SetupIntent auftreten können. Darunter ist ein möglicher Fehler: „Das bereitgestellte client_secret stimmt mit keinem zugeordneten SetupIntent für dieses Konto überein“, was dazu führen kann, dass der Vorgang fehlschlägt. Der Artikel erläutert die Ursache und Lösung dieses Fehlers in einfacher und klarer Sprache und hilft den Lesern, das Problem schnell zu lösen und die Effizienz der Verwendung von SetupIntent zu verbessern.

Inhalt der Frage

Ich versuche, ein externes Bankkonto mit einem mit Stripe verbundenen Konto zu verknüpfen. Kontotypen sind benutzerdefiniert. Ich habe den mit dem verbundenen Konto verknüpften SetupIntent (siehe unten) erfolgreich erstellt und den Client-Schlüssel erhalten:

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
Nach dem Login kopieren

client_secret wird an das Frontend übergeben, wo wir den Autorisierungsprozess zur Erfassung von Bankinformationen einleiten, um externe Konten verknüpfen zu können.

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>
}
Nach dem Login kopieren

Endlich im 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>
    )
}
Nach dem Login kopieren

Es versucht, das Element zu laden und zeigt es eine Sekunde lang schnell an, bevor es abstürzt. Wenn ich auf die Registerkarte „Netzwerk“ schaue, erhalten wir die Fehlermeldung: Bereitgestellt client_secret 与此帐户上的任何关联的 SetupIntent 不匹配。

Und wenn ich den Befehl „curl“ ausführe, um den SetupIntent abzurufen, kann ich erfolgreich erkennen, dass er für das Konto erstellt wurde. Ich bin verwirrt, warum dieser Fehler auftritt.

Außerdem habe ich den generierten API-Schlüssel noch einmal überprüft und festgestellt, dass der richtige Schlüssel verwendet wurde.

Ich habe die Stripe-Dokumentation gelesen, habe aber immer noch dieses Problem. Ich habe auch versucht, den Client-Schlüssel fest zu codieren und ihn bei der Generierung über Curl veröffentlichbar zu machen, habe aber immer noch den gleichen Fehler erhalten.

Fehler beim Übergeben des Client-Geheimnisses an die Elementkomponente.

Problemumgehung

Sie tätigen einen serverseitigen Anruf im Namen eines verbundenen Kontos:

params.SetStripeAccount(connectedId)
Nach dem Login kopieren

Aber im Vordergrund stehen Sie nicht:

const loadedStripe = await loadStripe(publishableKey)
Nach dem Login kopieren

Stripe sucht also zur Bestätigung nach der Absicht in Ihrem Konto, nicht nach dem verbundenen Konto.

Sie müssen alles auf die gleiche Weise authentifizieren – in Ihrem Fall bedeutet dies, dass Sie Ihr Frontend im Namen der Konto-ID authentifizieren, von der aus Sie eine Verbindung herstellen:

const stripePromise = loadStripe('{{PLATFORM_PUBLISHABLE_KEY}}', {
  stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}',
});
Nach dem Login kopieren

Zugehörige Stripe-Dokumentation.

Das obige ist der detaillierte Inhalt vonDas angegebene client_secret stimmt mit keinem zugeordneten SetupIntent für dieses Konto überein. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!