【发布时间】:2021-06-11 11:07:04
【问题描述】:
我正在为我的静态电子商务 Next.js 应用程序制作支付功能。
对于付款,我有几个阶段:
- 制作带有送货信息表单和按钮“支付”的购物车页面,该页面重定向到
/payment页面; - 在
/payment页面上,我连接了我的支付服务,需要从 Context API 获取购物车信息,但我无法在getStaticProps中使用 Context API,这是我的问题。支付页面只需获取购物车数据并重定向到外部服务支付表单。
页面/payment的代码如下:
import { useEffect, useContext } from "react"
import QiwiBillPaymentsAPI from "@qiwi/bill-payments-node-js-sdk"
import { CartContext } from "@/context/GlobalState"
export default function Payment ({ payUrl }) {
useEffect(() => window.location.assign(payUrl))
return (
<span>Redirect</span>
)
}
export async function getStaticProps() {
const qiwiApi = new QiwiBillPaymentsAPI(process.env.QIWI_SECRET_KEY)
const { state, dispatch } = useContext(CartContext)
const { cart } = state
const billId = qiwiApi.generateId()
const lifetime = qiwiApi.getLifetimeByDay(1);
const fields = {
amount: 1.00,
currency: "RUB",
expirationDateTime: lifetime,
}
const payment_data = await qiwiApi.createBill( billId, fields )
const payUrl = payment_data.payUrl
return { props: { payUrl }}
}
请帮我出出主意。
【问题讨论】:
-
getStaticProps在构建时在服务器上运行。您将无法访问其中的任何运行时或客户端逻辑。另外,如果您似乎没有使用getStaticProps中的购物车数据,为什么还需要访问上下文?你不能在你的Payment组件中处理上下文吗? -
我从您的代码中注意到一件事,您使用的是
window.location.assign,在这种情况下这可能是一个好主意。但我担心你对所有事情都使用相同的东西。确保您使用next router。否则,您将完全退出 SPA 并使用Next.js -
@云海 感谢您的关注!是的,我只在这种情况下使用
window.location.assign。我一直在寻找使用next router的方法,但我做不到。如果你知道,请告诉我! -
@juliomalves 我需要在
getStaticProps中有上下文 api 访问权限,以便在字段对象中更改amount(未来付款的总价)等等。出于某种原因,我无法在 Payment 组件中使用 qiwiApi,我在 useEffect 或只是在函数中尝试了它,但在不起作用并返回错误并返回 'fs'。 -
我建议您将
getStaticProps代码移动到 API 路由,然后从您的Payment组件向该 API 路由发出请求,使用上下文中您需要的任何内容。
标签: reactjs next.js react-context