vue项目中的支付功能实现(微信支付和支付宝支付)

下面是关于Vue项目中实现微信支付和支付宝支付的完整攻略。

简介

在Vue项目中需要实现支付功能,常见的方式有微信支付和支付宝支付。微信支付目前还需要申请微信支付商户号,而支付宝支付可以使用支付宝开放平台提供的接口实现。

在项目中可以将支付功能实现为一个组件,以便在需要支付的地方引入使用。

微信支付

微信支付需要完成以下步骤:

  1. 申请微信支付商户号;
  2. 在项目中引入微信支付SDK,并配置好相关参数;
  3. 调用微信支付的接口生成预支付订单并返回相关参数;
  4. 使用微信支付的接口完成订单支付;
  5. 将支付结果同步到服务器端进行验证和记录。

引入SDK和配置参数

可以使用官方提供的微信支付SDK,也可以使用第三方库如weixin-js-sdk。以官方提供的SDK为例,可以在项目中引入以下脚本:

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

同时需要配置以下参数:

// 微信支付参数
const WX_APP_ID = 'your_app_id'; // 替换为自己的APP ID
const WX_MCH_ID = 'your_mch_id'; // 替换为自己的商户号
const WX_API_KEY = 'your_api_key'; // 替换为自己的API KEY
const WX_NOTIFY_URL = 'your_notify_url'; // 替换为自己的回调地址

生成预支付订单

使用微信提供的JSAPI,可以在前端生成预支付订单。以下为示例代码:

// 生成预支付订单
createUnifiedOrder(orderId, amount) {
  // 获取OpenID
  const openid = getCurrentOpenId(); // 从LocalStorage等缓存中获取

  // 请求服务器生成预支付订单,获取到预支付订单号prepay_id
  return axios.post('/api/wxpay/createUnifiedOrder', {
    openid,
    orderId,
    amount
  }).then(response => {
    const data = response.data;

    // 使用JSAPI调起微信支付
    wx.chooseWXPay({
      timestamp: data.timestamp,
      nonceStr: data.nonceStr,
      package: `prepay_id=${data.prepay_id}`,
      signType: 'MD5',
      paySign: data.sign,
      success: function(res) {
        // 支付成功,跳转到订单详情页面
        router.push({
          name: 'OrderDetail',
          params: {
            orderId: orderId
          }
        });
      },
      fail: function(res) {
        // 支付失败,提示用户
        Toast.fail(res.errMsg);
      }
    });
  });
}

这里的/api/wxpay/createUnifiedOrder接口需要在服务器端实现。可以使用官方提供的SDK和第三方库如wechatpay-openapi。下面是一个简单的实现,仅供参考:

// 生成预支付订单
app.post('/wxpay/createUnifiedOrder', async (req, res) => {
  const nonceStr = getRandomString(32);
  const outTradeNo = uuid.v4().replace(/-/g, '');
  const totalFee = req.body.amount;
  const {openid, orderId} = req.body;

  const order = {
    // ...
  };

  // 省略调用微信支付API生成预支付订单的代码

  res.json({
    appId: WX_APP_ID,
    timeStamp: timestamp,
    nonceStr: nonceStr,
    package: `prepay_id=${prepayId}`,
    signType: 'MD5',
    paySign: sign
  });
});

完成订单支付

在用户确认支付后,微信会调用预设的回调URL并带上支付结果,我们需要做以下事情:

  1. 对支付结果进行检验,判断支付流程是否正常;
  2. 如果支付成功,更新订单状态并保存支付结果。

以下为示例代码:

// 引入微信支付sdk
const WXPay = require('weixin-pay');

// 根据配置参数创建一个微信支付对象
const wxpay = WXPay({
  appid: WX_APP_ID,
  mch_id: WX_MCH_ID,
  partner_key: WX_API_KEY,
});

