无法使用 React.js 和 firebase 获取 /

问题描述

感谢您的光临。

我是 React.js 的新手,我正在使用 react js 和 firebase 进行亚马逊克隆。 我已将其部署到 Firebase,它运行良好,但是 Stripe 支付集成存在问题,Stripe 支付的问题是 clientSecret 显示未定义。因为无法完成支付 *(deployed)

IntegrationError: Missing value for stripe.confirmCardPayment intent secret: value should be a client_secret string

但在解决该问题时,我在浏览器中遇到了 cannot GET/ 错误

注意:

在带有 npm start 的 localhost 3000 上,除了条带密钥外,它可以完美运行。 但在 $ firebase emulators: start显示错误

enter image description here

我不知道问题出在哪里,/functions/index.js/src/components/Payment.js代码在这里给出。

/functions/index.js

const functions = require("firebase-functions");
const express = require("express");
const cors = require("cors");
const stripe = require("stripe")("<*secretKey*>");

// API

// - App config
const app = express();

// - Middlewares
app.use(cors({ origin: true }));
app.use(express.json());

// - API routes
app.get("/",(request,response) => response.status(200).send("hello world"));

app.post("/payments/create",async (request,response) => {
const total = request.query.total;

console.log("Payment Request Received BOOM!!! for this amount >>> ",total);

const paymentIntent = await stripe.paymentIntents.create({
   amount: total,currency: "usd",});

 // OK - Created
 response.status(201).send({
    clientSecret: paymentIntent.client_secret,});
});

// - Listen command
exports.api = functions.https.onRequest(app);

/src.components/Payments.js

import React,{ useState,useEffect } from 'react'
import { useStateValue } from '../StateProvider';
import CheckoutProduct from './CheckoutProduct'
import './Payment.css'
import { Link,useHistory } from 'react-router-dom'
import { CardElement,useElements,useStripe } from '@stripe/react-stripe-js'
import CurrencyFormat from 'react-currency-format';
import { getBasketTotal } from '../reducer';
import { Button } from 'react-bootstrap'
import axios from '../axios'




function Payment() {

    const [{basket,user},dispatch] = useStateValue();

    const history = useHistory();

    const stripe = useStripe();
    const elements = useElements();

    const [error,setError] = useState(null);
    const [disabled,setdisabled] = useState(true);
    const [succeeded,setSucceeded] = useState(false);
    const [processing,setProcessing] = useState("");
    const [clientSecret,setClientSecret] = useState(true);

    useEffect(() => {
        const getClientSecret = async () => {
            const response = await axios({
                method: 'post',url: `/payments/create?total=${getBasketTotal(basket) * 100}`,});
            setClientSecret(response.data.clientSecret)
        }

        getClientSecret();
    },[basket])

    console.log("The Secret is >>>",clientSecret)

    const handleSubmit = async event => {
        event.preventDefault();
        setProcessing(true)

        const payload = await stripe.confirmCardPayment(clientSecret,{
            payment_method: {
                card: elements.getElement(CardElement)
            }
        }).then(({ paymentIntent }) => {
            setSucceeded(true);
            setError(null);
            setProcessing(false);

            dispatch({
                type: "EMPTY_BASKET",})

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

    const handleChange = event => {
        setdisabled(event.empty);
        setError(event.error ? event.error.message : "");
    }

    return (
        <div className="payment">
            <div className="payment__container">
                <h1>checkout ( <Link to="/checkout" >{basket?.length} items</Link> )</h1>
                <div className="payment__section">
                    <div className="payment__title">
                        <h3>Delivery Address</h3>
                    </div>

                    <div className="payment__address">
                        <p>{user?.email}</p>
                        <p>Pakistan Locomotive Factory</p>
                        <p>Risalpur 23200</p>
                    </div>

                </div>

                <dv className="payment__section">
                    <div className="payment__title">
                        <h3>Review items and delivery</h3>
                    </div>
                    <div className="payment__items">
                    {basket.map(item => (
                    <CheckoutProduct
                        id={item.id}
                        title={item.title}
                        image={item.image}
                        price={item.price}
                        rating={item.rating}
                    />
                ))}
                    </div>
                </dv>

                <div className="payment__section">
                    <div className="payment__title">
                        <h3>Payment Method</h3>
                    </div>
                    <div className="payment__details">
                        {/* stripe magic goes here */}
                        <form onSubmit={handleSubmit}>
                            <CardElement className="payment__form" onChange={handleChange}/>

                            <div className='payment__priceContainer'>
                                <CurrencyFormat
                                    renderText={(value) => (
                                        <h3>Order Total: {value}</h3>
                                    )}
                                    decimalScale={2}
                                    value={getBasketTotal(basket)}
                                    displayType={"text"}
                                    thousandSeparator={true}
                                    prefix={"$"}
                                />
                                <Button variant="outline-info" disabled={processing || disabled || succeeded}>
                                    <span>{processing ? <p>Processing</p> : "Buy Now"}</span>
                                </Button>
                            </div>

                                {/* Errors */}
                            {error && <div>{error}</div>}
                        </form>
                    </div>
                </div>
            </div>
        </div>
    )
}

export default Payment;

/src/App.js

import React,{ useEffect } from 'react'
import './App.css';

import Header from './components/Header'
import Home from './components/Home'
import Checkout from './components/Checkout'
import Payment from './components/Payment'
import Orders from './components/Orders'

import { browserRouter as Router,Switch,Route } from 'react-router-dom';
import Login from './components/Login'
import { auth } from './firebase';
import { useStateValue } from './StateProvider';

import { loadStripe } from '@stripe/stripe-js'
import { Elements } from '@stripe/react-stripe-js'
// import SignUp from './components/SignUp'

const promise = loadStripe("pk_test_51JAmrZHsNUk0QSokC1Nj5ikhTIsLFkO86R3uEyyeBKZM2bEEuEr56Lvhq0xEHyJBlnh7BIGKMI9rJsk3y35kAeb3000YP6S59C")


function App() {
  const [{},dispatch] = useStateValue()

  useEffect(() => {
    auth.onAuthStateChanged(authUser => {
      console.log('This User is >>>>>',authUser);

      if (authUser){
        dispatch({
          type: 'SET_USER',user: authUser,})

      } else {
        dispatch({
          type: 'SET_USER',user: null
        })
      }
    })
  },[])

  return (
    <Router>
        <div className="App">

            <Switch>
              <Route path="/orders">
                  <Header />
                  <Orders />
                </Route>

                <Route path="/login">
                  <Login />
                </Route>

                {/* <Route path="/SignUp">
                  <SignUp />
                </Route> */}

                <Route path="/checkout">
                  <Header />
                  <Checkout />
                </Route>

                <Route path="/payment">
                  <Header />
                  <Elements stripe={promise}>
                    <Payment />
                  </Elements>
                </Route>
              {/* this is the home page route,default,by default if there is no route to go it will route the path 
              to "/" home page */}
                <Route path="/">
                  <Header />
                  <Home />
                </Route>

            </Switch>

        </div>
    </Router>
  );
}

export default App;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)