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;
相关推荐
zwjapple12 小时前
react+springboot的Docker部署
docker·部署·springboot·react
董厂长2 天前
阅读:REACT: SYNERGIZING REASONING AND ACTING INLANGUAGE MODELS(在语言模型中协同推理与行动)
人工智能·语言模型·agent·react
csj506 天前
前端基础之《React(1)—webpack简介》
前端·react
千码君201611 天前
React Native:发现默认参数children【特殊的prop】
javascript·react native·ecmascript·react·组件树
前端OnTheRun17 天前
React18学习笔记(四) 路由案例--记账本
react·router
whltaoin20 天前
Vue 与 React 深度对比:技术差异、选型建议与未来趋势
前端·前端框架·vue·react·技术选型
PyAIGCMaster25 天前
我的项目开发的一般流程,供交流
react·nextjs
aesthetician25 天前
ReactFlow:构建交互式节点流程图的完全指南
前端·流程图·react
fcm191 个月前
(6) tauri之前端框架性能对比
前端·javascript·rust·前端框架·vue·react