在2次开发中,涉及到比较多的也比较繁琐的就是服务器和微信服务器的交互

用户在公众号里操作回复关键词都会让微信服务器和开发者的服务器进行交互

用户一旦关注了某某公众号--微信后台会去查询该公众号是否连接了2次开发平台--吧关注事件发送到我们服务器上

在微擎里api.PHP肩负这1核心使命

当微信服务器请求开发者服务器上api.php的时候

查找到所有模块对象,根据传递的ID找到查找对应的微信账户(在我们平台绑定的)

微擎首先会建立核心引擎对象

$engine = new WeEngine();

执行start()函数

1:如果该公众号在我们平台没有对应的账户exit('Miss Account.');

2:根据微信平台传递来的参数和平台绑定的token进行校验($this->account->checkSign()) 检测失败 exit('Check Sign Fail.');

3:检测平台的请求方式,如果成功 执行到这行说明账户绑定成功 则更新账户状态 我们可以在后台发现绑定成功几个字

4:微信交互信息都用post形式推送XML数据到我们服务器

判断是否采用加密通信  如果加密先解密,如果WeAccount来解析交互的XML信息

原始文本交互信息如下:

<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>1348831860</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[this is a test]]></Content>

<MsgId>1234567890123456</MsgId>

</xml>

通过微擎解析成

Array(    [from] => 发送人的微信账户加密即openid    [to] => 公众平台的账户    [time]
=> 1447661567    [type] => text    [event] =>    [tousername] =>
公众平台的账户    [fromusername] =>
发送人的微信账户加密即openid    [createtime] => 1447661567    [msgtype] => text    [content] => 关键词    [msgid] => 消息id    [redirection] =>    [source] => )

5:微擎开始封装全局变量

$_W['openid'] = $message['from'];

$_W['fans'] = array('from_user' => $_W['openid']);

6:开始操作会员和粉丝表

$this->booking($message);

根据接受到的openid去查询会员粉丝表:用来判断是否是我们的粉丝

如果是我们的粉丝

6.  1:如果粉丝字段follow非空 则判断当前的事件即$message['event']

如果是取消关注则修改字段follow为0. 一些列其他相关

如果是其他事件说明用户正在使用我们平台交互 follow为1所以粉丝的follow可以识别用户是否关注(服务号正常用,订阅号在网页中无法获取openid不要用这个功能去查询是否关注)

获取粉丝表的UID,该字段管理会员信息表使用这个外键的意识是粉丝表的数据长久不变
会员可以无限制修改自己的信息
但是一旦会员信息被修改要如何查找到这个修改信息以后的会员?就依靠这个不变化的粉丝表的uid了,通过交互产生的OPENID查找到粉丝表对应的数据,再根据这个不变的外键查找到对应经常变化会员表的信息

如果没查询到会员则判断是否开启强制注册 如果强制注册则自动注册会员

然后再用返回的会员主键更新粉丝表UID

如果不是我们的粉丝

6.2则自动注册粉丝和会员 逻辑同6.1

7:如果是取消关注事件 则不用进行其他的逻辑处理 直接调用

$this->receive($hitParam, $hitKeyword, $response);

7.1 该函数用于查询所有模块查看所有模块的subscribes是否有配置相关标签

即我们在模块里写的manifest.xml里的<subscribes>下是否有配置过当前的事件

如果配置过事件则会去对应模块下查询recevier.php如果查询不到获取系统默认目录

/framework/builtin/模块名字/ 查询recevier.php

构建receiver对象

然后吧交互的XML信息 即被封装的meesage信息封装到了该对象的message中

同样被封装的还有传递的3个参数和相关全局变量$_W[uniacid]

去执行该对象的recevier()方法

所以我们可以在recevier.php里轻松使用$this->message来操作微信交互数据

8:开始操作session 微擎自定义的session被存入了数据库 不再操作文件IO这样会提高session操作效率