// 微信支付结果回调处理
app.post('/wxpay/notify', (req, res) => {
  // 将XML格式的通知消息解析成JSON格式
  wxpay.verifySign(req.rawBody).then((result) => {
    // 验证成功
    if (result.return_code === 'SUCCESS' && result.result_code === 'SUCCESS') {
      const outTradeNo = result.out_trade_no; // 商户订单号
      const totalFee = result.total_fee; // 支付金额
      const transactionId = result.transaction_id; // 微信支付订单号

      // 根据商户订单号查询订单,判断支付是否已完成
      return db.collection('orders').findOne({outTradeNo: outTradeNo});
    } else {
      // 验证失败
      console.error(result);
    }
  }).then((order) => {
    if (!order) {
      // 订单不存在或已处理过,不作处理
      return;
    }
    // 订单支付成功,更新订单状态
    order.status = 2; // 已支付
    order.transactionId = transactionId;
    order.payTime = new Date();

    // 保存订单状态
    return db.collection('orders').updateOne({_id: order._id}, {$set: order});
  }).then(() => {
    // 返回结果
    res.send({
      return_code: 'SUCCESS'
    });
  }).catch((error) => {
    console.error(error);
    res.send({
      return_code: 'FAIL'
    });
  });
});

最后将以上代码保存为一个组件,使用时只需要在需要支付的地方引入使用即可。

支付宝支付

支付宝支付需要完成以下步骤:

  1. 在支付宝开放平台上创建应用,并获取应用的APP ID和私钥;
  2. 在项目中引入支付宝支付SDK,并配置好相关参数;
  3. 调用支付宝支付的接口生成预支付订单并返回相关参数;
  4. 使用支付宝支付的接口完成订单支付;
  5. 将支付结果同步到服务器端进行验证和记录。

引入SDK和配置参数

可以使用官方提供的支付宝SDK,也可以使用第三方库如alipay-sdk。以官方提供的SDK为例,可以在项目中引入以下脚本:

<script src="https://appx/web-view.min.js"></script>

同时需要配置以下参数:

// 支付宝支付参数
const ALIPAY_APP_ID = 'your_app_id'; // 替换为自己的APP ID
const ALIPAY_MCH_ID = 'your_mch_id'; // 替换为自己的商户号
const ALIPAY_API_KEY = 'your_api_key'; // 替换为自己的API KEY
const ALIPAY_NOTIFY_URL = 'your_notify_url'; // 替换为自己的回调地址
const ALIPAY_PUBLIC_KEY = 'your_public_key'; // 替换为自己的公钥
const ALIPAY_PRIVATE_KEY = 'your_private_key'; // 替换为自己的私钥

生成预支付订单

使用支付宝提供的SDK,可以在前端生成预支付订单。以下为示例代码:

// 生成预支付订单
createTrade(orderId, amount) {
  // 请求服务器生成预支付订单,获取到预支付订单号tradeNo
  return axios.post('/api/alipay/createTrade', {
    orderId,
    amount
  }).then(response => {
    // 装载配置
    let iv = ""; //注意这里先设置一下iv值iv是无所谓的,只是必须要有
    let data = {
      authInfo: response.data.appAuthToken, // 这里需要使用appAuthToken
      orderStr: response.data.tradeStr, // 获取到的订单信息串
    };
    let resolve = (ret) => {
      // 支付成功,跳转到订单详情页面
      router.push({
        name: 'OrderDetail',
        params: {
          orderId: orderId
        }
      });
    };
    let reject = (error) => {
      // 支付失败,提示用户
      Toast.fail(error.description);
    };
    // 打开支付宝客户端并发起支付请求
    ap.tradePay({
        orderStr: data.orderStr,
    }, (res) => {
        // 可以在这里查询订单,以确认支付结果
        resolve(res);
    }, (err) => {
        // 失败回调
        reject(err);
    });
  });
}

这里的/api/alipay/createTrade接口需要在服务器端实现。可以使用官方提供的SDK和第三方库如alipay-sdk。下面是一个简单的实现,仅供参考:

