首頁 > 後端開發 > Golang > 主體

提供的 client_secret 與此帳戶上的任何關聯的 SetupIntent 不匹配

王林
發布: 2024-02-10 14:18:19
轉載
708 人瀏覽過

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

php小編魚仔編輯了一篇簡潔明了的文章,解釋了使用SetupIntent過程中可能遇到的問題。其中,一個可能的錯誤是“提供的client_secret與此帳戶上的任何關聯的SetupIntent不匹配”,這可能導致操作失敗。文章透過簡單明了的語言解釋了這個錯誤的原因和解決方法,幫助讀者快速解決問題,並提高使用SetupIntent的效率。

問題內容

我正在嘗試將外部銀行帳戶連結到 Stripe 連結帳戶。帳戶類型是自訂的。我成功建立了與已連接帳戶關聯的 SetupIntent(如下所示)並收到了客戶端金鑰:

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 被傳遞到前端,我們在前端啟動授權流程以收集銀行資訊以便能夠連結外部帳戶。

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>
}
登入後複製

最後在模態中:

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>
    )
}
登入後複製

它嘗試載入元素並在崩潰之前快速顯示一秒鐘。當我查看網路標籤時,我們收到錯誤:提供的 client_secret 與此帳戶上的任何關聯的 SetupIntent 不符。

而且當我執行curl命令來檢索SetupIntent時,我可以成功地看到它是為該帳戶創建的。我很困惑為什麼會發生這個錯誤。

此外,我還仔細檢查了產生的 API 金鑰,並且使用了正確的金鑰。

我已經閱讀了 Stripe 文檔,但仍然遇到了這個問題。也嘗試對客戶端金鑰進行硬編碼,並在透過 Curl 產生時可發布,但仍遇到相同的錯誤。

將客戶端金鑰傳遞給 Element 元件時會失敗。

解決方法

您正在代表連線的帳戶進行伺服器端呼叫:

params.SetStripeAccount(connectedId)
登入後複製

但在前端,你不是:

const loadedStripe = await loadStripe(publishableKey)
登入後複製

因此,Stripe 正在尋找您帳戶上的意圖進行確認,而不是連接的帳戶。

您必須以相同的方式對所有內容進行身份驗證 - 在您的情況下,這表示代表您連接的帳戶 ID 對您的前端進行身份驗證:

const stripePromise = loadStripe('{{PLATFORM_PUBLISHABLE_KEY}}', {
  stripeAccount: '{{CONNECTED_STRIPE_ACCOUNT_ID}}',
});
登入後複製

相關Stripe 文件

以上是提供的 client_secret 與此帳戶上的任何關聯的 SetupIntent 不匹配的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!