编程 Node.js中接入微信支付

2024-11-19 06:28:31 +0800 CST views 666

Node.js中接入微信支付

在Node.js中接入微信支付主要涉及到使用微信支付的API来处理支付请求、订单查询、退款等操作。以下是一个基本的步骤指南,帮助你在Node.js服务器上实现微信支付功能。

1. 注册并配置微信支付商户账号

首先,你需要在微信支付平台(https://pay.weixin.qq.com/)注册成为微信支付商户,并获取必要的API密钥、商户ID(MCHID)等信息。

2. 安装必要的Node.js库

在Node.js项目中,你可能需要使用一些库来帮助你处理HTTPS请求和XML解析,例如axiosxml2js。你可以通过npm来安装这些库:

npm install axios xml2js

3. 创建支付请求

微信支付通常要求你通过HTTPS POST请求发送加密后的XML数据。你需要构造一个包含订单信息的XML字符串,然后使用微信提供的API密钥进行签名。

示例代码:

const axios = require('axios');
const xml2js = require('xml2js');

// 示例函数,用于发送支付请求
async function createPayment(orderInfo) {
  const xmlBuilder = new xml2js.Builder();
  const xml = xmlBuilder.buildObject({
    xml: {
      $: {
        version: '1.0',
        encoding: 'UTF-8',
      },
      appid: '你的APPID',
      mch_id: '你的商户号',
      nonce_str: '随机字符串',  // 随机字符串
      sign: '使用API密钥生成的签名',  // 生成的签名
      body: '商品描述',
      out_trade_no: '商户订单号',  // 唯一的订单号
      total_fee: '订单总金额',  // 订单金额(单位:分)
      spbill_create_ip: '用户端实际ip',  // 客户端IP
      notify_url: '通知地址',  // 支付结果通知的回调URL
      trade_type: 'JSAPI',  // 交易类型,JSAPI、NATIVE、APP等
      openid: '用户的openid(JSAPI支付时必填)',
    }
  });

  try {
    // 发送支付请求
    const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', xml, {
      headers: {
        'Content-Type': 'text/xml',
      },
    });

    // 解析返回的XML
    const resXml = await new Promise((resolve, reject) => {
      xml2js.parseString(response.data, (err, result) => {
        if (err) reject(err);
        resolve(result);
      });
    });

    // 处理响应结果
    if (resXml.xml.return_code[0] === 'SUCCESS' && resXml.xml.result_code[0] === 'SUCCESS') {
      // 微信返回成功,获取prepay_id等信息
      console.log('支付成功,预支付ID:', resXml.xml.prepay_id[0]);
      // 这里可以将prepay_id等信息返回给前端,前端调用微信支付API进行支付
    } else {
      console.error('支付失败,错误信息:', resXml.xml.err_code_des[0]);
    }
  } catch (error) {
    console.error('请求失败', error);
  }
}

// 注意:上面的示例中省略了签名生成和随机字符串生成的逻辑

在以上示例中,首先使用xml2js.Builder()构建XML格式的数据,然后通过axios.post发送POST请求到微信支付的统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder)。收到响应后,通过xml2js.parseString解析XML数据。

4. 处理支付结果

微信支付会向你的notify_url发送支付结果通知。你需要在这个URL对应的处理程序中验证通知的真实性(通过验证签名),并据此更新订单状态等。

示例代码:

const express = require('express');
const app = express();
const xmlParser = require('express-xml-bodyparser');

// 处理微信支付结果通知
app.post('/wechat/notify', xmlParser({trim: true, explicitArray: false}), (req, res) => {
  const notifyData = req.body.xml;

  // 验证签名 (略去具体签名验证逻辑)
  const isValid = verifySign(notifyData);  // 假设有个签名验证函数

  if (isValid && notifyData.return_code === 'SUCCESS') {
    // 支付成功,更新订单状态
    console.log('支付成功,订单号:', notifyData.out_trade_no);
    // 这里可以更新订单状态
    res.send('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
  } else {
    console.error('支付失败:', notifyData.return_msg);
    res.send('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[FAIL]]></return_msg></xml>');
  }
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个例子中,我们使用express-xml-bodyparser解析支付通知中的XML数据,然后根据签名验证结果和支付状态决定如何处理订单,并向微信返回处理结果。

5. 注意事项

  • 确保处理好所有可能的错误情况,包括网络错误、参数错误等。
  • 微信支付的安全要求很高,务必妥善保管你的API密钥等敏感信息。
  • 微信支付API的调用频率有限制,需要合理控制请求频率。
  • 微信支付文档(https://pay.weixin.qq.com/wiki/doc/api/index.shtml)是学习和调试微信支付功能的重要资源。

通过以上步骤,你就可以在Node.js中成功接入微信支付了。根据具体业务逻辑,你可以扩展代码实现更多功能,如订单查询、退款等。

复制全文 生成海报 支付 开发 Node.js 微信 API

推荐文章

一键压缩图片代码
2024-11-19 00:41:25 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
api接口怎么对接
2024-11-19 09:42:47 +0800 CST
Vue3中的组件通信方式有哪些?
2024-11-17 04:17:57 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
如何在 Linux 系统上安装字体
2025-02-27 09:23:03 +0800 CST
PyMySQL - Python中非常有用的库
2024-11-18 14:43:28 +0800 CST
前端如何优化资源加载
2024-11-18 13:35:45 +0800 CST
Rust开发笔记 | Rust的交互式Shell
2024-11-18 19:55:44 +0800 CST
Vue3中如何处理路由和导航?
2024-11-18 16:56:14 +0800 CST
一文详解回调地狱
2024-11-19 05:05:31 +0800 CST
程序员茄子在线接单