vue 对接 paypal 订阅和支付

一个是支付一个是订阅,写的时候尝试把他们放到一个里面,但是会报错,所以分开写了

我们的页面,前三个为订阅最后一个是支付,我把他们放到一个数组里面循环展示的,所以我们判断的时候只要判断id是否为4,如果是4那么就是支付别的就是订阅

进入页面的时候默认选中第一个,第一个是订阅,直接在onMounted里面去创建script标签,src就是订阅的值

根据你们的需求调整里面的参数和方法

复制代码
// 这个就是支付或者订阅的按钮
<div id="paypal-button-container"></div>
<div id="paypal-button-subscription"></div>



const subscriptionSdk ='https://www.paypal.com/sdk/js?client-id=${申请的SDK}&vault=true&intent=subscription';
const paySkd ='https://www.paypal.com/sdk/js?client-id=${申请的SDK}&currency=USD';

onMounted(() => {
  // 创建script 标签 定义他们的id
  const scriptId = 'subscriptionSdk';
  let script = document.createElement('script');
  script.id = scriptId;
  script.src = subscriptionSdk;
  script.onload = () => {
    // 创建订阅按钮
    subscriptionButton();
  };
  document.body.appendChild(script);
});

// 点击切换 订阅 或者 支付
const subscriptionChange = (i) => {
   // 这个地方根据你们需求写
    ......
// 这个是切换函数 进行判断
  createPayPalButton();
};


const createPayPalButton = () => {
  // 定于不同id进行判断是订阅还是支付
  const scriptId = subscriptionId.value == 4 ? 'paySdk' : 'subscriptionSdk';
   // 切换的时候先查询时候存在 如果存在就不用执行下面的
  let script = document.getElementById(scriptId);
  if (script) return;
  script = document.createElement('script');
  script.id = scriptId;
  script.src = subscriptionId.value == 4 ? paySkd : subscriptionSdk;
  script.onload = () => {
    if (subscriptionId.value == 4) {
      payButton();
    } else {
      subscriptionButton();
    }
  };
  document.body.appendChild(script);
};

// 创建支付按钮
const payButton = () => {
  paypal
    .Buttons({
      // 按钮样式
      style: {
        layout: 'horizontal',
        color: 'blue',
        shape: 'rect',
        label: 'checkout',
        tagline: false,
        height: 40,
        borderRadius: 10,
      },
      createOrder: async (data, actions) => {
        // 这里调用后端创建订单接口 获取到订单id
        await createRechargeChange();
        // 然后 return 出去
        return thirdPayId.value;
      },
      // 只是paypal支付完后的回调 在这里面进行查询操作即可
      onApprove: async (data) => {
        // 调用后端接口查询是否支付成功
      },
      onCancel: function (data) {
        console.log(data, '用户取消支付并返回到网站');
      },
    })
    .render('#paypal-button-container');
};
// 创建订阅
const subscriptionButton = () => {
  paypal
    .Buttons({
      style: {
        layout: 'horizontal',
        color: 'blue',
        shape: 'rect',
        label: 'checkout',
        tagline: false,
        height: 40,
        borderRadius: 10,
      },
      createSubscription: async (data, actions) => {
        // 创建订单
        await createRechargeChange();
        // 这一步 plan_id 要传的是订阅id 这个id问后端要
        return actions.subscription.create({ plan_id: planId.value });
      },

      onApprove: async (data) => {
        await paySubscription({
          id: orderId.value,
          subscriberId: data.subscriptionID,
        });
        const loading = ElLoading.service({
          lock: true,
          text: t('正在查询订阅结果,请稍后'),
          background: 'rgba(0, 0, 0, 0.7)',
        });
        let requestCount = 0;
        const maxRequests = 5;
        intervalId.value = setInterval(async () => {
          if (requestCount < maxRequests) {
            requestCount += 1;
            // 查询订单状态接口
            await fetchData(loading);
          } else {
            loading.close();
            clearInterval(intervalId.value);
            ElMessage.error(t('订阅失败,稍后重试'));
          }
        }, 1500);
      },
      onCancel: function (data) {
        console.log(data, '用户取消支付并返回到网站');
      },
    })
    .render('#paypal-button-subscription');
};
相关推荐
浩男孩37 分钟前
【🍀新鲜出炉 】十个 “如何”从零搭建 Nuxt3 项目
前端·vue.js·nuxt.js
拉不动的猪1 小时前
pc和移动页面切换的两种基本方案对比
前端·javascript·vue.js
Hilaku1 小时前
前端日志调试也能专业化?我们这样设计日志系统
前端·javascript
李杰同志891632 小时前
iOS moya 实现双token 刷新并重试
前端
前端小巷子2 小时前
跨标签页通信(五):IndexedDB
前端·面试·浏览器
LaoZhangAI2 小时前
2025全面评测:Flux AI图像生成器6大模型全解析【专业测评】
前端·后端
PioneerWang2 小时前
useContext及其原理解析
前端
用户7161912821762 小时前
告别繁琐的路由配置:vite-plugin-convention-routes 让你的 Vue 项目更优雅
前端
小桥风满袖2 小时前
Three.js-硬要自学系列34之专项学习几何体
前端·css·three.js
今阳2 小时前
鸿蒙开发笔记-17-ArkTS并发
android·前端·harmonyos