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); });
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); });
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); }); } });
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"); } }); });
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); }) });
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) => {
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); } } } }); } });