美文网首页
nodejs开发微信公众号(1)

nodejs开发微信公众号(1)

作者: Yossef | 来源:发表于2018-01-15 20:41 被阅读0次

    //路由  wxapi.js:

    const router = require('koa-router')()

    let crypto = require('crypto');

    const xml2js = require('xml2js');

    router.prefix('/wxapi')

    function xmlToJson (str) {

        return new Promise((resolve, reject) => {

            const parseString = xml2js.parseString;

            parseString(str, (err, result) => {

                if (err) {

                    reject(err)

                } else {

                    resolve(result)

                }

            })

        })

    }

    function jsonToXml (obj) {

        const builder = new xml2js.Builder()

        return builder.buildObject(obj)

    }

    router.all('/', async (ctx, next) => {

        if(ctx.method=='GET'){

            let echostr = ctx.query["echostr"];

            let signature = ctx.query["signature"];

            let timestamp = ctx.query["timestamp"];

            let nonce = ctx.query["nonce"];

            let token = 'Yossef'; //令牌名

            /*  加密/校验流程如下: */

            //1. 将token、timestamp、nonce三个参数进行字典序排序

            let array = new Array(token,timestamp,nonce);

            array.sort();

            let str = array.toString().replace(/,/g,"");

            //2. 将三个参数字符串拼接成一个字符串进行sha1加密

            let sha1Code = crypto.createHash("sha1");

            let code = sha1Code.update(str,'utf-8').digest("hex");

            //3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

            if(code===signature){

                    ctx.body=echostr;      //登陆成功

            }else{

                    ctx.body="error";

            }

        }else{

            if(ctx.is('text/xml')){

              let msgJson = await new Promise(function (resolve, reject) {

                    let buf = ''

                    ctx.req.setEncoding('utf8')

                    ctx.req.on('data', (chunk) => {

                        buf += chunk

                    })

                    ctx.req.on('end',async () => {

                        let json = await xmlToJson(buf);

                        resolve(json);

                    })

                });

              console.log(msgJson);

              let myMsg = msgJson;

              let FromUserName = msgJson.xml['ToUserName'];

              let ToUserName = msgJson.xml['FromUserName'];

              myMsg.xml['FromUserName'] = FromUserName;

              myMsg.xml['ToUserName'] = ToUserName;

              myMsg.xml['MsgType'] = 'text';

              myMsg.xml['CreateTime'] = [new Date()];

              delete myMsg.xml['MsgId'];

              if(!(typeof(msgJson.xml['Event'])!='undefined'&&msgJson.xml['Event']=='subscribe')){

                myMsg.xml['Content'] = ['你好'];

              }else{

                myMsg.xml['Content'] = ['欢迎来到结伴空间'];

              }

              let result = jsonToXml(myMsg);

              ctx.body = result;

              }

        }

    })

    module.exports = router

    相关文章

      网友评论

          本文标题:nodejs开发微信公众号(1)

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