今天给大家介绍如何用nodejs搭建微信公众平台。
先给大家介绍下微信公众平台:想必微信大家都知道,而微信公众平台就是特殊的微信号,能给关注的微信用户群发消息,关注的用户也可以通过自己查看服务并填写信息完成某些服务。
微信公众平台现在分为三种账号:订阅号、服务号、企业号。
订阅号主要针对于媒体,企业宣传,特点就是发送信息的次数相对于服务号要来得多;服务号主要针对于微商户、企业等,用于为关注用户提供服务,虽然发送信息的次数被限制得比较少,但是有很多订阅号不具备的接口,比如说自定义菜单,微信支付等;企业号是最近才推出的,企业号相当于是很多个服务号的集合,可以在一个企业号上自定义多个服务,但是企业号只可以给企业内人员提供服务和信息,所以企业号是针对企业内部的公众号。
下面开始说如何创建微信公众号的服务:
1、创建一个微信公众平台(最好是服务号),选择开发者模式。
2、编写公众平台后台,开启服务
3、然后开启开发者模式的时候需要填写一个url与token
下面来说公众平台后台的编写,公众号后台端口必须是80端口,用什么语言都行,说白了公众平台的后台就是个web服务器,php、java、.net、nodejs、python都可以编写。
下面奉上nodejs版本的验证接口代码:
var express = require(‘express‘);
var router = express.Router();
var processMessage = require(‘./wx/processMessage‘);
var crypto = require(‘crypto‘);
/* GET home page. */
router.get(‘/‘, function(req, res) {
var signature = req.param(‘signature‘);
var token = "xuepiaoqiyue";
var timestamp = req.param(‘timestamp‘);
var nonce = req.param(‘nonce‘);
var echostr = req.param("echostr");
var strArr = [token,timestamp,nonce];
strArr.sort();
var msg=strArr[0]+strArr[1]+strArr[2];
var shasum = crypto.createHash(‘sha1‘);
shasum.update(msg);
var sha1 = shasum.digest(‘hex‘);
console.log(sha1);
if(sha1 == signature){
res.send(echostr);
res.write(echostr);
}else{
res.send("error");
}
});
router.post(‘/‘, function(req, res) {
var response=res;
var formData="";
req.on("data",function(data){
formData+=data;
});
req.on("end",function(){
processMessage.processMessage(formData,response);
});
});
module.exports = router;以上两个是url为ip:80/wx的两个接口,
一个是get接口,用来验证接口的,这个url就是微信公众平台管理界面中要填写的验证url,get接口中的token参数要与管理界面中填写的token一致
另一个post接口就是用来发送消息的,比如说关注者的微信发过来一个“1”,其实这个请求首先是发送给了微信的服务器,然后微信服务器再通过post请求转发到我们的后台,我们后台再组织数据给微信后台,最后返回给关注者用户。
下面再来看段代码,是返回的几种不同格式的数据
var xml=require("node-xml");
var messageSender=require("./messageSender");
function processMessage(data,response){
console.log("data");
console.log(data);
var ToUserName="";
var FromUserName="";
var CreateTime="";
var MsgType="";
var Content="";
var Location_X="";
var Location_Y="";
var Scale=1;
var Label="";
var PicUrl="";
var FuncFlag="";
var tempName="";
var parse=new xml.SaxParser(function(cb){
cb.onStartElementNS(function(elem,attra,prefix,uri,namespaces){
tempName=elem;
});
cb.onCharacters(function(chars){
chars=chars.replace(/(^\s*)|(\s*$)/g, "");
if(tempName=="CreateTime"){
CreateTime=chars;
/*}else if(tempName=="Location_X"){
Location_X=cdata;
}else if(tempName=="Location_Y"){
Location_Y=cdata;*/
}else if(tempName=="Longitude"){
Location_X=chars;
}else if(tempName=="Latitude"){
Location_Y=chars;
}else if(tempName=="Scale"){
Scale=chars;
}
});
cb.onCdata(function(cdata){
if(tempName=="ToUserName"){
ToUserName=cdata;
}else if(tempName=="FromUserName"){
FromUserName=cdata;
}else if(tempName=="MsgType"){
MsgType=cdata;
}else if(tempName=="Content"){
Content=cdata;
}else if(tempName=="PicUrl"){
PicUrl=cdata;
}else if(tempName=="Label"){
Label=cdata;
}
console.log("cdata:"+cdata);
});
cb.onEndElementNS(function(elem,prefix,uri){
tempName="";
});
cb.onEndDocument(function(){
console.log("onEndDocument");
tempName="";
var date=new Date();
var yy=date.getYear();
var MM=date.getMonth() + 1;
var dd=date.getDay();
var hh=date.getHours();
var mm=date.getMinutes();
var ss=date.getSeconds();
var sss=date.getMilliseconds();
var result=Date.UTC(yy,MM,dd,hh,mm,ss,sss);
var msg="";
console.log(Content);
if(MsgType=="text"){
msg="谢谢关注,你说的是:"+Content;
messageSender.sendTextMessage(FromUserName,ToUserName,CreateTime,msg,Content.toString(),FuncFlag,response);
}else if (MsgType="location"){
msg="你所在的位置: 经度:"+Location_X+"纬度:"+Location_Y;
messageSender.sendLocationMessage(FromUserName,ToUserName,msg,FuncFlag,response);
}else if (MsgType="image"){
msg="你发的图片是:"+PicUrl;
messageSender.sendTextMessage(FromUserName,ToUserName,CreateTime,msg,Content.toString(),FuncFlag,response);
}else{
messageSender.sendTextMessage(FromUserName,ToUserName,CreateTime,msg,Content.toString(),FuncFlag,response);
}
});
});
parse.parseString(data);
}
module.exports.processMessage=processMessage;var xml=require("node-xml");
var wxdata = require("./huahengdata");
var messageSender = {};
var sendTextMessage = function(FromUserName,ToUserName,CreateTime,msg,Content,FuncFlag,response){
//console.log(arguments);
var returnObj = {type:‘text‘,content:‘雪飘七月竭诚为您服务:回复1:文本,回复2:图片,回复3:图文‘};
console.log(msg);
console.log(Content);
console.log(wxdata)
if(wxdata[Content]){
if(Content){
returnObj = wxdata[Content];
}
}
var time = new Date().getTime();
var resStr = "";
if(returnObj.type == "text"){
resStr = "<xml>" +
"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>" +
"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName>" +
"<CreateTime>"+time+"</CreateTime>" +
"<MsgType><![CDATA["+returnObj.type+"]]></MsgType>" +
"<Content><![CDATA["+returnObj.content+"]]></Content>" +
"</xml>";
}else if(returnObj.type == "image"){
resStr = "<xml>" +
"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>" +
"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName>" +
"<CreateTime>"+time+"</CreateTime>" +
"<MsgType><![CDATA["+returnObj.type+"]]></MsgType>" +
"<Image>" +
"<MediaId><![CDATA["+returnObj.content+"]]></MediaId>" +
"</Image>" +
"</xml>";
}else if(returnObj.type == "news"){
resStr = "<xml>" +
"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>" +
"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName>" +
"<CreateTime>"+time+"</CreateTime>" +
"<MsgType><![CDATA[news]]></MsgType>" +
"<ArticleCount>"+returnObj.articleCount+"</ArticleCount>" +
"<Articles>";
for(var i in returnObj.items){
var newsItem = returnObj.items[i];
resStr = resStr + "<item>" +
"<Title><![CDATA["+newsItem.title+"]]></Title>" +
"<Description><![CDATA["+newsItem.description1+"]]></Description>" +
"<PicUrl><![CDATA["+newsItem.picurl+"]]></PicUrl>" +
"<Url><![CDATA["+newsItem.url+"]]></Url>" +
"</item>"
}
resStr = resStr + "</Articles>" +
"</xml>";
}else{
resStr = "<xml>" +
"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>" +
"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName>" +
"<CreateTime>"+time+"</CreateTime>" +
"<MsgType><![CDATA[text]]></MsgType>" +
"<Content><![CDATA[error]]></Content>" +
"</xml>";
}
console.log(resStr);
response.send(resStr);
}
var sendLocationMessage = function(FromUserName,ToUserName,content,FuncFlag,response){
var time = new Date().getTime();
var resStr = "";
resStr = "<xml>" +
"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>" +
"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName>" +
"<CreateTime>"+time+"</CreateTime>" +
"<MsgType><![CDATA[text]]></MsgType>" +
"<Content><![CDATA["+content+"]]></Content>" +
"</xml>";
response.send(resStr);
}
module.exports.sendTextMessage = sendTextMessage;
module.exports.sendLocationMessage = sendLocationMessage;以上,分别是文本,图片,图文信息的返回格式和方法,
其中还有一个地理位置的获取和返回,就是sendLocationMessage方法,地理位置信息接口的获取有两种方式,一种是微信用户每次进入关注的该微信公众号回话界面的时候,还有一种是定时推送地理位置的方式,两种方式都需要用户授权以后才能推送地理位置信息。
以上,就是对微信公众平台的基本信息交互的接口。
本文出自 “雪飘七月” 博客,请务必保留此出处http://xuepiaoqiyue.blog.51cto.com/4391594/1561865
原文地址:http://xuepiaoqiyue.blog.51cto.com/4391594/1561865