微信公众号开发笔记2(nodejs)

本篇主要记录调用微信各种api和功能实现

一、始于access_token

无论调用微信的什么api,都需要一个查询参数,就是我们每隔1小时或者2小时获取的access_token,笔记1中已经保证了本地存储的access_token与微信服务器端一致,此时,我们就可以使用我们本地的atoken成功调用api了。

我的思路是,写一个函数getAccessToken,该函数接收一个函数参数,也就是回调函数。我们在getAccessToken中获取到我们本地的atoken后执行我们的回调函数逻辑,以参数形式,把atoken传递给回调函数,供回调函数使用。很简单的逻辑,就是一个回调函数的使用。

getAccessToken如下:

function getAccessToken(callback) {

    Weixin.findOne(filter, function(err, data) {
        //  查询到accessToken后,执行回调函数
        callback(data.accessToken)
    })
}

简单写一下逻辑,不会贴源代码的。getAccessToken函数就如上所示,很简单的道理。

调用api时如下:

自定义菜单为例

getAccessToken(function(accessToken) {
//   菜单的json配置项,下面会介绍
    var menusData = config.weixinMenu

    request({
        method: ‘POST‘,
        url: "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken,
        json: true,
        body: menusData
    }, function(err, res, body) {
        //  请求完成, body中保存着请求结果,可进一步操作
    })

})

就如上所示,我们在创建菜单时,先获取accessToken,利用回调的特性,拿到accessToken来进行微信api调用。

遗留的问题

我在开发时老是遇到accessToken失效导致了api调用失败,笔记1中提到过,我也没搞清楚失效的原因,不明觉厉啊,如果你也遇到了这个问题,就看一下我的解决办法,如下:getAccessToken获取后,首先不会执行回调,而是利用accessToken发起一个微信api请求,查看返回的body结果,如果errcode是0,也就是accessToken是最新的,就执行回调。如果不是,本地的accessToken过期了,那么重新从微信服务器获取accessToken再执行回调。

代码如下:

function getAccessToken(callback) {

    Weixin.findOne(filter, function(err, data) {
        //  查询到accessToken后,发起一个验证请求

        request({
            url: "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" + data.accessToken,
            method: ‘GET‘
        }, function(err, res, body) {
            //  如果errcode是 0 ,则accessToken有效,执行回调,如果不是,就获取新的atoken后执行回调
            if (!body.errcode) {
                callback(data.accessToken)
            } else {
                getNewAccessToken(callback)
            }
        })

    })
}

感觉回调的优点深,代码有点差。就这么个逻辑了。获取新的accessToken函数就和从前一样。 上面这个api是获取微信服务器ip地址的,用来测试accessToken好了。

二、最基础的菜单生成

看文档,这是规定

菜单的类型,最常用的就是click和view:

博主在这里煞费苦心,看半天也不懂。主要是,在做自定义菜单时,还没搞懂笔记1中的微信接口接入和服务器间的交互。现在懂了,菜单是这样生成的。

1、view类型的菜单

一般用来访问我们的h5页面。用户点击菜单进入我们的h5页面,一般我们需要静默授权或者用户授权来获取用户的一些信息。从而与用户交互。

授权也很简单,在这里先不说,文档说的也很详细了。

2.click类型菜单

很多菜单时点击推送一篇图文或者其他视频或者其他消息,这个怎么做呢,就用到了click类型的菜单配置。

click类型类似于给此菜单按钮加了点击事件,用户点击这个菜单,微信服务器会发送信息给我们服务器,告诉我们用户点击了菜单,click事件的key值(我们自己配的),也就是说我们配置的所有click类型菜单,都会配置一个key值,用户点击对应菜单,会推送消息给我们服务器,根据这个key值来进行主观的操作,返回一篇图文给用户啊,或者返回一个连接给用户啊,或者怎么着。

一个菜单配置项的示例

