首页 > 代码库 > 微信公众平台(1)-用nodejs搭建公众平台

微信公众平台(1)-用nodejs搭建公众平台

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

微信公众平台(1)-用nodejs搭建公众平台