由于微信公众号官网文档中并未提供基于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");
})