var menusConfig = {
    "button": [{
        name: "某某论坛",
        type: "view",
        url: homeUrl
    }, {
        name: "本站介绍",
        type: ‘click‘,
        key: "intro"
    }, {
        name: "图文列表",
        "sub_button": [{
            name: "图文1",
            type: "click",
            key: "new1"
        }, {
            name: "图文2",
            type: "click",
            key: "new2"
        }, {
            name: "图文3",
            type: "click",
            key: "new3"
        }]
    }]
}

自定义菜单生成的格式,文档上有,如上配置,会生成三个主菜单,第三个菜单下有3个图文子菜单。第一个菜单是一个连接,url地址是我们自己的h5页面地址。

可以看到我们设置了好多click类型菜单,都是一个唯一的key值。那么我们怎么根据不同的click菜单的key值进行响应呢。

回想笔记1中,我们写好了微信服务器通信的post接口,接收微信服务器推送的消息。我们在那里判断了事件类型,如果事件类型是click,那么我们以click的key值为准来进行处理,如果是view或者其他的事件,就用原事件类型处理。

代码如下:

//    如果是click事件,用事件key值来触发响应函数
var eventName = body.Event[0] === ‘CLICK‘ ? body.EventKey[0]: body.Event[0];
//    一个对象,包含了所有的事件响应处理函数
weixinAutoMessage[eventName](body, res)

weixinAutoMessage配置如下:

module.exports = {
  view: function () {
    // 可以进行处理或者无视
  },
  intro: function (body, res) {
    // 返回一个本站介绍的图文
  },
  new1: function (body, res) {
    // 返回new1图文
  }
  // ..雷同
}

这就是自定义菜单和用户点击菜单的交互过程了。

微信发送给我们的body格式中,有来源openId(用户),对象openId(公众号),代表着这个微信事件是用户发给公众号的,然后我们给微信send  对应xml格式的消息让微信服务器知道该干什么。例如:

intro: function (body, res) {
  var xml = {
    xml: {
        ToUserName: body.FromUserName,
        FromUserName: body.ToUserName,
        CreateTime: + new Date(),
        MsgType: ‘text‘,
        Content: ‘这是一个文本消息‘
    }
};

xml = builder.buildObject(xml);
res.send(xml);
}
} 

用户点击intro时,我们回复了一个文本消息,内容是  这是一个文本消息。 这里用了xml2js模块,可以百度一下看看。

xml格式在微信文档很清晰很详细,可以在消息管理- 被动回复消息一页看得到。

其他类型的菜单博主也没用过,也没法记录了。

微信页面授权

微信页面授权的意思就是,如果你需要将用户的openId与某些数据关联起来,你就需要获取一些权限,从而获取到用户的openId并保存,当用户在我们h5页面注册或者做一些需要记录信息的事件时,我们就可以将它的openId到它的数据中。

比如你的页面需要注册,注册时,也要把用户的openId保存到表中,因为后期如果用户在你的网站买了商品或者其他动态,你需要动态的给用户发送购买成功、支付成功等消息,这就需要这个用户的openId才能完成。

微信页面授权的流程在微信文档很清楚,看文档就行了。

时间: 2024-10-10 06:41:52

微信公众号开发笔记2(nodejs)的相关文章

微信公众号开发笔记1(nodejs开发的)

本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有自己的服务器与微信服务器进行认证通过后,才能与他交流.如何进行认证? 1. 接口认证 接口的认证是token验证,微信服务器会发送一个get请求给我们在公众号配置的接口,如http://xxxx/weixin/api ,这个请求带了如下参数 然后,微信规定我们 1)将token.timestamp.

微信公众号开发笔记

