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;
相关推荐
吐个泡泡v1 天前
AI Agent 核心认知框架详解
react·cot·ai agent·认知框架
~无忧花开~1 天前
React组件与Props完全指南
开发语言·前端·react
yusheng_xyb1 天前
使用TypeScript与React构建高效用户界面
typescript·react·前端开发
胡少侠72 天前
ReAct Agent:手写 Thought-Action-Observe 循环,从工具调用到真正的 Agent
ai·agent·react·rag
胡西风_foxww3 天前
nextjs部署更新,Turbopack 和 Webpack 缓存冲突问题解决
缓存·webpack·react·nextjs·turbopack
We་ct7 天前
React 更新触发原理详解
开发语言·前端·javascript·react.js·面试·前端框架·react
却道天凉_好个秋8 天前
音视频学习(九十二):ts封装
音视频·ts
We་ct8 天前
React Render 与 Commit 阶段详解
前端·react.js·面试·前端框架·react·commit·render
风清云淡_A10 天前
【REACT19】开发中经常会用到的默认占位图片工具
react
zh_xuan1 个月前
React Native Demo
android·javascript·react native·ts