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;
相关推荐
lyx_20163 小时前
PDF文档导出分页功能实现
react.js·typescript·pdf·react
在未来等你2 天前
AI Agent设计模式 Day 5:Reflexion模式:自我反思与持续改进
设计模式·llm·react·ai agent·plan-and-execute
阿桂有点桂5 天前
React使用笔记(持续更新中)
前端·javascript·react.js·react
在未来等你5 天前
AI Agent设计模式 Day 2:Plan-and-Execute模式:先规划后执行的智能策略
设计模式·llm·react·ai agent·plan-and-execute
在未来等你5 天前
AI Agent设计模式 Day 3:Self-Ask模式:自我提问驱动的推理链
设计模式·llm·react·ai agent·plan-and-execute
在未来等你6 天前
AI Agent设计模式 Day 1:ReAct模式:推理与行动的完美结合
设计模式·llm·react·ai agent·plan-and-execute
写完这行代码打球去7 天前
Umi 数据预加载功能详解
react
Zzzzzxl_9 天前
互联网大厂前端面试实录:HTML5、ES6、Vue/React、工程化与性能优化全覆盖
性能优化·vue·es6·react·html5·前端面试·前端工程化
老李说技术9 天前
React 中 useCallback 的基本使用和原理解析
react
csj5010 天前
前端基础之《React(7)—webpack简介-ESLint集成》
前端·react