// 生成预支付订单
app.post('/alipay/createTrade', async (req, res) => {
  // 省略对参数的解析和检验
  const notifyUrl = ALIPAY_NOTIFY_URL;

  const timestamp = moment().format('YYYY-MM-DD HH:mm:ss');
  const outTradeNo = uuid.v4().replace(/-/g, '');
  const totalAmount = req.body.amount;

  const order = {
    // ...
  };

  const alipaySdk = new AlipaySdk({
    appId: ALIPAY_APP_ID,
    privateKey: ALIPAY_PRIVATE_KEY,
    gateway: 'https://openapi.alipay.com/gateway.do',
    alipayPublicKey: ALIPAY_PUBLIC_KEY,
    timeout: 5000,
    signType: 'RSA2'
  });

  // 构造请求参数
  const bizContent = {
    body: '支付宝支付',
    subject: '订单支付',
    out_trade_no: outTradeNo,
    total_amount: totalAmount,
    product_code: 'QUICK_MSECURITY_PAY'
  };
  const extendParams = {
    sys_service_provider_id: ALIPAY_MCH_ID
  };
  const requestParams = {
    notify_url: notifyUrl,
    method: 'alipay.trade.app.pay',
    timestamp: timestamp,
    version: '1.0',
    app_id: ALIPAY_APP_ID,
    biz_content: JSON.stringify(bizContent),
    sign_type: 'RSA2',
    app_auth_token: 'your_token', // 替换为自己的授权令牌
    extend_params: JSON.stringify(extendParams) // 需要传递额外参数时传递
  };

  // 发起支付宝请求
  const result = await alipaySdk.exec('alipay.trade.app.pay', requestParams);

  res.json({
    tradeStr: result,
    appAuthToken: 'your_token' // 替换为自己的授权令牌
  });
});

完成订单支付

在用户确认支付后,支付宝会调用预设的回调URL并带上支付结果,我们需要做以下事情:

  1. 对支付结果进行检验,判断支付流程是否正常;
  2. 如果支付成功,更新订单状态并保存支付结果。

以下为示例代码:

// 引入支付宝sdk
const AlipaySdk = require('alipay-sdk').default;

// 根据配置参数创建一个支付宝sdk对象
const alipaySdk = new AlipaySdk({
  appId: ALIPAY_APP_ID,
  privateKey: ALIPAY_PRIVATE_KEY,
  gateway: 'https://openapi.alipay.com/gateway.do',
  alipayPublicKey: ALIPAY_PUBLIC_KEY,
  timeout: 5000,
  signType: 'RSA2'
});

// 支付宝支付结果回调处理
app.post('/alipay/notify', async (req, res) => {
  // 将form格式的通知消息解析成JSON格式
  const data = await alipaySdk.checkNotifySign(req.body);

  // 验证成功
  if (data.code === '10000' && data.trade_status === 'TRADE_SUCCESS') {
    const outTradeNo = data.out_trade_no; // 商户订单号
    const totalAmount = data.total_amount; // 支付金额
    const tradeNo = data.trade_no; // 支付宝交易流水号

    // 根据商户订单号查询订单,判断支付是否已完成
    const order = await db.collection('orders').findOne({outTradeNo: outTradeNo});

    if (order && order.status === 1) { // 未处理的支付结果才处理
      // 订单支付成功,更新订单状态
      order.status = 2; // 已支付
      order.tradeNo = tradeNo;
      order.amount = totalAmount;
      order.payTime = new Date();

      // 保存订单状态
      await db.collection('orders').updateOne({_id: order._id}, {$set: order});
    }
    // 返回结果
    res.send('success');
  } else {
    // 验证失败
    console.error(data);
    res.send('fail');
  }
});

