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中文網其他相關文章!