Nodejs实现微信小程序支付功能前后端实践 全新的微信支付 APIv3

Nodejs接入微信支付详解-APIV3 网站需接入微信支付,后台使用的Nodejs,官方提供的SDK没有直接支持Nodejs,只有Java、PHP、Go的SDK,以下记录NodeJs详细接入过程,可直接使用。 阅读详情
AI摘要

本文详细介绍了如何使用uniapp前端和Node.js后端实现微信小程序支付功能,涉及用户openid获取、订单创建、预支付交易单生成、签名验证及支付回调等关键步骤。


theme: orange

前言

自己实现一个带支付功能的小程序,前端使用uniapp,后端使用Node.js,将实现微信小程序支付功能的全流程详细记录下来。使用的是全新的微信支付 APIv3,优点是 - 使用JSON作为数据交互的格式,不再使用XML

效果图:

请添加图片描述

准备工作

  1. 将小程序开通支付

image.png

  1. 微信支付接入指引

小程序支付逻辑全流程图解

image.png

获取用户小程序openid

一般获取用户小程序openid场景是放在首页默认登录或者登录页面进行,提前获取openid方便后面使用

获取用户openid需要两个步骤

  • 用户登录 uni.login
uni.login({
      success: res => {
        console.info(res);
        // 发送 res.code 到后端接口换取 openId, sessionKey
      }
    })
  • 后端获取openid,响应给前端 (需要使用前端的请求码code、小程序appid和密钥进行换取用户openid)
exports.getOpenId = [
    [body("code").notEmpty().withMessage('请求码不能为空.')],
    async (req, res, next) => {
        try {
            const errors = validationResult(req)
            if (!errors.isEmpty()) {
                return apiResponse.validationErrorWithData(res, "参数错误.", errors.array()[0].msg);
            }
            const {code} = req.body
            const tokenResponse = await axios.get(`https://api.weixin.qq.com/sns/jscode2session?appid=小程序的appid&secret=小程序的密钥&js_code=${code}&grant_type=authorization_code`);
            //openid类似: ocikq40Fkx8E96zSoDYOB74v5pK6
            return apiResponse.successResponseWithData(res, "获取openid成功.", tokenResponse.data);
        } catch (err) {
            next(err);
        }
    }
];

创建订单

这一步骤是创建我们自己的订单得到自定义的订单号,这方便我们系统的订单和微信后台的支付订单相关联查询,是必不可少的步骤

  • 微信小程序进行下单生成订单信息

    略 就简单的提交信息给后端生成订单存入数据库

  • 后端实现小程序创建订单接口

/**
 * 小程序创建订单接口
 * @security JWT - 需要提供有效的访问令牌
 */
exports.ordersCreate = [
    tokenAuthentication,
    [
        body("phone").notEmpty().withMessage('手机号不能为空.'),
        body("packageType").notEmpty().withMessage('套餐类型不能为空.'),
        body("packageId").notEmpty().withMessage('套餐ID不能为空.'),
        body("rechargeAmount").notEmpty().withMessage('充值金额不能为空.'),
        body("openid").notEmpty().withMessage('openid不能为空.'),
        ...其他参数校验
    ],
    async (req, res, next) => {
        try {
            const errors = validationResult(req);
            if (!errors.isEmpty()) {
                return apiResponse.validationErrorWithData(res, "参数错误.", errors.array()[0].msg);
            }
            // 创建订单
            const orderInfo = await PhoneBillOrdersModel.create({
            ...req.body,
            orderNo: generateUniqueOrderNumber(), // 生成自定义的订单号 1708570774203JDX
            });

            return apiResponse.successResponseWithData(res, "创建订单成功.", orderInfo);
        } catch (err) {
            next(err);
        }
    }
];

开始正式支付前准备

  1. 参数申请
  2. 配置API key
  3. 下载并配置商户证书

微信支付v3开发准备

生成预支付交易单(开始正式支付获取到预支付标识:prepay_id)

生成预支付交易单文档:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/direct-jsons/jsapi-prepay.html

预支付请求地址:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi

这部分很重要步骤比较繁琐也容易出错

在请求 预支付地址 需要准备几个东西
  1. 微信支付商户号、获取商户API证书 (商户API证书的压缩包中包含了签名必需的私钥和商户证书)
  2. 构造签名串 (https://pay.weixin.qq.com/docs/merchant/development/interface-rules/signature-generation.html)
  3. 计算签名值 (对API证书进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值)
  4. 设置HTTP头 (微信支付商户API v3要求请求通过HTTP Authorization头来传递签名)

因为官方文档并没有给出Nodejs的相关示例

下面我以 Nodejs来实现调用预支付接口

  1. 微信支付商户号、获取商户API证书
  • 商户号在微信支付平台获取 例如:1900009191
  • 获取商户API证书 在微信支付平台获取压缩包解压出来 例如:apiclient_key.pem
  1. 构造签名串

构造签名串:签名串一共有五行,每一行为一个参数。结尾以\n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n

HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
// 构造签名串
let signStr = `${method}\n${url}\n${timestamp}\n${nonce_str}\n${JSON.stringify(order)}\n`; 
  1. 计算签名值

计算签名值:对API证书(商户私钥)对 待签名串(上面构造的签名串) 进行SHA256 with RSA签名,并对签名结果进行Base64编码得到签名值

/**
 * 微信支付v3 下单签名值生成
 * @param {string} pem pem证书名称
 * @param {string} method 请求方法
 * @param {string} url  微信小程序下单官方api
 * @param {number} timestamp 时间戳 秒级
 * @param {string} nonce_str 随机字符串
 * @param {Object} order 主体(订单)信息
 */
function createOrderSign(pem,method, url, timestamp, nonce_str, order) {
    // 签名串
    let signStr = `${method}\n${url}\n${timestamp}\n${nonce_str}\n${JSON.stringify(
        order
    )}\n`; 
    // 读取API证书文件内容 apiclient_key.pem的内容
    let cert = fs.readFileSync(`./pems/files/${pem}`, "utf-8"); 
    // 创建使用 RSA 算法和 SHA-256 散列算法的签名对象
    let sign = crypto.createSign("RSA-SHA256");
    // 对签名串进行加密处理
    sign.update(signStr);
    return sign.sign(cert, "base64");
}
  1. 设置HTTP头

微信支付商户API v3要求请求通过HTTP Authorization头来传递签名。Authorization由认证类型和签名信息两个部分组成。

Authorization: 认证类型 签名信息

具体组成为:

  1. 认证类型,目前为 WECHATPAY2-SHA256-RSA2048

  2. 签名信息

    • 发起请求的商户(包括直连商户、服务商或渠道商)的商户号mchid
    • 商户API证书序列号serial_no,用于声明所使用的证书 (apiclient_key.pem 里面的序列号(获取方法有很多 https://www.yesdotnet.com/archive/post/1621531570.html))
    • 请求随机串nonce_str
    • 时间戳timestamp
    • 签名值signature
// 生成随机字符串
function generateNonceStr(len) {
    let data = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
    let str = "";
    for (let i = 0; i < len; i++) {
        str += data.charAt(Math.floor(Math.random() * data.length));
    }
    return str;
}

let timestamp = Math.floor(new Date().getTime() / 1000);
let nonce_str = generateNonceStr(32);
//  计算签名值
let signature = createOrderSign(
    API证书名称,
    "POST",
    "/v3/pay/transactions/jsapi",
    timestamp,
    nonce_str,
    wxOrderInfo
);
// 设置HTTP头
let Authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${ac.mchid}",nonce_str="${nonce_str}",timestamp="${timestamp}",signature="${signature}",serial_no="${商户API证书序列号}"`;
正式请求 预支付接口
/**
 * 微信支付v3 支付信息获取交易会话标识 prepay_id
 * @param {Object} order 主体信息
 * @param notifyUrl 回调地址 https://qy.xxx.com/v1/payment/wx/success 下面有具体实现方式
 */
exports.getPrepayInfo = async function (order,notifyUrl) {
    let timestamp = Math.floor(new Date().getTime() / 1000);
    let nonce_str = generateNonceStr(32);
    const ac = await getThirdKeys()
    let wxOrderInfo = {
        mchid:商户号,
        appid:小程序appid,
        notify_url:notifyUrl, // 回调地址 这里需要我们自行实现用来接收支付结果信息
        out_trade_no: order.orderNo, // 上面创建的订单的订单号 我们自己自定义的
        description: order.description,// 商品描述
        amount: {
            total: order.amount, // 单位为分
            currency: "CNY"
        },
        payer: {
            openid: order.openid // 用户的openid
        }
    }
    let signature = createOrderSign(
        ac.pem,
        "POST",
        "/v3/pay/transactions/jsapi",
        timestamp,
        nonce_str,
        wxOrderInfo
    );
    let Authorization = `WECHATPAY2-SHA256-RSA2048 mchid="${ac.mchid}",nonce_str="${nonce_str}",timestamp="${timestamp}",signature="${signature}",serial_no="${ac.serial_no}"`;

    // 拿到 "prepay_id": "wx26112221580621e9b071c00d9e993b00666"
    return await axios.post("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", wxOrderInfo, {
        headers: {Authorization: Authorization},
    })
}

后端生成支付参数

后端生成支付参数响应给前端小程序进行拉起支付

/**
 * 微信支付v3 付款签名生成支付参数
 * @param {string} prepay_id 预支付交易会话标识
 */
exports.createPaySign =async function (prepay_id) {
    let timeStamp = (Math.floor(new Date().getTime() / 1000)).toString();
    let nonceStr = generateNonceStr(32);
    const ac = await getThirdKeys()
    let signStr = `${ac.appid}\n${timeStamp}\n${nonceStr}\nprepay_id=${prepay_id}\n`;
    let cert = fs.readFileSync(`./pems/files/${ac.pem}`, "utf-8");
    let sign = crypto.createSign("RSA-SHA256");
    sign.update(signStr);
    return {
        paySign: sign.sign(cert, "base64"),
        timestamp: timeStamp,
        nonce_str: nonceStr,
        signType: 'RSA',
        package: 'prepay_id=' + prepay_id
    };
}

小程序拉起支付

// 从后端获取到支付参数(上面 createPaySign 生成的数据)
phoneWxRequest(that.form).then(res => {
 wx.requestPayment({
  provider: 'wxpay',
  timeStamp: res.timestamp,
  nonceStr: res.nonce_str,
  package: res.package,
  signType: res.signType,
  paySign: res.paySign,
  success(res) {
   uni.showModal({
    title: '提示',
    content: '支付成功!',
    showCancel: false,
    success: function(res) {
     if (res.confirm) {
      uni.switchTab({
       url: '/pages/index/index'
      })
     }
    }
   });
  },
  fail(err) {
   uni.switchTab({
    url: '/pages/index/index'
   })
   console.log('fail:' + JSON.stringify(err));
  }
 });
})

微信支付回调 (会多次调用)

微信支付通过支付通知接口将用户支付成功消息通知给商户。
https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/payment-notice.html

回调URL: 该链接是通过基础下单接口中的请求参数“notify_url”来设置的,要求必须为HTTPS地址。请确保回调URL是外部可正常访问的,且不能携带后缀参数,否则可能导致商户无法接收到微信的回调通知信息。回调URL示例:“https://qy.xxx.com/v1/payment/wx/success”

具体接口实现

  1. 验证签名

微信支付会对发送给商户的通知进行签名,并将签名值放在通知的HTTP头Wechatpay-Signature。商户应当验证签名,以确认请求来自微信,而不是其他的第三方。签名验证的算法请参考 《微信支付API v3签名验证》。

  1. 参数解密
/**
 * 微信支付v3 支付通知回调参数解密
 * resource 为 回调回来的参数
 */
exports.decodePayNotify =async function (resource) {
    try {
        const AUTH_KEY_LENGTH = 16;
        // ciphertext = 密文,associated_data = 填充内容, nonce = 位移
        const { ciphertext, associated_data, nonce } = resource;
        // 密钥
        const ac = await getThirdKeys()
        const key_bytes = Buffer.from(ac.key, 'utf8');
        // 位移
        const nonce_bytes = Buffer.from(nonce, 'utf8');
        // 填充内容
        const associated_data_bytes = Buffer.from(associated_data, 'utf8');
        // 密文Buffer
        const ciphertext_bytes = Buffer.from(ciphertext, 'base64');
        // 计算减去16位长度
        const cipherdata_length = ciphertext_bytes.length - AUTH_KEY_LENGTH;
        // upodata
        const cipherdata_bytes = ciphertext_bytes.slice(0, cipherdata_length);
        // tag
        const auth_tag_bytes = ciphertext_bytes.slice(cipherdata_length, ciphertext_bytes.length);
        const decipher = crypto.createDecipheriv(
            'aes-256-gcm', key_bytes, nonce_bytes
        );
        decipher.setAuthTag(auth_tag_bytes);
        decipher.setAAD(Buffer.from(associated_data_bytes));
        const output = Buffer.concat([
            decipher.update(cipherdata_bytes),
            decipher.final(),
        ]);
        // 解密后 转成 JSON 格式输出
        return JSON.parse(output.toString('utf8'));

    }
    catch (error){
        console.error('解密错误:', error);
        return null;
    }

}

回调接口具体实现

/**
 * 微信支付回调
 * @param {Object} req - 请求对象,包含查询参数
 * url  https://qy.xxx.com/v1/payment/wx/success
 */
exports.paymentSuccess = [
    async (req, res, next) => {
        try {
            let result = req.body
            // 解密微信支付成功后的订单信息
            const deInfo = await decodePayNotify(result.resource)
            if (!deInfo) {
                console.log('支付回调解析失败',deInfo)
                logger.error(`支付回调解析失败: ${JSON.stringify(deInfo)}`);
                return res.status(200).json({code: 'SUCCESS', message: '成功'});
            }
            //*****
            
            对订单修改或者其他业务逻辑即可
            
            //*****
            return res.status(200).json({code: 'SUCCESS', message: '成功'});
        }
        catch (err) {
            res.status(500).json({code: 'FAIL', message: '失败'});
        }
        
    }
];

结束

微信小程序支付全流程大概就这些,有不对不清楚的地方欢迎指正哦

  • 我的主页:https://www.zhouyi.run
  • 码云:https://gitee.com/Z568_568
微信支付v3在Node.js和TypeScript中的实践与应用 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变,例如:遵循统一的Restful的设计风格使用JSON作为数据交互的格式,不再使用XML使用基于非对称密钥的SHA256-RSA的数字签名算法,不再使用MD5或HMAC-SHA256不再要求HTTPS客户端证书使用AES-256-GCM,对回调中的关键信息进行加密保护自己实现接口,使用如下方法注入或者参数介绍参数名称参数介绍是否必须appid直连商户申请的公众号或移动应用appid是mchid。 阅读详情

相关推荐

node Express 跟html混写实现微信支付

订单号:微信支付金额:

持之以恒 506

关于使用nodejs搭建微信小程序支付接口

nodej.js搭建微信小程序支付接口

weixin_45952249的博客 6760

云函数(nodeJs)实现微信支付(V2、V3)完整教程

前言: 微信支付V2的接口简单,我就不赘述了,交流V2的问题,请添加vx:W2955692649。 其实V3改动挺大,而且的是尴尬微信支付官方给的示例没有nodeJs的,而大多数人全靠一条云函数解决所有问题。。。 不说嗨话,上代码: // 云函数入口文件 var cloud = require('wx-server-sdk') crypto = require('crypto') request = require('request') NodeRSA = require(

guanjialababy的博客 1632

【Node.js】实现微信小程序在线支付功能

node.js实现微信小程序在线支付功能

业余丰富各种技术栈 3474

RTL优化与PPA分析:数字电路设计的关键技术

在数字集成电路设计中,RTL(寄存器传输级)优化是提升芯片性能、降低功耗和减小面积的核心技术。通过PPA(Power-Performance-Area)指标的平衡,工程师可以在不同时序约束下实现设计的最优化。本文基于Synopsys Design Compiler和开源工具Yosys的实验数据,展示了RTL优化在算术单元和控制逻辑中的显著效果,特别是在乘法器和除法器等复杂运算模块中。文章还探讨了AI辅助工具在RTL优化中的应用潜力,为数字电路设计提供了实用的技术参考和工程实践建议。

weixin_42186387的博客 619

西门子 标准程序解读---> 机器手抓取和涂胶控制程序

摘要 该程序实现机械手在OP70/OP90工位的自动化控制,核心功能包括: 流程控制:分段(Seg1-Seg11)管理抓件、涂胶、放件等动作,结合DB1050/DB1250数据块监控工位状态及变位机位置反馈。 安全机制:配置干涉区(FC124)、实时检测安全光/急停信号,防止碰撞;服务程序(FB191)支持维修位触发与安全隔离。 参数配置:通过DB块关联机器人速度、节拍(FB27)、车型编码(如空过=2)及手自动模式(DB70.DBX21.2)。 应用场景:适用于汽车焊接/装配线

工控智联驿站 1239

话费充值系统基于NodeJS+MongoDB 有微信支付、微信通知

✨项目主要对接第三方接口充值海外手机话费业务 带有微信支付、微信通知等 管理端 基于角色权限管理 登录 基于 vue3+js+antd+nodejs+express.js+uniapp+mongodb

html0010的博客 2475

统信UOS服务器上,达梦DM8数据库安装避坑全记录(附大小写敏感设置)

本文详细介绍了在统信UOS服务器版上部署达梦DM8数据库的全过程,包括环境准备、安装流程、数据库实例初始化及关键参数配置,特别是大小写敏感设置的注意事项。提供了从系统配置到性能优化的完整指南,帮助用户避免常见问题,确保数据库稳定运行。

weixin_30647423的博客 332

node 微信小程序支付及通知

要在小程序里集成微信支付,小程序自身必须是通过微信认证的。从扫码进去,点击左侧菜单的微信认证。

IT_iosers的博客 1295

Vue3 - 完美解决 vite 打包后在本地浏览器直接打开运行,build 打包后双击 index.html 直接以 file 协议运行网站(资源、接口等正常访问,和部署到服务器运行效果一样)

vue3vite怎么支持file协议本地打开,vite打包文件如何支持files协议,支持双击即可打开网页,vue3vite打包后双击本地运行,vue3vite打包后怎么直接在浏览器双击打开访问,vite打包后显示空白,vite如何支持本地file协议打开,vue3vite打包后如何本地查看网站,vue3vite项目打包后本地启动白屏怎么办,vite打包后的代码如何在本地运行,vite+vue3打包在fIle本地index.html打开项目,打包后如何直接打开index.html文件,vue3

🏆 前端领域优质创作者 1万+

鸿宇多用户商城user.php RCE漏洞复现

鸿宇多用户商城 user.php 存在任意命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。

0xSec 1622

Node.js和uni-app实现微信小程序支付

自己实现一个带支付功能的小程序,前端使用uniapp,后端使用Node.js,将实现微信小程序支付功能的全流程详细记录下来。使用的是全新的微信支付 APIv3。

china-quanda 2597

使用Zed 实现测距

此代码基于官方代码基础上进行改写,主要是获取zed相机深度画面的深度值,为yolo测距打基础。Zed相机是由Stereolabs公司开发的一种先进的立体视觉相机。这种相机专为计算机视觉和机器学习应用而设计,能够提供高质量的3D捕捉和分析功能。: Zed相机配备有一对垂直排列的传感器,能够捕捉两个略有偏移的图像,从而模拟人的双眼视觉,实现深度感知。: 利用立体成像技术,Zed相机能够实时生成环境的3D模型,这对于机器人导航、增强现实(AR)和虚拟现实(VR)等应用至关重要。

weixin_45303602的博客 912

2021 微信小程序连接微信支付流程教程

2021 微信小程序连接微信支付流程教程 这他x太坑了,我必须写下来。 撰写支付系统前要准备一下资料,要注意有微信小程序平台和微信支付平台两个平台,两个设置是独立的。准备资料会需要好几天,可以的话要提早准备。 App Id 和 App Secret :这个要从微信小程序平台提取,注册好了就会有。 Merchant Id (mchid) : 这个要从微信支付平台提取,并且要从那个平台连接上你的小程序,一切报备要做。 CA 证书:这个从微信支付平台得到,在安全中心里。微信会提供一个证书(这个过程还

weixin_49323954的博客 2232

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 1623

QT上位机开发(掌握一点c++基础)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 c++是c语言的补充和扩展,本身的语法构成也是在一直迭代中。相信很多同学上大学读书的时候,或多或少对c语言有所了解,对它的变量、指针、函数也应该不陌生。既然大家都有c语言基础的话,那么在这方面稍微拓展一下的话,就可以学会c++了。当然c++本身的内容很多,很多方面还很琐碎,但我们学习的时候还是应该把精力放在那些经常使用到的语法上面。

嵌入式-老费,一个分享专业嵌入式知识的blog 1131

NodeJS 基于API v3 实现微信小程序的支付

NodeJS 基于API v3 实现微信小程序的支付

银滴子的博客 2434

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

nodejs开发微信小程序支付

点击开始支付就调用微信登录接口,我这里由于是测试支付就直接拉起支付弹窗。wx.login({data: {order: {price: 1, //单位 分。只能是分description: "Image形象店-深圳腾大-QQ公仔"},title: '提示',content: '支付成功!',});},});})})

奇点的博客 1575

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

uniapp+nodejs实现小程序支付

uniapp小程序,微信支付

m0_56104994的博客 674

Thinkphp和Laravel框架微信小程序的服务预约订购系统-

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

abo2022的博客 172

Thinkphp和Laravel框架的旅游服务app小程序

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

我的个人的博客 170

NodeJS+微信小程序构建个性化社团管理系统

现代Web开发中,前后端分离架构已成为主流技术范式,其中Node.js凭借其非阻塞I/O模型和npm生态优势,成为构建轻量级后端服务的首选。结合MongoDB的灵活文档结构,开发者可以快速实现动态数据模型,这种技术组合特别适合需要快速迭代的教育类应用。微信小程序作为跨平台前端解决方案,通过组件化开发模式大幅提升代码复用率。本文以高校社团管理系统为例,详解如何运用Node.js三层架构设计RESTful API,配合小程序动态表单渲染技术,实现社团个性化配置功能。项目中采用的RBAC权限模型和MongoDB聚

weixin_33508411的博客 220

nodejs实现微信支付

1、H5支付和jssdk微信支付的区别 H5支付:只能在微信外部的浏览器进行支付 jssdk微信支付:可以让我们h5页面在微信里面调用原生的api功能,这就叫jssdk,即在微信里面完成的支付 ...

越思考越清晰 1万+

基于vue+node.js实现的微信在线支付功能

本文将介绍如何使用Vue.js和Node.js结合实现微信在线支付功能。通过前端框架Vue.js和后端框架Node.js的协作,我们可以快速构建一个完整的在线支付系统,并提供示例代码帮助您理解和实现。

柯晓楠 2823

微信h5支付流程,nodejs与云函数版本

本文将介绍在nodejs开发环境下的微信h5支付流程,由于笔者被微信文档逼疯,又被网上的多种不完全的博客坑害,所以总结自己的经验,给出完整流程。注意!笔者的开发环境是uniapp+unicloud,运行环境是在微信浏览器中的公众号h5网页,依托于微信公众号。后端是nodejs,如果是使用java和php的朋友可以完全参考微信开放文档,因为有完整的sdk示例流程。只需要了解前端换取code的方式即可。

sc909090的博客 1368
上一篇: 推荐7个学习Vue3开源项目
下一篇: 话费充值系统基于NodeJS+MongoDB 有微信支付、微信通知
书中枫叶
博客等级 码龄7年 91粉丝 24原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值