未处理的拒绝(TypeError):无法读取未定义的属性“amount”

问题描述 投票:0回答:3

使用 React 制作电子商务应用程序。这是一个“handleSubmit”函数,每次我尝试结帐时都会返回错误。

我导入了“db”并声明了“ paymentIntent”。浏览器中仍然出现此错误。

    const handleSubmit = async (event) => {
        //do fancy stripe stuff
        event.preventDefault()
        setProcessing(true)

        // const payload = await stripe

        const payload = await stripe.confirmCardPayment(clientSecret, {
            payment_method: {
                card: elements.getElement(CardElement)
            }
        }).then(({ paymentIntent }) => {
            //paymetnIntent = payment Confirmation

           db
            .collection('users') 
            .doc(user?.uid)
            .collection('orders')
            .doc(paymentIntent?.id)
            .set({
                basket: basket,
                amount: paymentIntent.amount,
                created: paymentIntent.created,
            })

            setSucceeded(true);
            setError(null)
            setProcessing(false)
            dispatch({
                type: 'EMPTY_BASKET'
            })

            history.replace('/orders')
        })

    }
javascript reactjs react-native react-hooks stripe-payments
3个回答
2
投票

您需要检查是否有任何

error
.confirmPayment()
返回一个 Promise,当它被解析时,会返回一个 结果对象。它有两个键,
paymentIntent
(您已使用的那个)和
error
(您需要检查的那个):

.then(({ error, paymentIntent }) => {
  // check if there is any error
  if (error || !paymentIntent) {
    // handle error, tell the user
    // ...
    // return to exit code
    return;
  }

  db.collection('users')
    .doc(user?.uid)
    .collection('orders')
    .doc(paymentIntent.id)
    .set({
      basket: basket,
      amount: paymentIntent.amount,
      created: paymentIntent.created,
    });

  setSucceeded(true);
  setError(null);
  setProcessing(false);
  dispatch({
    type: 'EMPTY_BASKET',
  });

  history.replace('/orders');
});

2
投票

我前段时间遇到了同样的问题,我们必须注意到,在confirmCardPayment的stipe文档中,它说返回结果对象是eitherthe paymentintenterror

因此,如果请求成功,您将收到响应的付款意图对象,

{
   "id": "xxx", 
   "amount": 30, 
   "created": 123213,
    ... 
}

或者如果请求失败,响应将是一个错误,

{
   "error": {
      "code": "parameter_unknown",
      "message": "Error message",
      "payment_intent": {
          "id": "xxx",
          "amount": 30,
          ...
       }
   }
}

请注意,在成功响应中,您将获得付款意图对象本身,因此响应对象中不会有

paymentIntent
属性,这就是为什么您将其获取为
undefined
的原因。所以在你的代码中你必须这样做,

.then(({ id, amount, created, error }) => {
     if(error) {
        // error handling
        // dispatch error action
      } else {
        db.collection('users') 
         .doc(user?.uid)
         .collection('orders')
         .doc(id) // destructured id from paymentIntent object
         .set({
            basket: basket,
            amount, // destructured amount from paymentIntent object
            created, // destructured created from paymentIntent object
           })

         setSucceeded(true);
         setError(null)
         setProcessing(false)
         dispatch({
              type: 'EMPTY_BASKET'
         })

         history.replace('/orders')
      }
})

1
投票

尝试在 then 正文开头的行后面添加 console.log( paymentIntent) 并检查其格式。如果它在 paymentIntent 中包含 amount 属性,则在提取 amount 属性之前添加 checks,因为加载该属性可能需要一些时间。所以,

.set({ basket: basket, amount: paymentIntent?.amount, //Add check here created: paymentIntent?.created, //Also check here })
    
© www.soinside.com 2019 - 2024. All rights reserved.