试了一段时间的微信公众号开发,本文主要以图片和代码的形式,介绍一些公众号开发的内容. 基于微信公众号的第三方开发,主要是需要搞清楚[微信用户],[微信服务器],[第三方服务器]三者之间的数据流程和走向,废话不说,直接上图吧. 1. 第三方URL验证,微信用户关注公众号事件 2. 用户发送消息,点击自定义菜单事件 3. 设置公众号自定义菜单 4. 网页开发授权 暂时先发这4张图,代码后续再发.希望对开发者有所帮助.

nodejs + BAE 搭建微信公众号开发平台

闲来无事创建了一个微信公众账号,名曰“深圳生活小助手”, 关注的人不多,平时发一些深圳新闻,趣事啥的,为了丰富公众号的内容,准备添加一些便民查询功能,例如天气预报.快递查询等等. 于是就有了本文的内容. 深圳的读者扫描关注支持下啊... 闲话不多说,本文主要介绍的就是如何基于nodejs和百度云搭建微信公众号开发平台,下一节介绍如何基于该平台实现了一个简单的天气预报查询功能的小例子. 1. 使用Express搭建本地站点 Express 是一个简洁.灵活的 node.js Web 应用开发框架,

微信公众号开发入门笔记(一):知识及技术路线图

注:本系列博客所使用的编程语言为Java,内容主要来自于慕课网课程:初识Java微信公众号开发(课程链接:http://www.imooc.com/learn/368)的学习收获和总结. 因为微信的大规模普及性,微信公众号开发可以开发出跨平台使用的功能,并且使用起来简单方便.个人使用Java作为工作语言,对Java比较熟悉,所以本系列的笔记采用Java语言来进行开发.此外,慕课网的课程"初识Java微信公众号开发"为我带来了很大的启发,很适合想要做微信公众平台开发的朋友们的入门. 那么

nodejs 中koa框架下的微信公众号开发初始篇

最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂把探索出来的一点东西拿出来分享,毕竟能力有限,拿出来也是希望大神看到了给点建议, 主要用 koa-wechat 处理验证和消息解析 ,用wechat-api来进行按钮组等api操作,刚开始没什么内容,大家随意看看就好, 废话不多说,直接上代码(这是一个route的代码): var koa = req

微信公众号开发入门笔记(四):开发环境搭建

(一)Eclipse+Tomcat本地服务器的搭建及Servlet程序的创建 我们主要在Servlet程序中实现业务逻辑,自然要先熟悉Servlet程序开发环境的搭建及程序的创建. 详见博文:微信公众号开发技术基础(一):Eclipse+Tomcat搭建本地服务器并跑通HelloWorld程序 (二)外网映射工具的准备 从上一篇博文中的数据交互原理中可以看出,我们的本地后台服务器是需要直接和微信服务器进行交互的,而微信服务器必须访问一个公网的地址,无法访问我们本地的地址.因此,需要一个外网映射工

微信订阅号开发笔记(二)

微信开发的流程其实很简单 o(∩_∩)o 哈哈!在微信网站的编辑操作 额,就不说了.虽然有人问过.下面是我的微信开发过程,简单记录下. 成为开发者 材料:1.自己的服务器资源,百度的BAE,新浪的SAE都不错. 2.懂那么点编程语言. 3.注册微信公众号. 上面的都有了之后,就可以自己动手开发了.哇咔咔,好兴奋.有木有. 在登录进去之后,怎么成为开发者?不知道,自己看去. 开始coding吧. 1.验证 if (! empty ( $_GET ['echostr'] ) && ! empt

微信订阅号开发笔记(三)

1.接收语音识别结果 if($msgType=="voice"){ //收到语音消息 //MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据. //Format 语音格式,如amr,speex等 $format = $postObj->Format; $mediaId = $postObj->MediaId; //开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段. //注:由于客户端缓

微信订阅号开发笔记(四)

1.创建菜单 //创建菜单 public function createMenu(){ $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token="; $url.=$this->getacctoken(); //目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单.一级菜单最多4个汉字, //二级菜单最多7个汉字,多出来的部分将会以"..."代替.请注意,创建自定义菜单