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');
};
相关推荐
0wioiw0几秒前
Flutter基础(前端教程⑤-组件重叠)
开发语言·前端·javascript
冰天糖葫芦13 分钟前
VUE实现数字翻牌效果
前端·javascript·vue.js
Brilliant Nemo15 分钟前
集成CommitLInt+ESLint+Prettier+StyleLint+LintStaged
javascript
嘉琪00118 分钟前
2025 js——面试题(7)——ajax相关
开发语言·javascript·ajax
南岸月明23 分钟前
我与技术无缘,只想副业搞钱
前端
liu_yueyang25 分钟前
JavaScript VMP (Virtual Machine Protection) 分析与调试
开发语言·javascript·ecmascript
gzzeason1 小时前
在HTML中CSS三种使用方式
前端·css·html
hnlucky1 小时前
《Nginx + 双Tomcat实战:域名解析、静态服务与反向代理、负载均衡全指南》
java·linux·服务器·前端·nginx·tomcat·web
huihuihuanhuan.xin1 小时前
前端八股-promise
前端·javascript
星语卿1 小时前
浏览器重绘与重排
前端·浏览器