微信公众平台(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方法,地理位置信息接口的获取有两种方式,一种是微信用户每次进入关注的该微信公众号回话界面的时候,还有一种是定时推送地理位置的方式,两种方式都需要用户授权以后才能推送地理位置信息。

以上,就是对微信公众平台的基本信息交互的接口。

时间: 2024-10-11 01:39:22

微信公众平台(1)-用nodejs搭建公众平台的相关文章

php之微信公众号开发三公牛牛房卡平台搭建使用php7要注意的地方

开启微信公众号开发三公牛牛房卡平台搭建网站(h5.fanshubbs.com联系Q1687054422),从微信开发文档中下载demo 如下载php示例代码 示例代码中是使用"$GLOBALS["HTTP_RAW_POST_DATA"]"接收来自客户端的消息:如下图所示 线上服务器使用的是php7以下的版本,发送消息会有回复. 但线上服务器使用的是php7以上的版本,发送消息一直得不到回复.查找资料得知 php7已经弃用了HTTP_RAW_POST_DATA 用 p

微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码

教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码 由于最近比较忙,这个教程没有连续上,我会尽量连载.书节上回,上次我介绍了代公众号调用接口的方法和SDK的使用.不少朋友也都加了QQ群(2489462

微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 前几章中我讲解了微信开发平台提供第三方平台的好处,和使用流程,如果你看了我的文章相信你对开放平台有了初步的了解,但是在实际的开发过程

h5棋牌游戏公众号开发 app开发+源码平台搭建分享教程

h5棋牌游戏公众号开发 app开发+源码平台搭建分享教程下载diguaym.com/h5 扣扣2152876294 多合一集合游戏 聚集了h5牛牛.金花.二杠八.十三水.三公等 全新界面UI设计(WeChat H5 public number landlords chess source development, Download diguaym.com/h5 buckle more than 2747044651 in one set of game 要建立一个安全Linux服务器就首先要了解

微信小程序开发入门(一),Nodejs搭建本地服务器

1.  如何模拟真实环境中,读取服务端数据,首先需要使用Nodejs搭建一个本地服务器的环境. 在搭建web服务器之前,需要先安装node.js(安装版本最好为6.9.x) 安装后node.js,接下来就需要安装http的镜像文件 npm install http-server -g(windows下)sudo npm install http-server -g(linux和mac下)接下来在桌面创建一个文件夹 cd 文件夹名字http-server这时候,就会显示在8080端口下运行的一个本

微信公众号教程(10)公众账号自定义回复功能

公众账号自定义回复功能 微信官方其实并不推荐经常群发消息,更多的是希望用户通过对话来自己获取服务或者进行搜索.今天我们就讲下如何使用开发模式做自定义回复. 目前公众账号可以接收的用户提交消息请求有四种类型,分别是文字.图片.地理位置和链接,而公众账号回复只有三种格式,文字.图文和音乐,也就是说用户互动的模式最多也就是12种,我们今天先讲三种即文字回复文字.文字回复图文.文字回复音乐. 这强调一下,微信的消息接口通讯有效时间是5秒,也就是说网络不稳定等原因很容易造成用户在5秒内接收不到回复消息,然

公众号第三方平台开发 教程四 代公众号处理消息和事件

公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号授权第三方平台 公众号第三方平台开发 教程四 代公众号发起网页授权说明 公众号第三方平台开发 教程五 代公众号处理消息和事件 公众号第三方平台开发 教程六 代公众号使用JS SDK说明 另,感谢一下这个大虾的博客,这几篇东西都是在他的博文基础上完成的,他的博客里也有一些接口代码可以下载 微信开发系列

公众号第三方平台开发 教程六 代公众号使用JS SDK说明

公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号授权第三方平台 公众号第三方平台开发 教程四 代公众号发起网页授权说明 公众号第三方平台开发 教程五 代公众号处理消息和事件 公众号第三方平台开发 教程六 代公众号使用JS SDK说明 另,感谢一下这个大虾的博客,这几篇东西都是在他的博文基础上完成的,他的博客里也有一些接口代码可以下载 微信开发系列

微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结

前言 很久以来,一直想写一篇微信支付有关的总结文档:一方面是总结自己的一些心得,另一方面也可以帮助别人,但是因种种原因未能完全理解透彻微信支付的几大支付方式,今天有幸做一些总结上的文章,也趁此机会,将一年多以来的相关经验分享一下. 概述 1. 扫码支付 商户在pc端展示一个支付二维码,用户使用微信扫一扫功能,扫码后实现付款的支付方式. 2. 公众号支付 商户在微信APP内(微信浏览器)打开H5网页,通过微信支付实现付款的支付方式. 3. H5支付 商户在微信浏览器以外的手机浏览器打开H5网页,通