返回

Node.js微信支付之扫码支付指南

前端

前言

微信支付是微信推出的一项支付功能,用户可以在微信客户端上快速完成支付。微信支付非常方便快捷,深受广大用户的喜爱。在Node.js项目中集成微信支付非常简单,只需按照本文中的步骤操作即可。

创建订单

在用户发起支付请求之前,我们需要先创建一个订单。订单包含了商品的名称、价格、数量等信息。我们可以通过调用微信支付的统一下单接口来创建订单。

const { WechatPay } = require('wechat-pay');

// 初始化微信支付
const wechatPay = new WechatPay({
  appId: 'YOUR_APP_ID',
  mchId: 'YOUR_MCH_ID',
  apiKey: 'YOUR_API_KEY',
  secret: 'YOUR_SECRET',
});

// 创建订单
const order = {
  body: '商品名称',
  out_trade_no: '订单号',
  total_fee: 100, // 单位为分
  spbill_create_ip: '用户的IP地址',
  trade_type: 'NATIVE', // 支付类型为扫码支付
};

wechatPay.createUnifiedOrder(order, (err, result) => {
  if (err) {
    console.error('创建订单失败:', err);
    return;
  }

  // 获取二维码链接
  const qrcodeUrl = result.code_url;

  // 将二维码链接返回给前端,前端展示二维码给用户扫码支付
});

生成二维码

创建订单成功后,我们会得到一个二维码链接。这个二维码链接可以展示给用户,用户扫码后即可完成支付。

// 将二维码链接返回给前端,前端展示二维码给用户扫码支付
res.json({
  qrcodeUrl: qrcodeUrl,
});

查询订单状态

在用户扫码支付后,我们需要定时查询订单状态,以便在用户支付成功后及时通知用户。我们可以通过调用微信支付的查询订单接口来查询订单状态。

// 定时查询订单状态
setInterval(() => {
  wechatPay.queryOrder({
    out_trade_no: '订单号',
  }, (err, result) => {
    if (err) {
      console.error('查询订单状态失败:', err);
      return;
    }

    // 订单状态为已支付
    if (result.trade_state === 'SUCCESS') {
      // 通知用户支付成功
      res.json({
        success: true,
        message: '支付成功',
      });
    }
  });
}, 1000); // 每隔1秒查询一次订单状态

处理支付成功后的通知

在用户支付成功后,微信支付会向我们的服务器发送一个支付成功通知。我们需要在服务器上处理这个通知,并做出相应的处理,例如将订单状态标记为已支付。

// 处理支付成功后的通知
app.post('/notify', (req, res) => {
  const xml = req.rawBody;

  // 解析XML数据
  const parsedXml = xml2js.parseString(xml, { trim: true, explicitArray: false });

  // 验证通知的合法性
  if (!wechatPay.verifyNotify(parsedXml)) {
    res.status(400).send('Invalid notify');
    return;
  }

  // 订单号
  const out_trade_no = parsedXml.out_trade_no;

  // 将订单状态标记为已支付
  Order.findOneAndUpdate({ out_trade_no }, { status: '已支付' }, (err, order) => {
    if (err) {
      console.error('将订单状态标记为已支付失败:', err);
      return;
    }

    res.send('OK');
  });
});

总结

本文详细讲解了如何在Node.js项目中集成微信支付的扫码支付功能。通过本文的讲解,读者可以轻松地在自己的项目中实现微信支付功能。