Example #1
0
exports.get = hook((req, res) => {
  const query = req.query;
  // 加密模式
  const encrypted = !!(query.encrypt_type && query.encrypt_type === 'aes' && query.msg_signature);
  const timestamp = query.timestamp;
  const nonce = query.nonce;
  const echostr = query.echostr;

  var valid = false;
  if (encrypted) {
    var signature = query.msg_signature;
    valid = signature === cryptor.getSignature(timestamp, nonce, echostr);
  } else {
    // 校验
    valid = query.signature === getSignature(timestamp, nonce, TOKEN);
  }

  if (!valid) {
    res.status = 401;
    res.send('Invalid signature');
  } else {
    if (encrypted) {
      var decrypted = cryptor.decrypt(echostr);
      res.send(decrypted.message);
    } else {
      res.send(echostr);
    }
  }
});
app.get('/', function(req, res){
	var msg_signature = req.query.msg_signature;
	var timestamp = req.query.timestamp;
	var nonce = req.query.nonce;
	var echostr = req.query.echostr;
	var cryptor = new WXBizMsgCrypt(config.token, config.encodingAESKey, config.corpId);
	var s = cryptor.decrypt(echostr);
	res.send(s.message);
});
Example #3
0
app.get('/', function (request, response) {
    var msg_signature = request.query.msg_signature;
    var timestamp = request.query.timestamp;
    var nonce = request.query.nonce;
    var echostr = request.query.echostr;
    var cryptor = new WXBizMsgCrypt('liujj', '4t538GLgyipwDSTexLruKlFJ7n5rW6U7rpyfYxrUxZd', 'wx1d3765eb45497a18');
    var s = cryptor.decrypt(echostr);
    response.send(s.message);
});
Example #4
0
 xml2js.parseString(xml, options, function(err, ret){
   if(err || !ret || !ret.xml) return callback(null, xml);
   var result = ret.xml;
   _format(result);
   if(!result.encrypt) return callback(null, result);
   if(result.encrypt){
     var crypter = new WXBizMsgCrypt(config.token, config.encrypt_key, config.appid);
     var message = crypter.decrypt(result.encrypt).message;
     if(!message) return callback(result);
     xml2js.parseString(message, options, function(err, ret){
       if(err || !ret || !ret.xml) return callback(null, result);
       var data = ret.xml;
       _format(data);
       return callback(null, data);
     });
   }
 });        
Example #5
0
    wechatUtils.getMessage(req, function (err, result) {

        if (err) return res.send(new app.sendJsonObj(10001, "BadMessage !", err).send(null, __dirname, 1, "json"));

        req.weixin = wechatUtils.formatMessage(result.xml);

        var cryptor = new WXBizMsgCrypt(token, encodingAESKey, component_appid);
        var decrypted = cryptor.decrypt(req.weixin.Encrypt);

        var messageWrapXml = decrypted.message;

        if (messageWrapXml === '') return next(new Error("getMessage messageWrapXml component_verify_ticket Invalid"));

        req.weixin_xml = messageWrapXml;
        xml2js.parseString(messageWrapXml, {trim: true}, function (err, result) {

            if (err) return res.send(new app.sendJsonObj(10002, "BadMessage !", err).send(null, __dirname, 1, "json"));

            req.weixin = wechatUtils.formatMessage(result.xml);

            console.log(" @@@ -- get event -- @@@");

            console.log(req.weixin);

            var message = req.weixin;

            var InfoType = req.weixin.InfoType;

            if (InfoType == "component_verify_ticket") {

                //设置component_verify_ticket
                wxComponentsUtil.svaeComponentVerifyTicket(req.weixin.ComponentVerifyTicket, function (err, data) {

                    if (err) console.error(err);
                    if (!err) console.log(" @@@ --- 设置微信开放平台 component_verify_ticket 成功 --- @@@" + data.toString());
                    res.send("success");

                });

            } else if (InfoType == "unauthorized") {

                console.log(" @@@ --- 微信开放平台取消授权 --- @@@" + req.weixin.AuthorizerAppid);

                res.send("success");

            } else if (InfoType == "authorized") {

                console.log(" @@@ --- 微信开放平台授权成功 --- @@@ --" + req.weixin.AuthorizerAppid);
                console.dir(message);

                /***
                 * 保存数据
                 */



                res.send("success");

            } else if (InfoType == "updateauthorized") {

                console.log(" @@@ --- 微信开放平台更新授权成功 --- @@@" + req.weixin.AuthorizerAppid);

                res.send("success");

            } else {

                res.send("success");

            }


        });

    });
