我正在try 将Stripe集成到我的应用程序中,但在获取支付表单中的CardElement时遇到了问题.

这是我的付款单代码:

import React from "react";
import { Typography, Button, Divider } from "@material-ui/core";
import {
  Elements,
  CardElement,
  ElementsConsumer,
} from "@stripe/react-stripe-js";
import { loadStripe } from "@stripe/stripe-js";

import Review from "./Review";

const stripePromise = loadStripe(process.env.REACT_APP_STRIPE_PUBLIC_KEY);

console.log(process.env.REACT_APP_STRIPE_PUBLIC_KEY);

const PaymentForm = ({
  checkoutToken,
  nextStep,
  backStep,
  shippingData,
  onCaptureCheckout,
}) => {
  const handleSubmit = async (event, elements, stripe) => {
    event.preventDefault();

    if (!stripe || !elements) return;

    const cardElement = elements.getElement(CardElement);

    const { error, paymentMethod } = await stripe.createPaymentMethod({
      type: "card",
      card: cardElement,
    });

    console.log("[Payment Method]", paymentMethod);

    if (error) {
      console.log("[error]", error);
    } else {
      const orderData = {
        line_items: checkoutToken.live.line_items,
        customer: {
          firstname: shippingData.firstName,
          lastname: shippingData.lastName,
          email: shippingData.email,
        },
        shipping: {
          name: "International",
          street: shippingData.address1,
          town_city: shippingData.city,
          county_state: shippingData.shippingSubdivision,
          postal_zip_code: shippingData.zip,
          country: shippingData.shippingCountry,
        },
        fulfillment: { shipping_method: shippingData.shippingOption },
        payment: {
          gateway: "stripe",
          stripe: {
            payment_method_id: paymentMethod.id,
          },
        },
      };

      onCaptureCheckout(checkoutToken.id, orderData);

      nextStep();
    }
  };

  return (
    <>
      <Review checkoutToken={checkoutToken} />
      <Divider />
      <Typography variant="h6" gutterBottom style={{ margin: "20px 0" }}>
        Payment method
      </Typography>
      <Elements stripe={stripePromise}>
        <ElementsConsumer>
          {({ elements, stripe }) => (
            <form onSubmit={(e) => handleSubmit(e, elements, stripe)}>
              <CardElement />
              <br /> <br />
              <div style={{ display: "flex", justifyContent: "space-between" }}>
                <Button variant="outlined" onClick={backStep}>
                  Back
                </Button>
                <Button
                  type="submit"
                  variant="contained"
                  disabled={!stripe}
                  color="primary"
                >
                  Pay {checkoutToken.live.subtotal.formatted_with_symbol}
                </Button>
              </div>
            </form>
          )}
        </ElementsConsumer>
      </Elements>
    </>
  );
};

export default PaymentForm;

Here是目前付款形式的图像.请注意,CardElement不存在.

在控制台中,我没有收到任何与Stripe相关的错误消息,也没有收到任何表明出错的消息.我甚至给了CardElement一个类名,并在Inspector中判断了它,发现它存在,但它是一个空Div.接下来,我查看了Stripe关于这个问题的文档,但似乎我已经正确地遵循了所有内容.

如果有人知道发生了什么,能给我指出正确的方向,我将不胜感激!

推荐答案

我终于解决了这个问题.显然,loadStripe()在服务器环境中解析为null.由于我正在为我的应用程序运行一个本地服务器,它返回null,因此我的CardElement没有呈现.将应用程序部署到AWS后,它现在可以按预期工作.

谢谢大家的帮助!

Reactjs相关问答推荐

重定向React路由中没有根文件夹的所有路径匹配

CSS转换不适用于React MUI对象

无法覆盖MUI工具栏上的左右填充,除非使用!重要

无法使用#13;或br将新行设置为文本区域'"&"<>

useTranslation不会在languageChanged上重新呈现组件

有没有办法让两个状态在两次精准渲染中更新?

REACTION 18功能组件正在开发中的S

在React Create App TS项目中安装material UI

可以使用mode.css/mode.scss引用常规的类名吗?

生产部署:控制台中 Firebase 无效 api 密钥错误

React 状态不更新

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

如何在不使用 Axios 的情况下将图像文件从 React.js 发送到 Spring Boot Rest API?

我如何在所有组件中使用 Chakra UI toast?

React - 仅在变量为真时显示项目

我刚刚部署了我的 Vite React 站点,但我的图标/图像没有部署

setState 改变对象引用

React Router v6 - 访问嵌套路由和处理手写 url 的正确方法

在 redux 工具包中使用 dispatch 发送多个操作

单击当前子div时如何更改p标签的图像和样式?react