stripe/paypal

stripe

stripe

前端(不用写代码,拿url地址即可)---获取对应的plan_id,传给后端,后端返回url地址,跳出去进行支付,后端返回回调定位回前端地址,根据返回参数判断是否支付成功即可

沙盒--支付卡号

paypal

react-paypal-js

相关文档
PayPal

需要切换PayPalScriptProvider -option配置

需要再PayPalButtons 在延迟展示(等PayPalScriptProvider 更新完成)

否则会导致按钮无法展示

查看更新验证

ts 复制代码
// nextjs 简单示例
import { PayPalScriptProvider, PayPalButtons } from "@paypal/react-paypal-js";
const Plans: React.FC = () => {
// 控制支付按钮刷新--显示
const [showpaypalbutton, setShowpaypalbutton] = useState(true); 
 const [initOptions, setInitOptions] = useState({
    clientId: process.env.NEXT_PUBLIC_PAYPAL_CLIENT_ID as string,
    vault: true, // false
    intent: "subscription", // capture - subscription
  })
  return (
<PayPalScriptProvider
                key={`paypal-provider-${paypalInfo.plan_type}`}
                options={initOptions}
              >
                {showpaypalbutton && mode === "subscription" && (<div>
                  <PayPalButtons
                    style={{
                      layout: "vertical",
                    }}
                    onCancel={async (data) => {
                      const result = await client_request("/subscription_cancel", "POST", {
                        ...data,
                      })
                      messageApi.warning("Payment Cancelled. Thank you for trying!");
                      console.log("onCancel", result);
                    }}
                    createSubscription={async () => {
                      const result = await client_request("/create_subscribe", "POST", { plan: 1 })
                      const _res = result.data as {
                        subscription_id: string
                        approve_url: string
                      }
                      console.log("create_order_createSubscription", _res.subscription_id);
                      subscriptionId.current = _res.subscription_id
                      return _res.subscription_id
                    }}

                    onApprove={async (data, actions) => {
                      console.log("onApprove", data);
                      const result = await client_request("/subscription_confirm", "POST", {
                        ...data,
                        status: "success"
                      })
                      if (result.code === 0) {
                        getPlans()
                      }
                      messageApi.success(
                        "Payment Successful! All videos are now unlocked. Enjoy!"
                      );

                      return Promise.resolve();
                    }}
                    onError={async (err) => {
                      console.log("onError", err);
                      messageApi.error(
                        "Payment Failed. Something went wrong. Please try again."
                      );
                    }}
                  />
                </div>)}

                {showpaypalbutton && mode === "one-time" && (<div>
                  <PayPalButtons
                    style={{
                      layout: "vertical",
                    }}
                    onCancel={async (data) => {
                      console.log("onCancel", data);
                      const result = await client_request("/subscription_cancel", "POST", {
                        ...data,
                        status: "cancel"
                      })
                      messageApi.warning("Payment Cancelled. Thank you for trying!");
                      console.log("onCancel", result);
                    }}
                    createOrder={async (data, actions) => {
                      const result = await client_request("/create_order", "POST", { ...data })
                      const _res = result.data as {
                        order_id: string
                        approve_url: string
                      }
                      subscriptionId.current = _res.order_id
                      // if (_res.approve_url) {
                      //   window.open(_res.approve_url, '_blank');
                      // }
                      return _res.order_id
                    }}
                    onApprove={async (data, actions) => {
                      console.log("create_order_onApprove=====", data);
                      const result = await client_request("/order_return", "POST", {
                        ...data,
                        status: "success"
                      })
                      if (result.code === 0) {
                        getPlans()
                      }
                      console.log("create_order", result);
                      messageApi.success(
                        "Payment Successful! All videos are now unlocked. Enjoy!"
                      );

                      return Promise.resolve();
                    }}
                    onError={async (err) => {
                      console.log("onError", err);
                      messageApi.error(
                        "Payment Failed. Something went wrong. Please try again."
                      );
                    }}
                  />
                </div>)}
              </PayPalScriptProvider>
)
};

export default Plans;
相关推荐
胡西风_foxww2 天前
Zustand 快速入门:5 分钟上手极简状态管理
react·zustand
im_AMBER3 天前
Canvas架构手记 07 状态管理 | 组件通信 | 控制反转
前端·笔记·学习·架构·前端框架·react
闲人编程4 天前
Django与前端框架集成:Vue.js、React的完美配合
vue.js·django·前端框架·react·codecapsule·分离式部署
Tongfront4 天前
前端通用submit方法
开发语言·前端·javascript·react
在未来等你7 天前
AI Agent设计模式 Day 19:Feedback-Loop模式:反馈循环与自我优化
设计模式·llm·react·ai agent·plan-and-execute
A3608_(韦煜粮)7 天前
深入理解React Hooks设计哲学与实现原理:从闭包陷阱到并发模式
javascript·性能优化·react·前端开发·react hooks·并发模式·自定义hooks
safestar20129 天前
React 性能优化之Fiber 架构深度解析:从堆栈调和到增量渲染的革命
前端·javascript·react
低代码布道师11 天前
01Nextjs+shadcn 医疗预约系统搭建-初始化脚手架
nextjs·shadcn
aiguangyuan11 天前
React 18 源码解读(一)
javascript·react·前端开发
aiguangyuan12 天前
React 中什么是可中断更新?
javascript·react·前端开发