session_set_save_handler(

array(&$sess, 'open'),//在运行session_start()时执行

array(&$sess, 'close'),//在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行

array(&$sess, 'read'),//在运行session_start()时执行,因为在session_start时,会去read当前session数据

array(&$sess, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行

array(&$sess, 'destroy'),//在运行session_destroy()时执行

array(&$sess, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc

);

9:开始解析数据$this->analyze($message);

该函数的作用是用来根据关键词查询到具体的模块信息,封装了关键词 模块名字 微信交互信息等属性

10:遍历第9步匹配到的数据(此数据是按照回复规则ID逆序 查询到所有的回复规则匹配数据 即用正则或字符串包含来判断当前关键词是否在message[content]中),
再遍历的过程中执行处理响应功能 即 process

该方法会去模块下寻找processor.php找不到同recevier.php处理过程一样,同时该对象的封装的属性同recevier.php的实现类对象封装的属性

在对应的pocessor.php中调用process方法来处理响应信息

该类是WeModuleProcessor类的子类 WeModuleProcessor类封装了大量处理响应的方法最常见的就是

respNews

该函数接受数组对象最多可以传递10个数组 作为多个图文信息

11:

通过处理响应函数可以得到1个响应相关的数组对象

Array

(

[FromUserName] =>

[ToUserName] =>

[MsgType] => news

[ArticleCount] => 1

[Articles] => Array

(

[0] => Array

(

[Title] => 关键词标题173

[Description] => 22222

[PicUrl] => 具体图片网址

[Url] => 网页连接地址

[TagName] => item

)

)

)

通过$resp = $this->account->response($response);

来转成XML数据响应给腾讯服务器

玩转微信2次开发1_交互通信api.php(微擎版)的更多相关文章

  1. 微信小程序开发1_资料收集

    [前言] 小程序 [一.资料] 微信官网 开发文档.工具 等 https://mp.weixin.qq.com/cgi-bin/wx [二] 创建小程序和编辑代码,先安装 开发者工具 ,根据所使用的操 ...

  2. 微信小程序开发——使用mock数据模拟api请求

    前言: 微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端 ...

  3. 3.微信公众号开发:配置与微信公众平台服务器交互的URL接口地址

    微信开发基本原理: 1.首先有3个对象 分别是微信用户端 微信公众平台服务器 开发者服务器(也就是放自己代码的服务器) 三者间互相交互 2.微信公众平台服务器 充当中间者角色 (以被动回复消息为例) ...

  4. 【好好编程-技术博客】微信小程序开发中前后端的交互

    微信小程序开发中前后端的交互 微信小程序的开发有点类似与普通网页的开发,但是也不尽然相同.小程序的主要开发语言是JavaScript,开发同普通的网页开发有很大的相似性,对于前端开发者而言,从网页开发 ...

  5. 微信小程序开发心得

    微信小程序也已出来有一段时间了,最近写了几款微信小程序项目,今天来说说感受. 首先开发一款微信小程序,最主要的就是针对于公司来运营的,因为,在申请appid(微信小程序ID号)时候,需要填写相关的公司 ...

  6. 《腾讯游戏人生》微信小程序开发总结

    为打通游戏人生擂台赛与线下商家的O2O衔接,同时响应时下日臻火热的微信小程序,项目团队决定也开发一款针对性的微信小程序,以此方便商家在我们平台入驻并进行擂台赛事的创建和奖励的核销,进一步推广擂台赛的玩 ...

  7. 【腾讯Bugly干货分享】微信小程序开发思考总结——腾讯“信用卡还款”项目实践

    本文来自于腾讯bugly开发者社区,未经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/58212d0fa7a7574c4f4cc3c5 作者:peggy 小程序概述 1 ...

  8. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  9. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

随机推荐

  1. Solidity oraclize query apikey加密

    solidity 程序中如果用到oraclize query,api调用需要apikey,则最好加密apikey,否则公开solidity代码时会连同apikey一起公开. 加密方法: https:/ ...

  2. 在slam_gmapping中使用Log数据创建地图

    本文介绍使用机器人记录的tf变换和激光扫描数据来建立2D地图.并在ROS的图形化模拟环境rviz中通过重新回放记录的数据作为机器人真实传感器采集的输入,来观测地图动态创建过程. 1.ROS gmapp ...

  3. flex 布局的深入研究

    对于flex盒模型的设计期望 flex盒模型是被期望设计成 1:在任何流动的方向上(包括上下左右)都能进行良好的布局 2:可以以逆序 或者 以任意顺序排列布局 3:可以线性的沿着主轴一字排开 或者 沿 ...

  4. Appium混合应用测试

    Appium测试混合应用 混合应用即是原生应用中间混着html页面,需要在两种类型的页面之间跳转. 测试Android混合应用 前期设置 4.4以下版本使用automationName:Selendr ...

  5. jQuery form 插件

    http://jquery.malsup.com/form/#getting-started 举例: $(document).ready(function() { $('#ff').ajaxForm( ...

  6. (转)对存储过程进行加密和解密(SQL 2008/SQL 2012)

    原文地址:http://www.cnblogs.com/wghao/archive/2012/12/30/2837642.html 开始: 在网络上,看到有SQL Server 2000和SQL Se ...

  7. RobotFramework添加自定义关键字实战

    背景: 此篇文章是上一篇博客python的requests库怎么发送带cookies的请求的后续,上一篇只是使用python脚本调试通过了,接下来要把我们的方法封装为关键字,在RF中调用. 实施: 一 ...

  8. asp.net站点阻止某个文件夹或者文件被浏览器访问

    一个站点根目录下面有一个Config文件夹,这个文件夹里面都是一些json格式的txt文本,文本是一种静态资源,如果知道这个文本的地址,就可以在浏览器中输入地址打开这个文本,别人就可以看到站点的配置, ...

  9. Javascript中对数组处理的函数汇总

    数组类型是JS中非常常见的类型,而且JS里的数组与其他多数语言中的数组有所不同,它的数组里每一项可以存放任何一种类型的数据,也就是说数组的第一项放的是字符串,第二项可以放数字或对象都没问题.而且JS中 ...

  10. vi/vim使用总结

    第一部份:一般模式可用的按钮说明,光标移动.复制粘贴.搜索取代等 移动光标的方法: h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移劢一个字符 k 或 向上箭头键( ...