本篇主要记录调用微信各类api和功能实现json
不管调用微信的什么api,都须要一个查询参数,就是咱们每隔1小时或者2小时获取的access_token,笔记1中已经保证了本地存储的access_token与微信服务器端一致,此时,咱们就可使用咱们本地的atoken成功调用api了。api
个人思路是,写一个函数getAccessToken,该函数接收一个函数参数,也就是回调函数。咱们在getAccessToken中获取到咱们本地的atoken后执行咱们的回调函数逻辑,以参数形式,把atoken传递给回调函数,供回调函数使用。很简单的逻辑,就是一个回调函数的使用。服务器
getAccessToken以下:微信
function getAccessToken(callback) { Weixin.findOne(filter, function(err, data) { // 查询到accessToken后,执行回调函数 callback(data.accessToken) }) }
简单写一下逻辑,不会贴源代码的。getAccessToken函数就如上所示,很简单的道理。函数
调用api时以下:post
自定义菜单为例测试
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再执行回调。ui
代码以下:url
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中的微信接口接入和服务器间的交互。如今懂了,菜单是这样生成的。
通常用来访问咱们的h5页面。用户点击菜单进入咱们的h5页面,通常咱们须要静默受权或者用户受权来获取用户的一些信息。从而与用户交互。
受权也很简单,在这里先不说,文档说的也很详细了。
不少菜单时点击推送一篇图文或者其余视频或者其余消息,这个怎么作呢,就用到了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才能完成。
微信页面受权的流程在微信文档很清楚,看文档就好了。