今天给大家介绍如何用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