const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);
export default async (req, res) => {
const { items, email } = req.body;
const transformedItems = items.map((item) => ({
price_data: {
currency: "gbp",
unit_amount: item.price * 100,
product_data: {
name: item.title,
images: [item.image],
description: item.description,
},
},
quantity: 1,
}));
const session = await stripe.checkout.sessions.create({
payment_method_types: ["card"],
shipping_options: [
{
shipping_rates: ["shr_1M97piHPvZNNoU6bvw5ut7Oy"],
},
],
shipping_address_collection: {
allowed_countries: ["GB", "US", "CA"],
},
line_items: transformedItems,
mode: "payment",
success_url: `${process.env.HOST}/success`,
cancel_url: `${process.env.HOST}/checkout`,
metadata: {
email,
images: JSON.stringify(items.map((item) => item.image)),
},
});
res.status(200).json({ id: session.id });
};
这是结帐组件:
import Image from "next/image";
import React from "react";
import { useSelector } from "react-redux";
import CheckoutProduct from "../components/CheckoutProduct";
import Header from "../components/Header";
import { selectItems, selectTotal } from "../slices/basketSlice";
import Currency from "react-currency-formatter";
import { useSession } from "next-auth/client";
import { loadStripe } from "@stripe/stripe-js";
import axios from "axios";
const stripePromise = loadStripe(process.env.stripe_public_key);
function Checkout() {
const items = useSelector(selectItems);
const total = useSelector(selectTotal);
const [session] = useSession();
const createCheckoutSession = async () => {
const stripe = await stripePromise;
// Call the backend to create a checkout session
const checkoutSession = await axios.post("/api/create-checkout-session", {
items: items,
email: session.user.email,
});
// Redirect customer to Stripe checkout
const result = await stripe.redirectToCheckout({
sessionId: checkoutSession.data.id,
});
if (result.error) {
alert(result.error.message);
}
};
return (
<div className="bg-gray-100">
<Header />
<main className="lg:flex max-w-screen-2xl mx-auto">
{/* Left side */}
<div className="flex-grow m-5 shadow-sm">
<Image
src="https://links.papareact.com/ikj"
width={1020}
height={250}
objectFit="contain"
/>
<div className="flex flex-col p-5 space-y-10 bg-white">
<h1 className="text-3xl border-b pb-4">
{items.length === 0
? "Your Amazon Basket is empty."
: "Shopping Basket"}
</h1>
{items.map((item, i) => (
<CheckoutProduct
key={i}
id={item.id}
title={item.title}
rating={item.rating}
price={item.price}
description={item.description}
category={item.category}
image={item.image}
hasPrime={item.hasPrime}
/>
))}
</div>
</div>
{/* Right side */}
<div className="flex flex-col bg-white p-10 shadow-md">
{items.length > 0 && (
<>
<h2 className="whitespace-nowrap">
Subtotal ({items.length} items):{" "}
<span className="font-bold">
<Currency quantity={total} currency="GBP" />
</span>
</h2>
<button
role="link"
onClick={createCheckoutSession}
disabled={!session}
className={`button mt-2 ${
!session &&
"from-gray-300 to-gray-500 border-gray-200 text-gray-300 cursor-not-allowed"
}`}
>
{!session ? "Sign in to checkout" : "Proceed to checkout"}
</button>
</>
)}
</div>
</main>
</div>
);
}
export default Checkout;
这显示在VS Codes terimanl:StripePermissionError:无法使用可发布的API密钥进行此API调用。请使用API密钥。您可以在https://dashboard.stripe.com/account/apikeys.res. toJSON.then.StripeAPIError.message(/User/joanskenderi/Amazon克隆/node_modules/stripe/lib/StripeResources.js:216:23)在runMicrotask(
使用Stripe时,您有两种类型的密钥[1]
从后端服务器调用Stripe API时,看起来您使用的是可发布密钥(STRIPE_SECRET_KEY),而不是密钥。
您可以按照以下步骤为您的测试模式[2]生成一个API密钥,并将其用于您的测试。
[1] https://stripe.com/docs/keys#obtain-api-keys
[2] https://stripe.com/docs/keys#reveal-an-api-secret-key-for-test-mode