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

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

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

推荐文章

js常用通用函数
2024-11-17 05:57:52 +0800 CST
Vue3 结合 Driver.js 实现新手指引
2024-11-18 19:30:14 +0800 CST
Vue3中如何处理组件间的动画?
2024-11-17 04:54:49 +0800 CST
404错误页面的HTML代码
2024-11-19 06:55:51 +0800 CST
避免 Go 语言中的接口污染
2024-11-19 05:20:53 +0800 CST
mysql 计算附近的人
2024-11-18 13:51:11 +0800 CST
Nginx 状态监控与日志分析
2024-11-19 09:36:18 +0800 CST
开源AI反混淆JS代码:HumanifyJS
2024-11-19 02:30:40 +0800 CST
虚拟DOM渲染器的内部机制
2024-11-19 06:49:23 +0800 CST
LLM驱动的强大网络爬虫工具
2024-11-19 07:37:07 +0800 CST
Rust 高性能 XML 读写库
2024-11-19 07:50:32 +0800 CST
Vue3中如何进行异步组件的加载?
2024-11-17 04:29:53 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
api接口怎么对接
2024-11-19 09:42:47 +0800 CST
php腾讯云发送短信
2024-11-18 13:50:11 +0800 CST
Rust 与 sqlx:数据库迁移实战指南
2024-11-19 02:38:49 +0800 CST
动态渐变背景
2024-11-19 01:49:50 +0800 CST
Elasticsearch 监控和警报
2024-11-19 10:02:29 +0800 CST
基于Flask实现后台权限管理系统
2024-11-19 09:53:09 +0800 CST
CSS 中的 `scrollbar-width` 属性
2024-11-19 01:32:55 +0800 CST
7种Go语言生成唯一ID的实用方法
2024-11-19 05:22:50 +0800 CST
程序员茄子在线接单