Example #6
0
        parseString(postdata, function (err, result) {

            var msg = cryptor.decrypt(result.xml.Encrypt[0]);
           // console.log('msg' + msg);

            parseString(msg.message, function (err, result) {
	if(result.xml.EventKey){
                if (result.xml.EventKey[0]== 'yuyue') {
                    console.log('result'+result.xml);           
                    for (var i = 0;i < userid.length;i++){
		    console.log('userid[' + i +'] = ' + userid[i]);
                    if (userid[i] != result.xml.FromUserName[0]){
		   // console.log('username = '******'你已预约过,不能重复预约!');
                    continue;
                    }else{
                    
                    var ress = replyText(result,'你已预约,不能重复预约!');
		    flag = 1;
		    break;
                    }
		}
                    if(flag != 1){
			if( numbers>20 ) var ress = replyText(result,'预约人数已超过20人,不能预约');
			else if(storeDelNumber.length>0){
				numbers++;
				var toNumber = storeDelNumber.shift();
				console.log('toNumber:'+toNumber);
				userid[toNumber-1] = result.xml.FromUserName[0];
                                var ress = replyText(result,'******预约成功!*****\n'+
                                                            '******预约凭证******\n'+
                                                            '预约号:'+toNumber+'\n'+
                                                            '用户名:'+result.xml.FromUserName[0]+'\n'+
                                                            '***请于开车前上车***\n'+
                                                            '********************\n'
                                                    );
			}
	                else{
                    numbers++; 
                    var ress= replyText(result,'******预约成功!*****\n'+
                                                '******预约凭证******\n'+
                                                '预约号:'+numbers+'\n'+
                                                '用户名:'+result.xml.FromUserName[0]+'\n'+
                                                '***请于开车前上车***\n'+
                                                '********************\n'
                                                    );
                    userid[numbers-1]=result.xml.FromUserName[0];
		    console.log('userid'+userid[numbers-1]);
                    console.log('ress:' + ress);
		    
                    }
		}flag = 0;
                   // numbers++;
                   
                
                }
               else if (result.xml.EventKey[0]== 'pingzheng'){
                    
                    for (var i = 0;i < userid.length;i++){
                    if (userid[i] != result.xml.FromUserName[0])
                      continue;
                    else
                    {
                    var ress = replyText(result,'******预约成功!*****\n'+
                                             '******预约凭证******\n'+
                                             '预约号:'+(i+1)+'\n'+
                                             '用户名:'+userid[i]+'\n'+
                                             '***请于开车前上车***\n'+
                                             '********************\n'
                                             );
                    console.log('ress:' + ress);
                    flag2 = 1;
                    }
                  }
                  if (flag2 != 1)
                 var ress = replyText(result,'你还未预约,请先预约!');
                 flag2 = 0;         
              }
                else if (result.xml.EventKey[0]== 'cancel'){
              
                    for (var i = 0;i < userid.length;i++){
                    if (userid[i] != result.xml.FromUserName[0])
                      continue;
                    else
                    {
                    flag1 = 1;
                    numbers--;
                    userid[i] = 0;
                    delNumber = i;
                    storeDelNumber.push(i+1);
                    var ress = replyText(result,'取消预约成功!');
                    console.log('ress:' + ress);
                    break;
                    }
                    
                  } 
                 // console.log();
                  if (flag1 != 1)
                  {
                  var ress = replyText(result,'你未预约,不能取消!');
                  }
                  console.log('ress111111:'+ress);
                  flag1 = 0;
                  console.log('ress2:'+ress);
                }
                else if (result.xml.EventKey[0]== 'renshu'){
                    if ( numbers > 20 )
                    var ress = replyText(result,'你好!当前预约校车人数超过20人,预约已满!');
                    else{  
                    var ress = replyText(result,'你好!当前预约校车人数为'+numbers);
                    console.log('ress:' + ress);
                    }             
                }
                else if (result.xml.EventKey[0]== 'anpai'){
                    var ress = replyText(result,'行车安排如下:\n'+
                                                '北大(中关村)---学院(大兴)发车时间:\n'+
                                                '早上7:20、中午13:00\n'+
                                                '乘车地点:北京大学理教西侧学院\n'+
                                                '学院(大兴)---北大(中关村)发车时间:\n'+
                                                '中午11:40、下午17:10\n'+
                                                '乘车地点:软微学院研发楼北侧\n'+
                                                '提示:学生需排队,待老师上车后,学生依次上车。'
                                                 );
                    console.log('ress:' + ress);
                }
                else {
                   // var ress = replyText(result,'欢迎使用Shank约车应用!');
                    var ress = replyText(result,'******使用指南******\n'+
                                       '欢迎使用Shank约车应用~\n'+
                                       '有些话我们想告诉你~^_^\n'+
                                       '1、座位有20个,超过不能预约。\n'+
                                       '2、一个用户不能重复预约。\n'+
                                       '3、用户可以取消预约。\n'+
                                       '4、了解更多按钮里可以查看行车安排和北大新闻。');

                    console.log('欢迎使用Shank约车应用!');
                }
	}
        else {
            var ress = replyText(result,'******使用指南******\n'+
				       '欢迎使用Shank约车应用~\n'+
				       '有些话我们想告诉你~^_^\n'+
                                       '1、座位有20个,超过不能预约。\n'+
                                       '2、一个用户不能重复预约。\n'+
                                       '3、用户可以取消预约。\n'+
                                       '4、了解更多按钮里可以查看行车安排和北大新闻。');
        }
                    var encryptMsg = cryptor.encrypt(ress);
                   // console.log('encryptMsg:', encryptMsg);

                    var MsgSignature = cryptor.getSignature(params.timestamp, params.nonce, encryptMsg);
                   // console.log('MsgSignature:' + MsgSignature);
                   // console.log(params.timestamp);
                   // console.log(params.nonce);
                    var feedbackMsg = replyCrypto(encryptMsg, params, MsgSignature);
                   // console.log('feedbackMsg:' + feedbackMsg);

                    response.end(feedbackMsg);
              })

        });
