【问题标题】:Unhandled Rejection (TypeError): Cannot read property 'amount' of undefined未处理的拒绝(TypeError):无法读取未定义的属性“数量”
【发布时间】:2021-10-06 15:06:12
【问题描述】:

使用 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')
        })

    }```

【问题讨论】:

  • 能否请您在正文开头的行后添加console.log(paymentIntent)
  • @Tatiana 结果是“未定义”
  • 表示没有paymentIntent。您应该考虑如何处理这种情况。尝试找出您从 confirmCardPayment 中得到了什么以及为什么没有 paymentIntent
  • 我应该控制台记录“payload”还是“confirmCardPayment”以了解发生了什么?

标签: javascript reactjs react-native react-hooks stripe-payments


【解决方案1】:

您需要检查是否有任何errors。 .confirmPayment() 返回一个承诺,当它被解决时返回一个 result object。它有两个键,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');
});

【讨论】:

  • 当我在控制台记录错误时,它返回一个带有客户端 ID、payment_Intent、lats 支付错误、支付方式类型等的对象。
  • 你确定你像我一样添加了大括号吗? ({ error, paymentIntent }) => {
  • 是的,我共享的代码包含大括号。控制台记录错误正在返回一个未定义的对象。我该怎么办? @Zsolt
  • 只是为了确保我能正确理解您。 errorpaymentIntent 都返回 undefined 吗?
  • 对于之前的误会真的很抱歉。 error 返回一个对象,即:Object message: "As per Indian regulations, export transactions require a description. More info here: https://stripe.com/docs/india-exports" param: "description" payment_intent: amount: 23900 canceled_at: null cancellation_reason: null capture_method: "automatic" client_secret: "xxx" confirmation_method: "automatic" created: 1628091493 currency: "usd" description: null id: "xxx" 等,控制台日志记录 paymentIntent 在调试器上没有返回任何内容。
【解决方案2】:

我前段时间遇到了同样的问题,我们必须注意到在confirmCardPayment 的 stipe 文档中,它说返回的结果对象是要么 付款意图错误

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

{
   "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')
      }
})

【讨论】:

  • 我已经使用 db .collection('users') .doc(user?.uid) .collection('orders') .doc(paymentIntent?.id) .set({ basket: basket, amount: paymentIntent.amount, created: paymentIntent.created, }) 对其进行了解构,但它仍然返回一个空对象,其中包含金额、客户端 ID 等所有内容,但不知何故它是未定义的。
  • 一个Object 是我在控制台记录error 后得到的东西,它由数量、客户端ID 等组成,控制台记录paymentIntent 返回undefined
  • @GouravSanyal 您是否尝试将响应解构为 .then({ id, amount, created, error }) ?如果错误存在,则意味着您的请求失败。如果是这种情况,请检查错误对象的codemessage 并尝试解决它。​​
  • 我早些时候在 if-else 块中犯了一个小错误,您的建议已经奏效。感谢您的意见:)
  • 很高兴听到@GouravSanyal。如果您可以将答案标记为正确,则表示感谢。 :)
【解决方案3】:

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

       .set({
            basket: basket,
            amount: paymentIntent?.amount, //Add check here
            created: paymentIntent?.created, //Also check here
        })

【讨论】:

  • 我控制台记录了(paymentIntent),由于某种原因它是"undefined"。而error 正在返回包含付款详细信息、客户 ID 等的对象。
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 2019-07-19
  • 2019-06-03
  • 2020-04-09
  • 2019-11-13
  • 2021-10-19
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多