weiphp自定义菜单的页面跳转流程
1.如果页面跳转的URL不是本weiphp应用的模块的话,只会触发微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息。
如下是微信post给开发者中心设置的服务器地址的URL,其中会带有
$_GET参数[signature],[timestamp],[nonce]。
[ 2016-02-21T17:33:54+08:00 ] 127.0.0.1 /weiphp/index.php?s=/home/weixin/index/id/1.html&signature=6194f1753068381d51d5318c6f09ec8deb937bbd×tamp=1456047235&nonce=1871791058
通过php://input获取原始数据。
<xml><ToUserName><![CDATA[gh_ca0a76200d18]]></ToUserName>
<FromUserName><![CDATA[oVHvEwC3PC3-qv1GhPmf918QEUsU]]></FromUserName>
<CreateTime>1456047235</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[VIEW]]></Event>
<EventKey><![CDATA[http://www.gainwinsoft.com]]></EventKey>
<MenuId>401665081</MenuId>
</xml>
然后执行控制器Application/Home/Controller/WeixinController.index()。index里回复数据后调用exit()退出。reply里解析微信服务器发送过来的数据,遍历Addons里看有没有匹配的Model,如果有的话,执行匹配的Addons/XXXX/Model/WeixinAddonModel。(每个微信插件的模型都会有一个WeixinAddonModel.class.php文件,这是这个插件之所以存在的灵魂文件!因为它是负责与微信交互的窗口。一般来说,微信请求WeiPHP时,在Application/Home/Controller/WeixinController.class.php这个微信交互中心里进行数据加工和功能分发,其中数据加工就是把微信传过来的xml转成数组(数组变量为$dataArr),并获取相关的关键词数据(如果有关键词的话,其数组变量为$keywordArr);而功能分发就是根据相关规则(见下图的分发规则)找到相应的插件,最后加载这个插件下面的WeixinAddonModel.class.php文件,并调用里面的replay方法进行业务需要的加工处理)如果没有的话,就扔给Addons/Robot/Model/WeixinAddonModel的,执行Robot的reply方法。方法里面再调用WeixinModel基类的reply方法,回应微信服务器过来的post请求的回复。
1.如果页面跳转的URL是本weiphp应用的模块的话,会根据这个URL,先触发URL要跳转到的那个模块的Controller。
[ 2016-02-21T18:04:13+08:00 ] 127.0.0.1 /weiphp/index.php?s=/addon/WeiSite/WeiSite/index/publicid/1.html
然后再触发微信服务器通过事件的post请求(同第一步)。
微信服务器Post过来的请求,给开发者中心处设置的服务器地址,其实相当于微信端是client。我们自己的服务器就变成了要响应post来做出相应的处理。一般的web开发,client端submit了一段数据到服务器后,服务器要么ajaxReturn一个json数据还给client,要么display一个新的模板显示。WeixinModel其实就是把微信各消息类型需要的XML数据包返回给微信服务器,然后微信才能显示到微信画面里。(直接echo)
具体XML数据包格式参照微信公众号开发者文档。