Heim  >  Artikel  >  Backend-Entwicklung  >  Das angegebene client_secret stimmt mit keinem zugeordneten SetupIntent für dieses Konto überein

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

王林
王林nach vorne
2024-02-10 14:18:19713Durchsuche

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

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>
}

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>
    )
}

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)

Aber im Vordergrund stehen Sie nicht:

const loadedStripe = await loadStripe(publishableKey)

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}}',
});

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen