精华内容
下载资源
问答
  • 本篇文章给大家分享了NodeJs开发微信公众号的相关技术内容,对此有需要的朋友们可以跟着学习参考下。
  • 主要介绍了使用NodeJs 开发微信公众号(三)微信事件交互实例的相关资料,需要的朋友可以参考下
  • 本文给大家分享的是在使用nodejs开发微信小程序的过程中,实现密码加密的示例代码,非常简单,有需要的小伙伴可以参考下
  • 主要介绍了使用Nodejs开发微信公众号后台服务实例,在这个实例中,主要使用到了express, wechat, mongodb, monk等模块,需要的朋友可以参考下
  • nodejs开发微信公众号
  • nodejs开发微信支付之退款结果通知url前言步骤1.先对加密串A进行base64解密2.对商户key做md5,得到32位小写key3.用key*对加密串B做AES-256-ECB解密 前言 退款成功后返回的xml格式示例 步骤 加密字符串是req_info ...

    前言

    退款成功后返回的xml格式示例
    在这里插入图片描述

    步骤

    加密字符串是req_info
    解密之前,我们需要把xml格式转换为json格式:

    const notificationXML = ctx.request.body.xml
        const notificationJSON = {}
        for (let [key, value] of Object.entries(notificationXML)) {
          notificationJSON[key] = value[0]
        }
        let notionResult = notificationJSON['req_info']
    

    1.先对加密串A进行base64解密

      let resultInfo = Buffer.from(notionResult, 'base64')
    

    2.对商户key做md5,得到32位小写key

     const key = 'KmfuRzZM9lfxHJL'
        const md5Key = await crypto.createHash('md5').update(key).digest('hex')
    

    3.用key*对加密串B做AES-256-ECB解密

    我们将解密过程封装成一个方法,这样调用起来比较方便

    /**
     * aes解密微信回调通知
     * @param data 待解密内容
     * @param key 必须为32位私钥
     * @returns {string}
     */
    exports.decryption = function (data, key, iv) {
      if (!data) {
        return ''
      }
      iv = iv || ''
      var clearEncoding = 'utf8'
      var cipherEncoding = 'base64'
      var cipherChunks = []
      var decipher = crypto.createDecipheriv('aes-256-ecb', key, iv)
      decipher.setAutoPadding(true)
      cipherChunks.push(decipher.update(data, cipherEncoding, clearEncoding))
      cipherChunks.push(decipher.final(clearEncoding))
      return cipherChunks.join('')
    }
    

    解密方法封装好了,那就开始调用

    const fxp = require('fast-xml-parser')
    
    
     let iv = Buffer.alloc(0) // 设置偏移量
        let decxml = exports.decryption(resultInfo, md5Key, iv) // 解码
        console.log(decxml)
          let reg = new RegExp('root>', 'g')
        decxml = decxml.replace(reg, 'xml>') // 转化为xml格式
        console.log(decxml)
        const xml2json = fxp.parse(decxml) // xml转对象
        console.log(xml2json)
    

    剩下的就看自己的业务需求了,值都取出来了想干嘛干嘛,服务号的通知什么的也很容易,退款通知这种,下一个博客见。
    来自小仙女的代码之路.
    附带大神的链接 https://www.oecom.cn/nodejs-wechat-pay-4/

    展开全文
  • NodeJs 开发微信公众号(三)微信事件交互 微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成。比如说自定义菜单功能,必须通过发送post请求的方式生成。本章就通过关注到取消...

    NodeJs 开发微信公众号(三)微信事件交互

    微信公众号有个规则,一旦开启了开发者模式,其他的常规功能就都必须通过接口调用完成。比如说自定义菜单功能,必须通过发送post请求的方式生成。本章就通过关注到取消关注的整个过程来谈一谈nodejs是怎么样与微信交互的。这些功能的入口就是你在测试公众号里面填写的URL(以下用/login/wechat代替)。

    事件交互

    扫码关注微信公众号后,微信会调用你的接口/login/wechat,并且附带一段xml信息,首先你需要获取一些签名,通过加密、排序比对是否与你填写的TOKEN一致,如果一致则进行xml的解析。node解析xml时必须先引用模块。所以,先引入xml解析模块

     //xml解析模块
    var XMLJS = require('xml2js');
    //解析,将xml解析为json
    var parser = new XMLJS.Parser();
    //重组,将json重组为xml
    var builder = new XMLJS.Builder();

    通过req的监听data,来获取微信发送过来的xml包。以下是某个新用户关注公众号后微信向你的后台接口(上一篇中提到的/yourapi)发送的xml包数据,经过解析后,他的结构如下:

     

    tousername:收信人【此处为公众微信号】

    fromusername:发信人【此处为用户openid】

    createTime:发送时间

    msgtype:消息类型【event(响应事件)、text(推送消息)、image(推送图文消息)等】

    event:消息名称【此处为关注】

    eventkey:自定义的key,在设置网页时可以自定义后文中会讲到

    以上就是当一个用户关注后微信往你接口发送的数据包。上面对我们有用的是fromusername,即关注人的openid,我们在关注时获取了用户的该openid后可以通过微信提供的特定接口(https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN)获取用户的头像,性别,昵称等信息,为你的app建立一个可靠的资料库。

    代码实现

    //微信事件推送的入口

    app.post('/yourapi', function(req, res, next) {

        //获取参数

        var query = req.query; 

        //签名

        var signature = query.signature;

        //输出的字符,你填写的TOKEN

        var echostr = query.echostr; 

        //时间戳

        var timestamp = query['timestamp']; 

        //随机字符串

        var nonce = query.nonce; 

        var oriArray = new Array(); 

        oriArray[0] = nonce; 

        oriArray[1] = timestamp; 

        oriArray[2] = appConfig.token;

        //排序参数

        oriArray.sort(); 

        var original = oriArray[0]+oriArray[1]+oriArray[2]; 

        //加密

        var scyptoString = sha1(original);

        //判断是否与你填写TOKEN相等

        if (signature == scyptoString) {

    //获取xml数据

            req.on("data", function(data) {

                //将xml解析

                parser.parseString(data.toString(), function(err, result) {

                    var body = result.xml;

                    var messageType = body.MsgType[0];

                    //用户点击菜单响应事件

                    if(messageType === 'event') {

                        var eventName = body.Event[0];

                        (EventFunction[eventName]||function(){})(body, req, res);

                    //自动回复消息

                    }else if(messageType === 'text') {

                        EventFunction.responseNews(body, res);

                    //第一次填写URL时确认接口是否有效

                    }else {

                        res.send(echostr);

                    }

                });

            });

        } else { 

            //认证失败,非法操作

            res.send("Bad Token!"); 

        }

        

    });

     

    //微信客户端各类回调用接口

    var EventFunction = {

        //关注

        subscribe: function(result, req, res) {

    //存入openid 通过微信的接口获取用户的信息同时存入数据库。

        },

        //注销

        unsubscribe: function(openid, req, res) {

    //删除对应id

        },

        //打开某个网页

        VIEW: function() {

    //根据需求,处理不同的业务

        },

    //自动回复

        responseNews: function(body, res) {

    //组装微信需要的json

            var xml  = {xml: {

                ToUserName: body.FromUserName,

                FromUserName: body.ToUserName,

                CreateTime: + new Date(),

                MsgType: 'text',

                Content: '编辑@+您想说的话,我们可以收到'

            }};

            var reciviMessage = body.Content[0]

            if(/^\@.*/.test(reciviMessage)) {

                xml.xml.Content = '已经收到您的建议,会及时处理!'

            }<br>//将json转为xml

            xml = builder.buildObject(xml);<br>//发送给微信

            res.send(xml);

        }

    }

    此处,适合采用JS设计模式中的策略模式,在subscribe方法里面写上你自己的业务,通过发送带openid参数的请求,可以在用户关注微信号的时候将其几本资料存入数据库,并且建立会话。这样在用户接下来打开你的网页的时候就无需再次认证,只需要比对openid然后查询数据库就行了。

    转载于:https://www.cnblogs.com/txx314/p/5233941.html

    展开全文
  • 慕课网开发微信第二天源代码
  • nodejs开发微信公众号支付

    千次阅读 2017-10-09 17:26:25
    NodeJs 微信公众号功能开发,移动端 H5页面调用微信的支付功能。这几天根据公司的需要使用 node 和 h5页面调用微信的支付功能完成支付需求。现在把开发过程重新捋一遍,以帮助更多的开发者顺利的完成微信支付功能的...

    NodeJs 微信公众号功能开发,移动端 H5页面调用微信的支付功能。这几天根据公司的需要使用 node 和 h5页面调用微信的支付功能完成支付需求。现在把开发过程重新捋一遍,以帮助更多的开发者顺利的完成微信支付功能的开发。(微信暂时还没有提供 node 的支付功能)

    一.请求CODE

    请求 code 的目的就是获取用户的 openid(用户相对于当前公众号的唯一标识) 和access_token,请求的APIhttps://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
    此 api 需要注意几个参数:

    1.  appid公众号的 appid,可以在公众号中看到
    2.  redirect_uri 自定义的微信回调地址, 微信会在你请求完上面的地址后跳转到你定义的redirect_uri的地址, 带着 code,此处的 redirect_url 需要 **url_encode** *php*, 如果你的程序是 node 则需要使用 **encodeURLComponent(url)**编码
    3.  response_type=code,这个没什么好说的就是固定的 response_type=code,详细说明可以查看微信官网的说明
    4.  scope=snsapi_userinfo,固定这样写就好,详细说明可以查看微信官网的说明
    5.  state=STATE 固定这样写就好,详细说明可以查看微信官网的说明
    6.  wechat_redirect 固定这样写就好,详细说明可以查看微信官网的说明
    

    ps:官网链接:

    二.通过code获取access_token,openid

    第一步已经获取到了 code 的值了, 那么接下来就需要通过 code 来获取 access_token,openid的值了,请求的 api 
    API https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 
    此处api 的参数说明:

    1.  appid 微信公众号 id,微信公众号后台获取
    2.  secret 微信公众号的密钥, 微信公众号后台获取
    3.  code, 第一步获取用到的 code
    4.  grant_type=authorization_code 固定就好
    

    三.通过access_token调用接口

    access_token 可以做后续的功能, 可以参考官方的例子: 
    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&lang=zh_CN

    四.网页端调起支付API

    看见这个是不是感觉快完事儿了, 只要网页端调用微信支付功能就完事儿了?no,还差点 
    在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。 
    注意:WeixinJSBridge内置对象在其他浏览器中无效。 
    示例代码如下:

    function onBridgeReady(){
       WeixinJSBridge.invoke(
           'getBrandWCPayRequest', {
               "appId""wx2421b1c4370ec43b",     //公众号名称,由商户传入     
               "timeStamp"" 1395712654",         //时间戳,自1970年以来的秒数     
               "nonceStr""e61463f8efa94090b1f366cccfbbb444", //随机串     
               "package""prepay_id=u802345jgfjsdfgsdg888",     
               "signType""MD5",         //微信签名方式:     
               "paySign""70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
           },
           function(res){     
               if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
           }
       ); 
    }
    if (typeof WeixinJSBridge == "undefined"){
       if( document.addEventListener ){
           document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
       }else if (document.attachEvent){
           document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
           document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
       }
    }else{
       onBridgeReady();
    }
    

    看到上面的代码, 那么想调用微信的支付功能需要传递参数,

    {
       "appId""wx2421b1c4370ec43b",     //公众号名称,由商户传入     
       "timeStamp"" 1395712654",         //时间戳,自1970年以来的秒数     
       "nonceStr""e61463f8efa94090b1f366cccfbbb444", //随机串     
       "package""prepay_id=u802345jgfjsdfgsdg888",     
       "signType""MD5",         //微信签名方式:     
       "paySign""70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
    }
    

    参数说明:

    1. appId //公众号名称,由商户传入 
    2. timeStamp //时间戳,自1970年以来的秒数  此处需要特别的注意一下,需要是字符串的时间戳格式, 意思就是必须就“” 引号
    3. nonceStr //随机串    32位的, 随后会提供方法
    4. signType // 微信签名方式: MD5
    5. paySign //微信签名, 随后说
    6. **package**   //这个最重要, 充哪里获取到的呢? 接下来说。
    

    ps: 官网接口说明 
    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

    五.获取package, 从微信的 统一下单 接口获取prepay_id

    官方 api: 
    https://api.mch.weixin.qq.com/pay/unifiedorder

    请求参数一堆, 但是有一些不是必须的,下面是必须参数

    {
        appid : APPID,
        attach : ATTACH,
        body : BODY,
        mch_id : MCH_ID,
        nonce_str: NONCE_STR,
        notify_url : NOTIFY_URL,// 微信付款后的回调地址
        openid : OPENID,
        out_trade_no : OUT_TRADE_NO ,//new Date().getTime(), //订单号
        spbill_create_ip : SPBILL_CREATE_IP , //客户端的 ip
        total_fee : TOTAL_FEE, //商品的价格, 此处需要注意的是这个价格是以分算的, 那么一般是元, 你需要转换为 RMB 的元
        trade_type : 'JSAPI',
    }
    

    微信的统一下单接口要求传递的是 xml 的数据, 而且数据还需要签名, 那么首先吧数据签名。 
    签名规则可以参考微信给出的签名规则(签名方法一会给出) 
    微信官方签名规则: 
    https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

    生成签名后需要吧数据组装为xml 的格式:

    var body = '<xml> ' +
        '<appid>'+config.wxappid+'</appid> ' +
        '<attach>'+obj.attach+'</attach> ' +
        '<body>'+obj.body+'</body> ' +
        '<mch_id>'+config.mch_id+'</mch_id> ' +
        '<nonce_str>'+obj.nonce_str+'</nonce_str> ' +
        '<notify_url>'+obj.notify_url+'</notify_url>' +
        '<openid>'+obj.openid+'</openid> ' +
        '<out_trade_no>'+obj.out_trade_no+'</out_trade_no>'+
        '<spbill_create_ip>'+obj.spbill_create_ip+'</spbill_create_ip> ' +
        '<total_fee>'+obj.total_fee+'</total_fee> ' +
        '<trade_type>'+obj.trade_type+'</trade_type> ' +
        '<sign>'+obj.sign+'</sign> ' + // 此处必带签名, 否者微信在验证数据的时候是不通过的
        '</xml>';
    

    接下来就是请求 api 获取prepay_id的值了, 将上面得到的 xml 数据请求下面的 api 发送给微信, 微信验证数据没问题后会放回你想要的值。 
    api : https://api.mch.weixin.qq.com/pay/unifiedorder

    六. 获取到了prepay_id是不是就可以在 h5 段直接调用微信的支付了么? 答案是还不可以。

    获取到了prepay_id那么现在h5 呼起微信的支付功能的参数是这样的:

    {
       "appId""wx2421b1c4370ec43b",     //公众号名称,由商户传入     
       "timeStamp"" 1395712654",         //时间戳,自1970年以来的秒数     
       "nonceStr""e61463f8efa94090b1f366cccfbbb444", //随机串     
       "package""prepay_id=u802345jgfjsdfgsdg888",     
       "signType""MD5",         //微信签名方式:
    }
    

    有了这样的参数, 那么你还需要吧所有参与的参数做签名。签名规跟上面的一样,生成了签名后需要吧签名的参数 paySign 赋给h5 呼起微信的支付功能的参数(也就是微信的签名不参与签名的生成) 
    最后的参数是这样子的:

    {
       "appId""wx2421b1c4370ec43b",     //公众号名称,由商户传入     
       "timeStamp"" 1395712654",         //时间戳,自1970年以来的秒数     
       "nonceStr""e61463f8efa94090b1f366cccfbbb444", //随机串     
       "package""prepay_id=u802345jgfjsdfgsdg888",     
       "signType""MD5",         //微信签名方式:
       "paySign""70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
    }
    

    如果你的各个环节都没有问题, 那么得到了这样参数后你就可以正常的调用起微信的支付功能, 跟原生的功能是没有任何的差别的,(估计你现在的心里也特高兴吧, 没有 app 竟然可以使用 app 的功能,就是这么的神奇)。

    7.支付完成的回调

    微信支付完了后会在 h5 页面的微信支付的回调函数里面放回值, 
    res.err_msg == "get_brand_wcpay_request:ok" ,这样就是成功了, 但是不是就完事儿了呢 ? 也不是,为什么呢? 微信真的收到钱了么? 收到的钱是不是你传递给微信的值呢 ?你还需要将支付的结果写数据库什么的,这些都是未知。还记的在统一下单接口中有个必须参数就是 notify_url : NOTIFY_URL,// 微信付款后的回调地址 这个地址是用户传递给微信的, 微信在收到用户的付款后会以 post 的方式请求这个接口,微信会传递用户付款的信息过来, 不过是 xml 格式的。 
    类系这样的 xml 格式:

    <xml>
      <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
      <attach><![CDATA[支付测试]]></attach>
      <bank_type><![CDATA[CFT]]></bank_type>
      <fee_type><![CDATA[CNY]]></fee_type>
      <is_subscribe><![CDATA[Y]]></is_subscribe>
      <mch_id><![CDATA[10000100]]></mch_id>
      <nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str>
      <openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid>
      <out_trade_no><![CDATA[1409811653]]></out_trade_no>
      <result_code><![CDATA[SUCCESS]]></result_code>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign>
      <sub_mch_id><![CDATA[10000100]]></sub_mch_id>
      <time_end><![CDATA[20140903131540]]></time_end>
      <total_fee>1</total_fee>
      <trade_type><![CDATA[JSAPI]]></trade_type>
      <transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
    </xml>
    

    根据自己的业务逻辑解析这个 xml 格式的数据就好了。 
    注意:这里你在获取到数据后微信需要得到你的回应, 如果你一直不回应微信, 微信会请求你好几次, 这样估计你的逻辑会有问题吧,所以你需要给微信返回 xml 的格式的 回应。

    <xml>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <return_msg><![CDATA[OK]]></return_msg>
    </xml>
    

    小坑:node ,express 框架开发, 如果你在微信的支付成功后的回调中没有获取到任何 xml 的值, 那么你需要安装一组件:body-parser-xml, 你可以使用 npm install body-parser-xml --save 安装, 在 app.js 里面require('body-parser-xml')(bodyParser);,使用中间件的方式

    // 解决微信支付通知回调数据
    app.use(bodyParser.xml({
      limit: '2MB',   // Reject payload bigger than 1 MB
      xmlParseOptions: {
        normalize: true,     // Trim whitespace inside text nodes
        normalizeTags: true, // Transform tags to lowercase
        explicitArray: false // Only put nodes in array if >1
      }
    }));
    

    这样你就可以正常的获取到微信的 xml 数据了。

    使用方法:

    pay.getAccessToken({
            notify_url : 'http://demo.com/', //微信支付完成后的回调
            out_trade_no : new Date().getTime(), //订单号
            attach : '名称',
            body : '购买信息',
            total_fee : '1', // 此处的额度为分
            spbill_create_ip : req.connection.remoteAddress,
        }, function (error, responseData) {
            res.render('payment', {
                title : '微信支付',
                wxPayParams : JSON.stringify(responseData),
                //userInfo : userInfo
            });
        });

    就到这里吧, 感觉也差不多了。如有不对的地方还请指正。

    附上我自己的代码:https://git.oschina.net/anziguoer/wechatPay

    展开全文
  • nodeJS 开发微信公众号

    2019-01-23 06:31:17
    准备测试公众号 ...关注,获取测试公众号 内网渗透工具 ...后台服务接入公众号 ...搭建express开发环境 这个网上有教程,自行百度 接口配置和签名验证 接入微信平台 Token:自主设置,这个token与公众平台wiki中常提的a...

    准备测试公众号

    mp.weixin.qq.com/debug/cgi-b…

    关注,获取测试公众号

    内网渗透工具

    natapp.cn/login 按照教程下载客户端进行配置

    后台服务接入公众号

    有netapp 生成的映射外网IP => URL

    搭建express开发环境

    这个网上有教程,自行百度

    接口配置和签名验证

    接入微信平台

    Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器

    mp.weixin.qq.com/wiki?t=reso…

    // 认证开发者服务器
    function sign(config, req, res, next) {
        const {
          signature,
          timestamp,
          nonce,
          echostr,
        } = req.query
        const conf = config || {}
        const { token } = conf.wechat
    
        // 1. 将token、timestamp、nonce三个参数进行字典序排序
        const array = [token, timestamp, nonce]
        array.sort()
        const str = array.toString().replace(/,/g, '')
    
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
        const sha1Code = crypto.createHash('sha1')
        const code = sha1Code.update(str, 'utf-8').digest('hex')
    
        // 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
        if (req.method === 'GET') {
          if (code === signature) {
            res.send(echostr)
          } else {
            res.send('error')
          }
        } else if (req.method === 'POST') {
          if (code !== signature) {
            return
          }
          next()
        }
      }
    复制代码

    获取access_token

    微信公众号文档中已经详细说明了,access_token是公众号的全局唯一接口调用凭据,因此每个接口均要加上access_token mp.weixin.qq.com/wiki?t=reso…

    // config.json
    {
    	"wechat" : {
    		"appID": "",
    		"appSecret": "",
    		"token": "access_token",
    		"prefix": "https://api.weixin.qq.com/cgi-bin/",
    		"mpPrefix": "https://mp.weixin.qq.com/cgi-bin/"
    	}
    }
    复制代码
    /*
     *微信相关操作api
     */
    
    const config = require('./config/config')
    const utils = require('./utils')
    
    const wechatApi = {}
    const { appID, appSecret } = config.wechat
    const api = {
      accessToken: `${config.wechat.prefix}token?grant_type=client_credential`,
      upload: `${config.wechat.prefix}media/upload?`,
    }
    
    // 获取access_token
    wechatApi.updateAccessToken = function () {
      const option = {
        url: `${api.accessToken}&appid=${appID}&secret=${appSecret}`,
        json: true,
      }
      return utils.request(option).then(data => Promise.resolve(data))
    }
    
    module.exports = wechatApi
    
    复制代码
    // ../routes/index.js
    
    const express = require('express')
    const config = require('../config/config')
    const utils = require('../utils')
    const wechatApi = require('../wechatApi')
    
    const router = express.Router()
    // 获取,验证access_token,存入redis中
    // 路由之前,添加token
    router.use((req, res, next) => {
      // 根据token从redis中获取access_token
      utils.get(config.wechat.token).then((data) => {
        // 获取到值--往下传递
        if (data) {
          return Promise.resolve(data)
        }
        // 没获取到值--从微信服务器端获取,并往下传递
        return wechatApi.updateAccessToken()
      }).then((data) => {
        // console.log(data);
        // 没有expire_in值--此data是redis中获取到的
        if (!data.expires_in) {
          // console.log('redis获取到值');
          req.accessToken = data
          next()
        } else {
          // 有expire_in值--此data是微信端获取到的
          // console.log('redis中无值');
          // 保存到redis中,由于微信的access_token是7200秒过期,
          // 存到redis中的数据减少20秒,设置为7180秒过期
          utils.set(config.wechat.token, `${data.access_token}`, 7180).then((result) => {
            if (result === 'OK') {
              req.accessToken = data.access_token
              next()
            }
          })
        }
      })
    })
    module.exports = router
    
    复制代码

    引入wechat模块

    // ../routes/wechat.js
    
    const express = require('express')
    const wechat = require('wechat')
    const conf = require('../config/config')
    const service = require('../service.js')
    
    const router = express.Router()
    router.use(express.query())
    const config = {
      token: conf.wechat.token,
      appid: conf.wechat.appID,
      appsecret: conf.wechat.appSecret,
      encodingAESKey: '',
    }
    
    router.use('/', wechat(config, (req, res) => {
      const message = req.weixin
    
      const {
        MsgType,
      } = message
    
      switch (MsgType) {
      case 'text': // 文本
        service.handleText(res, message.Content)
        break
      default:
        res.reply('服务器内部错误,请重试')
      }
    }))
    
    module.exports = router
    
    复制代码

    开始测试

    const createError = require('http-errors')
    const express = require('express')
    const path = require('path')
    const cookieParser = require('cookie-parser')
    const logger = require('morgan')
    const indexRouter = require('./routes/index')
    const wechatRouter = require('./routes/wechat')
    const utils = require('./utils')
    const config = require('./config/config.json')
    
    const app = express()
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'))
    app.set('view engine', 'jade')
    app.use(logger('dev'))
    app.use(express.json())
    app.use(express.urlencoded({ extended: false }))
    app.use(cookieParser())
    app.use(express.static(path.join(__dirname, 'public')))
    app.use(utils.sign(config)) // 接口配置和签名验证
    app.use('/', indexRouter)
    app.use('/wechat', wechatRouter)
    
    // catch 404 and forward to error handler
    app.use((req, res, next) => {
      next(createError(404))
    })
    
    // error handler
    app.use((err, req, res) => {
      // set locals, only providing error in development
      res.locals.message = err.message
      res.locals.error = req.app.get('env') === 'development' ? err : {}
      // render the error page
      res.status(err.status || 500)
      res.render('error')
    })
    module.exports = app
    
    复制代码
    • 开启开发者服务

    • 填写接口配置信息

    • 结果

    展开全文
  • 本项目旨在为多个微信公众号提供中控服务, 包含...开发语言 nodejs 开发框架 eggjs 内存数据库 redis 本篇文章主要从以下4个方面来实现这个中控服务: eggjs插件和配置 定时任务获取token等信息 路由定义和contr...
  • Nodejs 开发微信公众号

    2017-04-05 08:54:47
    微信号公众号申请: https://mp.weixin.qq.com映射工具: ngrok
  • NodeJs开发微信公众号

    千次阅读 2015-11-13 11:55:42
    nicely-weixin的Githut地址当时在要用到微信时也百度过别的东西,看到有weiixn-api,node-weixin等等一些很多的东西,但都觉得他们写得太死不够灵活,里面的方法和属性完全又是他们自己定义的一些东西,我需要要看...
  • 微信公众号现在分为订阅号,服务号,企业号,服务号和企业号不对个人开发者开放,所以我们只能选择订阅号。 但是订阅号也有认证和未认证之分,认证的订阅号支持的接口更多也更高级,下图是微信的接口权限图,只截取...
  • 古话说: 万事开头难, 回头细想想还真是这样,在没有开始做微信公众号开发之前我以为它很复杂,但是学过之后只想说原来just so so~ 这里是我的项目的github地址: https://github.com/muzishuiji... 下面我就把我的学习...
  • 1. 申请微信公众号:企业号、服务号、订阅号(前两个要钱) 2. 配置微信公众号后台 选择基本配置,获得 AppId 和AppSecret ,点击服务器配置 URL:你服务器地址,不能是IP地址,而且域名必须指向80端口,没有...
  • 在给用户发送消息中涉及到的素材(图片、视频、音频、文章等)需要事先传到微信服务器,然后获得媒体id(media_id),然后把 media_id 传递给用户 上传分上传临时素材(只保存三天)和上传永久素材 上传永久素材...
  • Nodejs开发微信公众号--测试号配置篇

    千次阅读 2018-10-15 10:23:01
    微信公众号感觉入门是真的难啊,受权限的约束,个人开发者真的挺难走的,特别像博主这种主攻前端的人。由于迟迟没把域名备案办下来。先从测试号入手。 申请页面信息 打开测试号申请页面,可以看到需要填写的内容...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 884
精华内容 353
关键字:

nodejs开发微信