我遇到了Reaction PayPal按钮集成的问题.当我直接在购物车中更改产品数量时,本地存储和购物车中的产品正在更新,但更改不会反映在PaypalButton组件props createOrder和onApprove中.因此,PayPal标准 checkout 中的总金额是不正确的,无法将正确的产品数量放入我的数据库中.

下面是相关代码:

'use client'

import { PayPalButtons, PayPalScriptProvider } from '@paypal/react-paypal-js'
import { createPaypalOrder, handlePaypalCheckout } from '../../_actions/paypal'
import { useRouter } from 'next/navigation'
import { useContext } from 'react'
import { CartContext } from '@/app/_context/CartContext'
import { toast } from '../ui/use-toast'
import { useSession } from 'next-auth/react'
export default function PaypalButton({ total, uniqueProducts }) {
  console.log('🚀 ~ PaypalButton ~ uniqueProducts:', uniqueProducts)
  console.log('🚀 ~ total:', total)
  const { data: session } = useSession()
  console.log('🚀 ~ session:', session?.user.email)
  const { setShowCart } = useContext(CartContext)

  const router = useRouter()

  const captureOrder = async (orderId) => {
    try {
      const res = await fetch('/api/paypal/capture', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ orderId: orderId }),
      })

      const orderCapture = await res.json()

      if (orderCapture.status == 200) {
        const orderId = await createPaypalOrder(
          uniqueProducts,
          orderCapture.response.result,
          total,
          session?.user.email,
        )
        setShowCart(false)
        router.push(`/order/success?order_id=${orderId}`)
      }
    } catch (error) {
      toast({
        title: 'Invalid payment',
        variant: 'destructive',
      })
      console.log('🚀 ~ captureOrder ~ error:', error)
    }
  }

  const createOrderAction = async () => {
    try {
      console.log(total)
      console.log(uniqueProducts)

      const res = await fetch('/api/paypal', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({ total: total }),
      })
      const order = await res.json()
      if (order.id) return order.id
      else {
        const errorDetail = order?.details?.[0]
        const errorMessage = errorDetail
          ? `${errorDetail.issue} ${errorDetail.description} (${orderData.debug_id})`
          : JSON.stringify(orderData)

        throw new Error(errorMessage)
      }
    } catch (error) {
      console.log('🚀 ~ createOrderAction ~ error:', error)
      console.error(error)
    }
  }

  return (
    <div>
      <PayPalScriptProvider
        options={{
          clientId:
            'test',
          disableFunding: 'card',
          currency: 'EUR',
        }}
      >
        <PayPalButtons
          style={{
            color: 'gold',
            disableMaxWidth: 'true',
          }}
          createOrder={async (data, actions) => {
            const orderId = createOrderAction()
            return orderId
          }}
          onApprove={async (data, actions) => {
            const orderCapture = await captureOrder(data.orderID)
            if (orderCapture) return true
          }}
          onCancel={(data) => {}}
          onError={(err) => {
            console.log('🚀 ~ err:', err)
            console.error('PayPal Checkout onError', err)
          }}
        />
      </PayPalScriptProvider>
    </div>
  )
}

在我更改数量之前,控制台登录的createOrder和onApprove总是显示旧的唯一产品和总数

在创建订单时,我try 在请求正文中传递更新的产品项,但在捕获订单时无法检索它们.我还try 直接在本地存储中检索更新的产品,并在获取后端之前使用useRef获取总的产品,它工作在DataOrderAction中,但不是captureOrder,captureOrder是将数据发送到我的数据库的关键.

推荐答案

您可以在Paypalcash组件中使用forceReRenderprops ,购物车将相应地更新

  <PayPalButtons
      forceReRender={[uniqueProducts]}
      style={{
        color: 'gold',
        disableMaxWidth: 'true',
      }}
      createOrder={async (data, actions) => {
        const orderId = createOrderAction()
        return orderId
      }}
      onApprove={async (data, actions) => {
        const orderCapture = await captureOrder(data.orderID)
        if (orderCapture) return true
      }}
      onCancel={(data) => {}}
      onError={(err) => {
        console.log('🚀 ~ err:', err)
        console.error('PayPal Checkout onError', err)
      }}
    />

以下是官方文档https://paypal.github.io/react-paypal-js/?path=/docs/example-paypalbuttons--default中使用此props 的一个示例

Reactjs相关问答推荐

更新数据时有关CQR和更新UI的问题

为什么这个'Suspense'子组件在挂起promise解决后会丢失它的状态,而不是呈现?<>

有没有方法覆盖NextJS 14中的布局?

GoLang有条件地为.js.gz提供服务(如果它存在),否则为.js

当useEffect和onClick处理程序都调用useCallback函数时,有没有办法对useEffect产生额外的影响?

如何在中间件中获取 nextAuth 会话

如何修复ReferenceError:在构建过程中未定义导航器

React Wordpress Apache 在索引之外重新加载 -> 未找到页面

在Vite React上获取Amplify的环境变量

BrowserRouter改变了URL但没有链接到页面

文本的几个词具有线性渐变 colored颜色 - React native

使用 MuiCssBaseline 在所有 MUI v5 标签上设置边距 0

条件渲染元素的测试不起作用

如何通过 Material ui select 使下拉菜单下拉

模块解析失败:意外令牌 (257:106) 您可能需要适当的加载程序来处理此文件类型

加密 Django Rest Framework API 响应 + 解密响应应用程序中的响应

哪个 PrivateRouter 实现更好:高阶组件还是替换?

在 redux 状态更改时更新react 按钮禁用状态

Cypress 中的 process.env 空对象

添加禁用的默认选项以 Select