美文网首页让前端飞码农的世界WEB前端程序开发
Node.js开发微信公众号,完成部分功能

Node.js开发微信公众号,完成部分功能

作者: 张培跃 | 来源:发表于2019-02-26 10:44 被阅读2次

    由于微信公众号官网文档中并未提供基于Node.js的SDK,让想通过Node.js来完成公众号开发的小伙伴可能有些头痛!在这里我整理了一些代码,希望对你有所帮助。

    token.js

    const request=require("request");
    const fs=require("fs");
    var appId="wx0xxxxxxxxb41729aa9";
    var appsecret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    module.exports.getAccessToken=function(cb){
        // access_token
        fs.readFile("./token.json",function(err,results){
            var tokenInfo=JSON.parse(results);
            // 判断是否存在token 过期时间要大于等于当前时间,才说明没有过期
            if(tokenInfo.access_token.length>0 && tokenInfo.expires_time>=Date.now()){
                cb(tokenInfo.access_token);
            }else{
                var url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" +
                    "appid=" +appId+
                    "&secret="+appsecret
                request(url,function(err,response,body){
                    if(!err && response.statusCode===200){
                        var info=JSON.parse(body);
                        var obj={
                            "access_token":info.access_token,
                            "expires_time":Date.now()+info.expires_in*1000
                        }
                        fs.writeFile("./token.json",JSON.stringify(obj),function(err){
                            cb(info.access_token);
                        })
                    }else{
                        cb(null);
                    }
                })
            }
        })
    
    }
    

    server.js

    const express=require("express");
    const sha1=require("sha1");
    const request=require("request");
    const xmlJs=require("xml2js");
    const fs=require("fs");
    const {getAccessToken} =require("./module/token")
    const app=express();
    
    // 创建自定义菜单
    app.get("/createmenu",function(req,res){
        getAccessToken(function(access_token){
            request({
                url:"https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+access_token,
                method:"post",
                json:true,
                body:{
                    "button":[
                        {
                            "type":"click",
                            "name":"爸爸好",
                            "key":"V1001_TODAY_MUSIC"
                        },
                        {
                            "name":"妈妈好",
                            "sub_button":[
                                {
                                    "type":"view",
                                    "name":"搜索",
                                    "url":"http://www.163.com/"
                                },
                                {
                                    "type":"click",
                                    "name":"赞一下我们",
                                    "key":"V1001_GOOD"
                                }]
                        }]
                }
            },function(err,response,body){
                res.send(body);
            })
            // console.log(access_token);
            // res.end(access_token);
        })
    });
    app.get("/deletemenu",function(req,res){
        getAccessToken(function(access_token){
            request("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token="+access_token,function(err,response,body){
                res.send(body);
            })
        })
    
    })
    app.get("/weixin",function (req,res) {
        console.log(req.query);// 接收GET过来的参数
        // 1)将token、timestamp、nonce三个参数进行字典序排序
        var arr=["zhangpeiyue",req.query.timestamp,req.query.nonce].sort();
        // 2)将三个参数字符串拼接成一个字符串进行sha1加密
        var str=arr.join("");
        var sha1Str=sha1(str);
        console.log(sha1Str);// 密钥
    
        // 3)开发者获得加密后的字符串可与signature对比,
        if(req.query.signature===sha1Str){
            res.end(req.query.echostr);
        }else{
            res.end("error");
        }
        // res.end();
    });
    // 接收消息
    app.post("/weixin",function(req,res){
        req.on("data",function(body){
            // 接收到的数据  xml
            // console.log(body.toString());
            xmlJs.parseString(body,function(err,json){
    
                // 关注/取消关注事件
                // if(json.xml.MsgType[0]==="event"){
                //     if(json.xml.Event[0]==="subscribe"){//  关注我啦
                //         var jsonData={
                //             xml:{
                //                 ToUserName:json.xml.FromUserName[0],
                //                 FromUserName:json.xml.ToUserName[0],
                //                 CreateTime:Date.now(),
                //                 MsgType:"text",
                //                 Content:"谢谢关注我!"
                //             }
                //         }
                //         var builder=new xmlJs.Builder();
                //         var xml=builder.buildObject(jsonData);
                //         res.send(xml);
                //     }
                // }
                getAccessToken(function(access_token){
                    // 自动回复图片
                    var url="https://api.weixin.qq.com/cgi-bin/media/upload?" +
                        "access_token=" +access_token+
                        "&type=image";
                    request({
                        method:"post",
                        url,
                        json:true,
                        formData:{
                            media:fs.createReadStream("./0.jpg")
                        }
                    },function(err,response,body){
                    // <xml>
                        // <ToUserName>< ![CDATA[toUser] ]></ToUserName>
                        // <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
                        // <CreateTime>12345678</CreateTime>
                        // <MsgType>< ![CDATA[image] ]></MsgType>
                        // <Image>
                        // <MediaId>< ![CDATA[media_id] ]>
                        // </MediaId>
                        // </Image>
                        // </xml>
    
                        var jsonData={
                            xml:{
                                ToUserName:json.xml.FromUserName[0],
                                FromUserName:json.xml.ToUserName[0],
                                CreateTime:Date.now(),
                                MsgType:"image",
                                Image:{
                                    MediaId:body.media_id
                                }
                            }
                        }
                        var builder=new xmlJs.Builder();
                        var xml=builder.buildObject(jsonData);
                        res.send(xml);
                        // console.log(body);
                        // res.end();
                    })
                })
                // getAccessToken(function(access_token){
                //     var url="https://api.weixin.qq.com/cgi-bin/user/info?" +
                //         "access_token=" +access_token+
                //         "&openid=" +json.xml.FromUserName[0]+
                //         "&lang=zh_CN"
                //     request(url,function(err,response,body){
                //         var nickname=JSON.parse(body).nickname;
                //     // <xml>
                //         // <ToUserName>< ![CDATA[toUser] ]></ToUserName>
                //         // <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
                //         // <CreateTime>12345678</CreateTime>
                //         // <MsgType>< ![CDATA[text] ]></MsgType>
                //         // <Content>< ![CDATA[你好] ]></Content>
                //         // </xml>
                //
                //         // var jsonData={
                //         //     xml:{
                //         //         ToUserName:json.xml.FromUserName[0],
                //         //         FromUserName:json.xml.ToUserName[0],
                //         //         CreateTime:Date.now(),
                //         //         MsgType:"text",
                //         //         Content:"欢迎"+nickname+"的到来"
                //         //     }
                //         // }
                //         // var builder=new xmlJs.Builder();
                //         // var xml=builder.buildObject(jsonData);
                //         // res.send(xml);
                //
                //
                //     })
                //
                // })
    
            })
            // res.end();
        })
    })
    app.listen(80,function(){
        console.log("success");
    })
    

    [公众号回复“电子书”,送你经典前端电子书籍]

    —————END—————
    喜欢本文的朋友们,欢迎关注公众号 张培跃,收看更多精彩内容
    image

    相关文章

      网友评论

        本文标题:Node.js开发微信公众号,完成部分功能

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