WeChat公衆プラットフォーム(1)-nodejsで公衆プラットフォームを構築する


今日はnodejsでWeChat公衆プラットフォームを構築する方法を紹介します.
    まず、WeChatの公衆プラットフォームを紹介します.WeChatはみんな知っていますが、WeChatの公衆プラットフォームは特殊なマイクロ信号です.関心のあるWeChatユーザーに一斉にメッセージを送ることができます.関心のあるユーザーも自分でサービスを調べて情報を記入してサービスを完成します.
    WeChat公衆プラットフォームは現在三つのアカウントに分けられています.購読番号、サービス番号、企業番号.
    購読番号は主にメディアに対して、企業の宣伝で、サービス番号より情報を送る回数が多いのが特徴です.サービス番号は主にマイクロ商家、企業などに対して、ユーザーに関心を持ってサービスを提供するために使用されます.情報を送る回数は限られていますが、多くの購読番号がないインターフェースがあります.例えば、カスタマイズメニュー、WeChat決済などです.企業番号は最近発売されたもので、企業番号は多くのサービス番号の集合に相当しています.一つの企業番号で複数のサービスをカスタマイズできますが、企業番号は企業内の人員にサービスと情報を提供するだけで、企業番号は企業内の公衆番号に対応しています.
    これからどうやってWeChat公衆番号を作成するサービスを話しますか?
    1、WeChat公衆プラットフォーム(できればサービス番号)を作成し、開発者モードを選択する.
    2、公衆プラットフォームの舞台裏を編纂し、サービスを開始する
    3、開発者モードを開くときは、urlとtokenを記入する必要があります.
    下に公衆プラットフォームのバックグラウンドの編纂にとって、公衆番号のバックグラウンドポートは80ポートでなければなりません.どんな言語でもいいです.公衆プラットフォームのバックグラウンドはウェブサーバーです.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と一致しています.
もう一つのポストインタフェースはメッセージを送るためのものです.例えば、関心者からのWeChatが1つの「1」に送られてきました.実はこの要求はまずWeChatのサーバーに送信されました.その後、WeChatサーバが再度post要求を通じて私たちのバックグラウンドに転送します.バックグラウンドでデータを整理してWeChatのバックグラウンドに送ります.最後に関心者のユーザに戻ります.
    次にセグメントコードを見ます.いくつかの異なるフォーマットのデータを返します.
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="p_w_picpath"){
                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 = "" +
            "" +
            "" +
            ""+time+"" +
            "" +
            "" +
        "";
    }else if(returnObj.type == "p_w_picpath"){
        resStr = "" +
            "" +
            "" +
            ""+time+"" +
            "" +
            "" +
                "" +
            "" +
        "";
    }else if(returnObj.type == "news"){
        resStr = "" +
            "" +
            "" +
            ""+time+"" +
            "" +
            ""+returnObj.articleCount+"" +
            "";
        for(var i in returnObj.items){
            var newsItem = returnObj.items[i];
            resStr = resStr + "" +
                "" +
                "<description/>" +
                "<picurl/>" +
                "<url/>" +
            "</item>"
        }
        resStr = resStr + "</articles>" +
        "</xml>";
    }else{
        resStr = "<xml>" +
            "<tousername/>" +
            "<fromusername/>" +
            "<createtime>"+time+"</createtime>" +
            "<msgtype/>" +
            "<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/>" +
        "<fromusername/>" +
        "<createtime>"+time+"</createtime>" +
        "<msgtype/>" +
        "<content/>" +
        "</xml>";
    response.send(resStr);
}

module.exports.sendTextMessage = sendTextMessage;

module.exports.sendLocationMessage = sendLocationMessage;</code></pre> 
  <p>  ,     ,  ,            ,</p> 
  <p>                ,  <span style="color:rgb(255,0,0);">sendLocationMessage<span style="line-height:0px;"/></span><span style="line-height:0px;"/>  ,                ,                           ,                ,                       。</p> 
  <p>      ,                   。<br/></p> 
  <p><br/></p> 
 </div> 
</div>
                            </div>
                        </div>