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

由于微信公众号官网文档中并未提供基于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—————
喜欢本文的朋友们,欢迎关注公众号 张培跃,收看更多精彩内容

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

    原文作者:张培跃
    原文地址: https://www.jianshu.com/p/d141f07bbb30
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