最后将以上代码保存为一个组件,使用时只需要在需要支付的地方引入使用即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue项目中的支付功能实现(微信支付和支付宝支付) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue中$refs的三种用法解读

    下面我将详细讲解一下“vue中$refs的三种用法解读”的完整攻略。 一、$refs的作用 $refs是Vue.js提供的一个特殊的属性,它可以用来在父组件中访问子组件以及HTML元素。它的作用主要有以下三个方面: 访问子组件的实例对象 获取DOM元素的引用 访问子组件中的方法和属性 二、$refs的用法 1. 访问子组件的实例对象 使用$refs可以非常方…

    Vue 2023年5月27日
    00
  • 使用vue-cli创建vue项目介绍

    当我们要开始一个新的Vue项目时,我们可以使用Vue CLI来创建项目。Vue CLI是一个标准化的工具,用于快速搭建Vue项目。它会为我们提供一个Vue项目的基础结构,包含了很多开箱即用的插件和功能。 下面详细介绍如何使用Vue CLI来创建Vue项目的完整攻略。 环境准备 首先,我们要检查本地环境是否已经安装了Node.js。打开终端,输入以下代码检查是…

    Vue 2023年5月28日
    00
  • 详解Vue template 如何支持多个根结点

    Vue的template支持多个根节点的方法主要有两种,一种是使用Vue提供的template元素,另一种是使用Fragment。下面将详细介绍这两种方法的具体实现步骤。 一、使用Vue提供的template元素 1.1 什么是template元素 Vue提供了一个特殊的template元素,它可以作为多个根结点的容器。在使用该元素时,Vue会自动将它作为容…

    Vue 2023年5月27日
    00
  • vue3组合式API中setup()概念和reactive()函数的用法

    Vue 3的组合式API是一种全新的API,可以帮助我们更好地组织代码,以及管理组件内的状态和逻辑。其中,setup()是一个非常重要的概念,而reactive()则是其核心函数之一。 什么是setup()函数 setup()函数是组合式API中的一个重要概念,它允许我们在组件初始化时进行一些设置,例如定义变量、创建函数等等。这个函数在组件实例化之前被调用,…

    Vue 2023年5月28日
    00
  • vue3.0 CLI – 2.1 – component 组件入门教程

    Vue3.0 CLI – 2.1 – Component 组件入门教程 在Vue.js之中, Component 是构建任何类型的应用程序的核心概念之一。在本教程中,我会向你展示如何使用Vue3.0 CLI来创建并使用组件。我们将在VueCLI中的模板中构建两个简单的组件,并将它们添加到父级组件中。由此深入了解组件的工作原理。 步骤1:创建Vue3.0项目 …

    Vue 2023年5月27日
    00
  • Vue.js每天必学之Class与样式绑定

    Vue.js是一款非常流行的JavaScript框架,其拥有简单易用的API和灵活的数据绑定机制。其中,Class与样式绑定也是Vue.js开发中不可或缺的一部分。下面,我将介绍Vue.js每天必学之Class与样式绑定的详细攻略。 Class绑定 Vue.js中Class绑定的主要作用是用于动态地改变元素的class属性。在HTML中,元素的class属性…

    Vue 2023年5月28日
    00
  • Vue中四种操作dom方法保姆级讲解

    下面我就为你详细讲解一下“Vue中四种操作dom方法保姆级讲解”的攻略。 1. Vue中的DOM操作 在Vue中,我们可以通过四种方法操作DOM元素,这四种方法分别是:插入、更新、删除和替换。下面我们就来仔细看看这四种方法。 2. 插入一个DOM元素 我们可以利用Vue提供的v-html指令或{{}}插值语法插入一个DOM元素。以v-html指令为例,它可以…

    Vue 2023年5月27日
    00
  • Vue CLI 2.x搭建vue(目录最全分析)

    Vue CLI是一个基于Vue.js的官方CLI工具,可以帮助我们快速搭建Vue.js项目。在Vue CLI 2.x版本中,我们可以按照以下步骤来搭建Vue.js项目: 1. 安装Vue CLI 2.x 首先我们需要安装Vue CLI,可以使用以下命令来安装: npm install -g vue-cli@2.9.6 2. 创建项目 创建一个Vue.js项目…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部