美文网首页
nodejs微信开发接入指南

nodejs微信开发接入指南

作者: Evtion | 来源:发表于2017-06-09 18:54 被阅读0次

    微信二次开发已经很火热,php、C#、java、python等关于微信后台开发案例也是比较多。但是关于nodejs开发微信的案例比较少。博主在百度上找到案例也是只字片言,关于接入微信的文章也是各类各样。博主尝试过各种失败,最后才接入微信。所谓万事开始难,博主在文章会贴出自己失败的例子,以及后续也会推出在微信开发中遇到的错误。

    • 申请微信公众号

      • 个人开发者只能申请未认证的订阅号,未认证的订阅号可以使用的微信API接口有限;所以个人开发者申请成功订阅号成功后,可以直接申请免费的测试号,测试号提供的API接口比较多,方便开发进行测试开发,测试号的使用时限是一年,一年过后会被释放。关于注册公众号的流程,开发者可以自己根据腾讯官方的提示进行填写。
    • 申请测试号

      • 个人性的订阅号很多接口是不能用的;个人的订阅号也不能认证。所以为了体验微信公众号的开发的最好方法就是申请测试号了。测试号提供了很多API接口,方便我们进行测试。登录个人订阅号以后,在微信开发者文档里面有申请测试号的入口。申请测试号很简单,直接用管理员的微信扫一扫就可以直接注册到测试号了。
    • 登录到的测试页面如下所示:

      • APPID以及APPsecret都是微信提供的,这连个值到时候是用来调用获取access_token的,而access_token是用来取得微信一些API接口的使用的口令;至于下面的url是第三方服务器地址(主要是微信服务器把用户提交的信息转发给的服务器处理地址,博主买了阿里云ECS,没有注册域名,你们可以直接填http://192.168.x.x/deal; 这个公网ip是阿里云提供的,后面的/deal是自己定义对的处理路由);后面token是用来验证消息是否来自微信服务器,自定义,例如weixin。
    测试号的页面
    • 第一步进行链接认证,即是配置第三方服务器和微信服务器的链接;按照上面一步填写好之后,直接提交;提交的过程中,微信服务器将会以get的方式发送nonce(随机数),singnature(加密后签名),timestamp(时间戳),echostr给第三方服务器。加密算法(首先将nonce、timestamp、token字典序排序,然后再转换成字符串,最后用sha1加密,最后得到signature;我们实际就是验证signature是否与第三方算出来的加密签名相等);代码如下所示:
    var express = require('express');
    var path = require('path');
    var favicon = require('serve-favicon');
    var logger = require('morgan');
    var xmlParse=require('xml2js').parseString;
    var cookieParser = require('cookie-parser');
    var bodyParser = require('body-parser');
    var sha1=require('sha1');
    var routes = require('./routes/index');
    var users = require('./routes/users');
    var app = express();
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    // uncomment after placing your favicon in /public
    //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: false }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/', routes);
    app.use('/users', users);
    app.get('/validate',(req,res,next)=>{
        let token='wechat';
        let signature=req.query.signature;
        let timestamp=req.query.timestamp;
        let echostr=req.query.echostr;
        let nonce=req.query.nonce;
        let oriArray=new Array();
        oriArray.push(nonce);
        oriArray.push(timestamp);
        oriArray.push(token);
        let original=oriArray.sort().join('');
        let combineStr=sha1(original);
        if(signature==combineStr){
            res.send(echostr);
        }else{
            console.log('error');
        }
        next();
    });
    app.post('/validate',(req,res,next)=>{
        var data='';
        req.on('data',(chunk)=>{
            data+=chunk;
        });
        req.on('end',()=>{
            // console.log(data);
            xmlParse(data,(err,result)=>{
                console.log(result);
                
                if(result.xml.MsgType=='image'){
                    let str= '<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'image'+']]></MsgType><Image><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId></Image></xml>';
                    res.send(str);
                }
                if(result.xml.MsgType=='text'){
                    let responseMSg='欢迎关注聊天小喵;小喵智能已经下线,其他接口在开发中。。。喵喵喵';
                    let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'text'+']]></MsgType><Content><![CDATA['+responseMSg+']]></Content></xml>';
                    res.send(str);  
                    
                }
                if(result.xml.MsgType=='voice'){
                    // let requestMsg=result.xml.Recognition;
                    let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'voice'+']]></MsgType><Voice><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId></Voice></xml>';
                    res.send(str);
                }
                if(result.xml.MsgType=='video'){
                    // console.log(result.xml.MediaId);
                    let str='<xml><ToUserName><![CDATA['+result.xml.FromUserName+']]></ToUserName><FromUserName><![CDATA['+result.xml.ToUserName+']]></FromUserName><CreateTime>'+new Date().getTime()+'</CreateTime><MsgType><![CDATA['+'video'+']]></MsgType><Video><MediaId><![CDATA['+result.xml.MediaId+']]></MediaId><Title><![CDATA['+'hello'+']]></Title><Description><![CDATA['+'hello world'+']]></Description></Video></xml>';
                    res.send(str);
                }
    
            });
        });
    
    });
    // catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    // error handlers
    
    // development error handler
    // will print stacktrace
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err
        });
      });
    }
    
    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {}
      });
    });
    
    
    module.exports = app;
    
    • 运行上述代码,然后按下提交按钮,验证配置是否正确;很多时候都会是提交失败,这个时候可以继续按提交按钮,如果出现4-5次都提交失败,那很有可能是代码出错,可以检查代码;如果第一次提交出错,有可能是网络原因延迟导致失败,所以继续提交。

    相关文章

      网友评论

          本文标题:nodejs微信开发接入指南

          本文链接:https://www.haomeiwen.com/subject/qvqxqxtx.html