Example #7
0
  co(function* () {
    const query = req.query;
    // 加密模式
    const encrypted = !!(query.encrypt_type && query.encrypt_type === 'aes' && query.msg_signature);
    const timestamp = query.timestamp;
    const nonce = query.nonce;

    if (!encrypted) {
      // 校验
      if (query.signature !== getSignature(timestamp, nonce, TOKEN)) {
        res.status = 401;
        res.send('Invalid signature');
        return;
      }
    }

    // 取原始数据
    var xml = req.body;
    var result = yield parseXML(xml);
    var formatted = formatMessage(result.xml);
    if (encrypted) {
      var encryptMessage = formatted.Encrypt;
      if (query.msg_signature !== cryptor.getSignature(timestamp, nonce, encryptMessage)) {
        res.status = 401;
        res.send('Invalid signature');
        return;
      }
      var decryptedXML = cryptor.decrypt(encryptMessage);
      var messageWrapXml = decryptedXML.message;
      if (messageWrapXml === '') {
        res.status = 401;
        res.send('Invalid signature');
        return;
      }
      var decodedXML = yield parseXML(messageWrapXml);
      formatted = formatMessage(decodedXML.xml);
    }

    // 业务逻辑处理
    const body = yield handle(formatted);

    /*
     * 假如服务器无法保证在五秒内处理并回复,可以直接回复空串。
     * 微信服务器不会对此作任何处理,并且不会发起重试。
     */
    if (body === '') {
      res.send('');
      return;
    }

    var replyMessageXml = reply(body, formatted.ToUserName, formatted.FromUserName);

    if (!query.encrypt_type || query.encrypt_type === 'raw') {
      res.send(replyMessageXml);
    } else {
      var wrap = {};
      wrap.encrypt = cryptor.encrypt(replyMessageXml);
      wrap.nonce = parseInt((Math.random() * 100000000000), 10);
      wrap.timestamp = new Date().getTime();
      wrap.signature = cryptor.getSignature(wrap.timestamp, wrap.nonce, wrap.encrypt);
      res.send(encryptWrap(wrap));
    }
  }).catch((err) => {
Example #8
0
        parseString(postdata, function (err, result) {
            if (!err) {
                var cryptor = new WXBizMsgCrypt('liujj', '4t538GLgyipwDSTexLruKlFJ7n5rW6U7rpyfYxrUxZd', 'wx1d3765eb45497a18');
                var s = cryptor.decrypt(result.xml.Encrypt[0]);
                parseString(s.message, function (err, result) {
                    if (!err) {
                        var datetime = dateoff(new Date());
                        console.log(result);
                        if (result.xml.MsgType[0] == 'event') {
                            if (result.xml.EventKey[0] == 'yunshi') {
                                var res = replyText('回复星座获取运势', result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                response.end(res);
                            }
                            if (result.xml.Event[0] == 'subcribe') {
                                var res = replyText('今日运势:感谢您的关注!', result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                response.end(res);
                            }
                            if (result.xml.Event[0] == 'enter_agent') {
                                var res = replyText('暂时只能响应星座消息。回复星座查看今日运势', result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                response.end(res);
                            }
                            
                        } else {
                            switch (result.xml.Content[0]) {
                            case '白羊座' :
                                fs.readFile('data/' + datetime + '-0' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;
                            case '金牛座' :
                                fs.readFile('data/' + datetime + '-1' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '双子座' :
                                fs.readFile('data/' + datetime + '-2' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '巨蟹座' :
                                fs.readFile('data/' + datetime + '-3' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '狮子座' :
                                fs.readFile('data/' + datetime + '-4' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '处女座' :
                                fs.readFile('data/' + datetime + '-5' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '天秤座' :
                                fs.readFile('data/' + datetime + '-6' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '天蝎座' :
                                fs.readFile('data/' + datetime + '-7' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '射手座' :
                                fs.readFile('data/' + datetime + '-8' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '摩羯座' :
                                fs.readFile('data/' + datetime + '-9' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '水瓶座' :
                                fs.readFile('data/' + datetime + '-10' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            case '双鱼座' :
                                fs.readFile('data/' + datetime + '-11' + '.json', {encoding:'utf-8'}, function (err, bytesRead) {
                                    if (err) {
                                        console.log(err);
                                    } else {
                                        var res = replyText(bytesRead, result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                        response.end(res);
                                    }
                                });
                                break;

                            default:
                                var res = replyText('抱歉,暂时只能响应星座消息。回复星座可看今日运势', result.xml.ToUserName[0], result.xml.FromUserName[0]);
                                response.end(res);
                        }
                        }
                        
                    }
                });
            }
        });