stripe Element 如何使用

在这里插入图片描述
这里要准备好几个东西:

一个支付成功过后的回调

还有一个下单的接口

一旦进入这个下单界面,就要去调下单的接口的,用 post,

这个 接口你自己写,可以写在后端中,也可以放到 nextjs 的 api 中。

首先说的是这个下单接口

可以这样写:

import { NextRequest, NextResponse } from "next/server";
const stripe = require("stripe")(process.env.STRIPE_SECRET_KEY);export async function POST(request: NextRequest) {try {const { amount } = await request.json();const paymentIntent = await stripe.paymentIntents.create({amount: amount,currency: "usd",automatic_payment_methods: { enabled: true },});return NextResponse.json({ clientSecret: paymentIntent.client_secret });} catch (error) {console.error("Internal Error:", error);// Handle other errors (e.g., network issues, parsing errors)return NextResponse.json({ error: `Internal Server Error: ${error}` },{ status: 500 });}
}

这个东西一般是放后端,因为有个 secrets key,原则 nextjs 的 api 也算是后端。

要传入的参数呢,只有一个是金额,一个是 secret key ,

返回的信息是给前端用的,一个 client secret key.

可以理解为一个通用凭证。

前端怎么利用这个 key 。

    const { error } = await stripe.confirmPayment({elements,clientSecret,confirmParams: {return_url: `http://www.localhost:3000/payment-success?amount=${amount}`,},});

这个 elements 是 stripe 自带的,要利用到里面的一些组件,比如你开了 wechat 就要自动显示。

而不是自己写页面。

clientSecret 这个 client key 就是从后端返回的。

大约就是这样简单,最后这个 return url 中的。

我不太清楚,这样的话,还需要 webhook 吗,还需要去验证。

整个表单的代码我放一下:

"use client";import React, { useEffect, useState } from "react";
import {useStripe,useElements,PaymentElement,
} from "@stripe/react-stripe-js";
import convertToSubcurrency from "@/lib/convertToSubcurrency";const CheckoutPage = ({ amount }: { amount: number }) => {const stripe = useStripe();const elements = useElements();const [errorMessage, setErrorMessage] = useState<string>();const [clientSecret, setClientSecret] = useState("");const [loading, setLoading] = useState(false);useEffect(() => {fetch("/api/create-payment-intent", {method: "POST",headers: {"Content-Type": "application/json",},body: JSON.stringify({ amount: convertToSubcurrency(amount) }),}).then((res) => res.json()).then((data) => setClientSecret(data.clientSecret));}, [amount]);const handleSubmit = async (event: React.FormEvent<HTMLFormElement>) => {event.preventDefault();setLoading(true);if (!stripe || !elements) {return;}const { error: submitError } = await elements.submit();if (submitError) {setErrorMessage(submitError.message);setLoading(false);return;}const { error } = await stripe.confirmPayment({elements,clientSecret,confirmParams: {return_url: `http://www.localhost:3000/payment-success?amount=${amount}`,},});if (error) {// This point is only reached if there's an immediate error when// confirming the payment. Show the error to your customer (for example, payment details incomplete)setErrorMessage(error.message);} else {// The payment UI automatically closes with a success animation.// Your customer is redirected to your `return_url`.}setLoading(false);};if (!clientSecret || !stripe || !elements) {return (<div className="flex items-center justify-center"><divclassName="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-e-transparent align-[-0.125em] text-surface motion-reduce:animate-[spin_1.5s_linear_infinite] dark:text-white"role="status"><span className="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]">Loading...</span></div></div>);}return (<form onSubmit={handleSubmit} className="bg-white p-2 rounded-md">{clientSecret && <PaymentElement />}{errorMessage && <div>{errorMessage}</div>}<buttondisabled={!stripe || loading}className="text-white w-full p-5 bg-black mt-2 rounded-md font-bold disabled:opacity-50 disabled:animate-pulse">{!loading ? `Pay $${amount}` : "Processing..."}</button></form>);
};export default CheckoutPage;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法【Java】—— 双指针算法

双指针算法 常见的双指针有对撞指针&#xff0c;快慢指针以及前后指针&#xff08;这个前后指针是指两个指针都是从从一个方向出发&#xff0c;去往另一个方法&#xff0c;也可以认为是小学学习过的两车并行&#xff0c;我也会叫做同向指针&#xff09;&#xff0c;在前后指针…

【CMake】学习笔记2

文章目录 06.指定头文件路径07.通过CMake制作库文件制作动态库或静态库制作静态库制作动态库指定动态库/静态库输出的路径 08.在程序中链接静态库09.在程序中链接动态库11. 在cmake中打印日志信息12.字符串操作使用set拼接使用list拼接list字符串移除list其他命令 06.指定头文件…

vscode中使用官方推荐的编程字体Cascadia Code字体

字体样式 > 和 有特殊效果 很多字体都支持使用连字&#xff0c;Cascadia Code 、Jetbrains Mono 、Fira Code 等 安装Cascadia Code 下载完成后解压安装 选中右键安装&#xff0c;static文件里也一样安装 VS Code 中配置设置字体和连字设置 Cascadia Code, Consolas, Couri…

使用Java连接redis的方式

除了使用 Spring Data Redis&#xff0c;Java 连接 Redis 还可以通过以下几种方式&#xff1a; 1. Jedis Jedis 是一个流行的 Java Redis 客户端库&#xff0c;提供了简单的 API 来访问 Redis。 依赖&#xff1a; <dependency><groupId>redis.clients</grou…

Spring Boot集成Jythonb并且支持三方的python依赖包

上篇文章讲了 如何在java中执行python代码&#xff0c;这篇文章讲一下如何让jython支持三方依赖包 1.什么是Jython&#xff1f; Jython是Python编程语言的JVM实现。 它旨在在Java平台上运行。 Jython程序可以导入和使用任何Java类。 就像Java一样&#xff0c;Jython程序编译为…

SX_UNIX套接字通信_15

UNIX套接字通信的优势&#xff1a; UNIX套接字通信常用于一个项目中的进程之间通信&#xff0c;UNIX提供了与网络套接字相似的特性&#xff0c;但是避免了网络延迟&#xff0c;提高了性能&#xff0c;但是它只能在同一台机器上使用&#xff0c;无法跨越网络的进程间通信 实例&…

计算机的错误计算(六十七)

摘要 计算机的错误计算&#xff08;五十六&#xff09;与&#xff08;六十六&#xff09;分别探讨了大数与 附近数的正切函数值的错误计算。本节讨论第三种类型数值&#xff1a; 附近数 的正切函数的计算精度问题。 例1. 已知 计算 先用 Go语言计算&#xff1a; packag…

STL介绍以及string类

什么是STL 是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 为什么要学习string类 C语言中的字符串 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&am…

模具监视器的技术参数有哪些

模具监视器的技术参数涵盖了多个方面&#xff0c;这些参数对于确保模具监视器的性能、稳定性和检测精度至关重要。以下是一些主要的技术参数&#xff1a; 一、显示器参数 屏幕尺寸&#xff1a;常见的模具监视器显示器尺寸为12.5英寸至13.5英寸&#xff0c;具体尺寸可能因不同…

基于RabbitMQ的消息监听器

1. 背景 机构的新增、更新、删除在微服务A中已经完成了&#xff08;微服务A已经部署&#xff0c;不能修改代码&#xff09;&#xff0c;如果在微服务A中对机构进行新增、更新、删除操作后&#xff0c;需要同步到自己的微服务B中&#xff0c;这里采用MQ消息通知的方式实现。 微…

如何建立一个既能快速记录又易于回顾的笔记系统?

在快节奏的学习和工作中&#xff0c;能够快速记录和回顾信息变得尤为重要。尤其对于编程学习者来说&#xff0c;构建一个高效、有序的笔记系统不仅可以提高学习效率&#xff0c;还能帮助我们在未来轻松回溯知识要点。本文将详细探讨如何打造一个既快速记录又易于回顾的笔记系统…

打卡第48天------单调栈

今天正式开始单调栈&#xff0c;开启新的篇章了&#xff0c;那个动态规划真的太难了。不过卡尔总结的很全面&#xff0c;真的是收获不少呀。小坚持带来大改变。加油✊ 1. 每日温度 leetcode题目链接&#xff1a;739. 每日温度 题目描述&#xff1a; 给定一个整数数组 temperat…

使用EasyExcel填充Excel并上传至OSS

在企业级应用中&#xff0c;经常需要处理数据的导入导出功能。Excel作为最常用的数据交换格式之一&#xff0c;其自动化处理尤为重要。本文将介绍如何使用EasyExcel库来填充Excel模板&#xff0c;并将生成的文件上传到对象存储服务&#xff08;OSS&#xff09;。 EasyExcel简介…

Python 异步爬虫:高效数据抓取的现代武器

标题&#xff1a;“Python 异步爬虫&#xff1a;高效数据抓取的现代武器” 在当今信息爆炸的时代&#xff0c;网络爬虫已成为数据采集的重要工具。然而&#xff0c;传统的同步爬虫在处理大规模数据时往往效率低下。本文将深入探讨如何使用 Python 实现异步爬虫&#xff0c;以提…

HTTP?HTTPS?HTTP2.0

Http HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于分布式、协作式、超媒体信息系统的应用层协议。它基于TCP/IP通信协议来传递数据&#xff0c;如HTML文件、图片文件等。以下是HTTP的详细解析&#xff1a; 一、HTTP的基本…

YAML在Spring Boot中的应用

1. 基本语法 YAML使用缩进来表示层级关系&#xff0c;通常使用空格进行缩进&#xff08;推荐使用2个空格&#xff09;。 基本语法示例&#xff1a; key: value nested:key: value list:- item1- item22. 配置文件命名 在Spring Boot中&#xff0c;YAML配置文件通常命名为 a…

手撕C++入门基础

1.C介绍 C课程包括&#xff1a;C语法、STL、高阶数据结构 C参考文档&#xff1a;Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …

RDKit在数据科学中的应用|药物筛选中的数据清理与标准化

在化学信息学和药物研发的过程中,分子数据的质量至关重要。数据清理与标准化是确保分子库数据一致性、可靠性和可比较性的关键步骤。RDKit 提供了丰富的工具,帮助用户清理和标准化分子数据,从而提高下游分析和建模的准确性。 1 数据清理的重要性 分子数据通常来自多种来源…

获取操作系统的信息(Go语言)

在 Go 语言中&#xff0c;你可以使用 runtime 和 os 包来查看操作系统的信息。以下是一些常见的操作系统信息获取方法&#xff1a; 1. 获取操作系统类型和架构信息 Go 的 runtime 包提供了基本的操作系统和架构信息&#xff1a; package mainimport ("fmt""r…

c_cpp_properties.json、launch.json、 tasks.json

在 Visual Studio Code 中&#xff0c;c_cpp_properties.json、launch.json 和 tasks.json 是三个重要的配置文件&#xff0c;它们的作用如下&#xff1a; c_cpp_properties.json&#xff1a; 这个文件用于配置 C/C 扩展的 IntelliSense、编译器路径和包括路径等。它帮助 VS Co…