Nodejs-微信支付接入示例

Nodejs-微信支付接入示例

代码示例

import request from 'request';
import xml2js from 'xml2js';
import qrcode from 'qrcode';
import fs from 'fs';
import { createHash } from 'crypto';

// 微信小程序的appid
const appid = 'wxa4*********228';
// 商户号
const mch_id = '16*******67';
// 密钥
const key = 'd94***********d58a7';

// 统一下单接口函数

function unifiedOrder(params, callback) {
    // 设置公共参数
    params.appid = appid;
    params.mch_id = mch_id;
    params.nonce_str = generateNonceString();
    params.trade_type = 'NATIVE';
    params.sign = generateSign(params);

    // 构建请求body的XML格式
    const builder = new xml2js.Builder();
    const xml = builder.buildObject({ xml: params });

    // 发送请求
    request.post(
        {
            url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
            body: xml,
        },
        function (error, response, body) {
            // 请求成功
            if (!error && response.statusCode === 200) {
                parseXML(body, callback);
            } else { // 请求失败
                callback(error || '请求失败');
            }
        }
    );
}

// 生成随机字符串
function generateNonceString(length = 32) {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let nonceStr = '';
    for (let i = 0; i < length; i++) {
        nonceStr += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return nonceStr;
}

// 生成签名
function generateSign(params) {
    const keys = Object.keys(params).sort();
    const string = keys
        .filter((key) => params[key] !== undefined && params[key] !== '')
        .map((key) => key + '=' + params[key])
        .join('&');
    const stringSignTemp = string + '&key=' + key;
    const sign = createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase();
    return sign;
}

// 解析XML格式的响应数据
function parseXML(xml, callback) {
    const parser = new xml2js.Parser({
        explicitArray: false,
        ignoreAttrs: true,
    });
    parser.parseString(xml, function (error, result) {
        if (error) {
            callback(error);
        } else {
            callback(null, result);
        }
    });
}

// 调用统一下单接口
const params = {
    body: '测试商品', // 商品描述
    out_trade_no: '123456789', // 商户订单号
    total_fee: 1, // 订单金额,单位分
    spbill_create_ip: '123.123.123.123', // 服务器IP地址
    notify_url: 'http://.com', // 微信支付结果通知的地址
};

unifiedOrder(params, function (error, result) {
    if (error) { // 下单失败
        console.error(error);
    } else { // 下单成功
        // 生成二维码
        qrcode.toFile(
            'qrcode.png', // 保存二维码图片的路径
            result.xml.code_url, // 生成二维码的文本内容
            {
                errorCorrectionLevel: 'H',
                type: 'png',
                scale: 10,
            },
            function (error) {
                if (error) { // 生成二维码失败
                    console.error('生成二维码失败:', error);
                } else { // 生成二维码成功
                    console.log('二维码已生成');
                    // 读取二维码图片文件
                    fs.readFile('qrcode.png', function (error, data) {
                        if (error) { // 读取二维码文件失败
                            console.error('读取二维码文件失败:', error);
                        } else { // 读取二维码文件成功
                            // 将二维码转换为Base64格式
                            const base64Data = data.toString('base64');
                            console.log('Base64格式的二维码:', base64Data);

                            // 删除二维码图片文件
                            fs.unlink('qrcode.png', function (error) {
                                if (error) { // 删除二维码文件失败
                                    console.error('删除二维码文件失败:', error);
                                } else { // 删除二维码文件成功
                                    console.log('二维码文件已删除');
                                }
                            });
                        }
                    });
                }
            }
        );
    }
});

实现了微信统一下单功能,并生成一个二维码

request : 用于发送HTTP请求。

xml2js : 用于解析XML格式的响应数据。

qrcode : 用于生成二维码图片。

fs : 用于读取和删除文件。

crypto : 用于生成签名。

定义微信小程序的 appid 、商户号和密钥。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值