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');
};
相关推荐
Filotimo_4 小时前
2.CSS3.(2).html
前端·css
yinuo5 小时前
uniapp微信小程序华为鸿蒙定时器熄屏停止
前端
gnip6 小时前
vite中自动根据约定目录生成路由配置
前端·javascript
前端橙一陈7 小时前
LocalStorage Token vs HttpOnly Cookie 认证方案
前端·spring boot
~无忧花开~7 小时前
JavaScript学习笔记(十五):ES6模板字符串使用指南
开发语言·前端·javascript·vue.js·学习·es6·js
泰迪智能科技017 小时前
图书推荐丨Web数据可视化(ECharts 5)(微课版)
前端·信息可视化·echarts
CodeCraft Studio8 小时前
借助Aspose.Email,使用 Python 读取 Outlook MSG 文件
前端·python·outlook·aspose·email·msg·python读取msg文件
家里有只小肥猫9 小时前
react 初体验2
前端·react.js·前端框架
慧慧吖@9 小时前
前端发送请求时,参数的传递格式
前端
L李什么李9 小时前
HTML——使用表格制作简历
前端·javascript·html