React / 条纹 / injectStripe HOC / "stripe.createToken is not a function"

React / Stripe / injectStripe HOC / "stripe.createToken is not a function"

任务是创建一个测试 Stripe 实现。它所需要做的就是采用标准测试输入 (4242...) 和 return 非故障响应。我已经设法解决了大部分问题,但对如何实现 HOC injectStripe 部分感到困惑。最终结果是代码 return 出现“stripe.getToken() 不是函数”错误,我不知道如何解决这个错误。

我的猜测是答案很简单/显而易见,但是我对此完全陌生,还不知道这个答案是什么。

我不知道该怎么做才能解决这个问题。需要一些帮助/指导。感谢您的时间和关注。

这是一些代码:

paymentInfo.js

export default function PaymentInfo(stripe) {
    const handleFinishOrder = async (event) => {
        event.preventDefault()
    
        const { token } = await stripe.createToken() // <<< here is the error

        async function fetchStripe() {
            // API fetch that needs token
        }

        fetchStripe();
    }
        
    function handlers() {
        return {
            handleFinishOrder: handleFinishOrder       
        }
    }

    return (
        <StripeProvider apiKey={process.env.REACT_APP_STRIPE_PUBLIC_KEY}>
            <Elements>
                <PaymentInfoDisplay handlers={handlers()} /> // <<< see next code sample
            </Elements>
        </StripeProvider>        
    )
}

PaymentInfoDisplay.js

const PaymentInfoDisplay = ( props ) => {
    const { handleFinishOrder } = props.handlers

    return (
        // A simple <form/> with Stripe elements for card number, exp. date, etc.
    )
} 

export default injectStripe(PaymentInfoDisplay)

这里的根本问题是您试图在调用 <StripeProvider /> 组件的函数的 内部使用 stripe 属性 。您应该改为在树中的子组件中进行 createToken() 调用(即使在您的 PaymentInfoDisplay 组件中)。下面是一个(截断的)示例:

export default function PaymentInfo(stripe) {
  return (
    <StripeProvider apiKey={process.env.REACT_APP_STRIPE_PUBLIC_KEY}>
      <Elements>
        <PaymentInfoDisplay />
      </Elements>
    </StripeProvider>        
  )
}
const PaymentInfoDisplay = (props) => {
  const { stripe } = props

  const handleClick = () => stripe.createToken()

  return <button onClick={handleClick}>Click</button>
} 

export default injectStripe(PaymentInfoDisplay)

但是,此 HOC 集成通常已被弃用,不再推荐使用。相反,您应该重构代码以使用 useStripe hook.