diff --git a/Extend/Vendor/LaneWeChat/README.md b/Extend/Vendor/LaneWeChat/README.md
new file mode 100644
index 0000000..eaa6cf6
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/README.md
@@ -0,0 +1,473 @@
+框架名称:LaneWeChat
+
+框架简介:这是一个为快速开发微信应用而生的PHP框架。将微信的开发者功能根据文档进行了封装。为了快速开发的目的,开发者完全不需要要知道具体是如何实现的,只需要简单的调用方法即可
+
+开发语言:PHP
+
+版本要求:原则PHP5.3以上
+
+版本规避:若版本低于PHP5.3,则删除本框架所有页面开头namespace一行即可。
+
+命名空间:本框架的命名空间均为LaneWeChat开头。
+
+
+
+
+Developer Blog:http://www.lanecn.com
+
+文档地址:<a href="http://www.lanecn.com/article/main/aid-65">http://www.lanecn.com/article/main/aid-65</a>
+
+
+
+更新日志:
+
+    2014-08-17:1.2版本。新增自定义菜单功能
+
+    2014-08-07:1.0版本
+
+
+
+
+文档目录:
+
+    1、常识普及。
+
+    2、如何安装。
+
+    3、初出茅庐。
+
+    4、流程分析。
+
+    5、牛刀小试。
+
+    6、函数详解。
+
+    7、实例示范。
+
+
+常识普及:
+
+一、微信公众账号分两种,一种是订阅号,一种是服务号。
+
+    1、订阅号是被动响应用户消息功能,并且每天推送一条消息。
+
+    2、服务号是300元/每年认证,被动响应用户消息,主动给用户发送消息,自定义菜单按钮,网页授权等功能,并且每月推送一条消息。
+
+    3、订阅号适合消息类,新闻类应用,常常需要推送文章给用户的;服务号适合自助查询等。
+
+    4、订阅号被认证后也享用自定义菜单等功能,仍旧是300元/每年
+
+
+
+二、专业术语:
+
+    1、OpenId:微信服务器并不会告诉公众号用户的微信ID,即使是你的关注者也不行,为了解决开发中唯一标识的问题,微信使用了OpenId,所谓的OpenId,就是用户和微信公众号之间的一种唯一关系。一个用户在一个公众号面前,享用唯一的OpenId,不会和别人重复。换言之,同一个用户在另一个公众号面前,是拥有另一个OpenId的。再直白些就是$openId = md5('用户微信ID+公众号ID')
+
+    2、Access_Token:此项只有认证号的功能才会使用的到,Access_token是一个授权标识,即一个授权验证码,一个标识10分钟内有效,10分钟的有效期内公众号的多个关注者可以使用同一个Access_Token。在使用主动给指定用户发送消息、自定义菜单、用户管理和用户组管理等功能的时候,每次操作需要给微信服务器以参数的形式附带Access_token。
+
+    3、Access_Token网页版:本Access_Token网页版授权时会使用到,和2中的Access_Toekn是不同的东西,不过使用我们的LaneWeChat微信快速开发框架是不需要了解这些的。Access_Token网页版是说在用户打开你的公众号提供的网页的时候,你的网页需要获取用户的OpenId、昵称、头像等信息的时候授权用的。同时,本Access_Token网页版有两种用法,一种是打开网页后弹出一个授权框,让用户点击是否授权,界面像主流的开放平台授权界面(比如QQ登陆某网站,支付宝账号登陆某网站等);另一种是不需要弹出授权框仍旧可以获取用户信息,用法可以在实例中看到。
+
+
+如何安装:
+
+    1、本框架以代码包的插件形式放在项目的目录中即可。
+
+    2、配置项:打开根目录下的config.php,修改定义常量WECHAT_APPID,WECHAT_APPSECRET,WECHAT_URL。其中前两项可以在微信公众号官网的开发者页面中找到,而WECHAT_URL是你微信项目的URL,以http://开头
+
+    3、本框架的唯一入口为根目录下的wechat.php
+
+    4、首次使用时,请打开根目录下的wechat.php,注释掉21行,并且打开注释第24行。
+
+    5、在微信开发者-填写服务器配置页面,填写URL为http://www.lanecn.com/wechat.php,保证该URL可以通过80端口正常访问(微信服务器目前只支持80端口),并且将Token填写为config.php中的WECHAT_TOKEN常量的内容(可以修改)。
+
+    6、微信服务器在第4步验证通过后,反向操作第4步,即注释掉第24行,打开注释第21行。至此,安装配置完成。
+
+
+
+
+初出茅庐:
+
+    1、给你的微信公众号发送一条文本消息,比如hello world或者其他什么的。这个时候你应该会收到一条“收到文本”的服务器反馈的被动响应的消息。
+
+    2、这个时候你需要先为自己鼓掌。
+
+
+
+
+流程分析:
+
+    1、我们给微信服务器发送了一条“hello world”的文本消息。
+
+    2、微信服务器收到我们的消息后,查找该公众账号所配置的服务器信息中的URL(如何安装部分 - 第5步)。
+
+    3、微信服务器向第二步获取的URL发送请求,参数是微信服务器自己拼接过的XML格式。
+
+    4、根目录下的wechat.php,引入了我们的配置文件和所需的类后,进入了类WeChat的方法run()。该类位于core/wechat.lib.php。微信的XML数据此时已经被解析为数组,变量名为$request。
+
+    5、然后,我们进入了类WechatRequest的方法switchType(),根据不同的消息类型,给予不同的响应。比如用户发送文本消息和关注事件,给出的返回应该是不同的。当然,你要给出同样的提示也不能说是错的。
+
+    6、在第5步中的方法中,是一个switch,根据消息类型(此时是文本类型,微信服务器给我的是text)选择了一个处理文本消息的方法,类WechatRequest中的方法text()。该方法的功能是发送文本消息,文本内容是“收到文本”。
+
+    7、此时,我们return了一个数据返回给了上层调用,层层return,就到了我们根目录的下的唯一入口文件wechat.php,此时我们返回的数据被echo出来了。
+
+    8、微信服务器拿到了输出的数据,微信服务器进行分析和处理,将文本发送给了用户的微信客户端。我们就在手机上看到了微信输出的“收到文本”。
+
+    9、流程结束,这就是发送“hello world”,然后返回给用户“收到文本”。
+
+
+牛刀小试:
+
+    1、打开core/wechatrequest.php文件,讲方法text()中的变量修改为$content = '收到文本消息'.$request['content'];
+
+    2、保存并且上传到你的服务器。
+
+    3、在微信中打开你的公众号,输入文本消息“hello world”。见证奇迹的时刻到了。这个时候你的手机微信客户端中现实的是“收到文本消息hello world”。
+
+
+
+
+函数详解:
+
+    一、被动给用户发送消息。
+
+        1、类简介:用户输入文本、图片、语音、音乐、视频等消息,以及关注、取消关注,上报地理位置等事件后,服务器被动给出应答。
+
+        2、使用命名空间:use LaneWeChat\Core\ResponsePassive;
+
+        3、参数:  $fromusername = "谁发给你的?(用户的openId)"  在变量$request['fromusername']中
+
+                 $tousername = "你的公众号Id";                 在变量$require['tousername']中
+
+                 $mediaId = "通过上传多媒体文件,得到的id。";
+
+        4、发送文本
+
+                ResponsePassive::text($fromusername, $tousername, '文本消息内容');
+
+        5、发送图片
+
+                ResponsePassive::image($fromusername, $tousername, $mediaId);
+
+        6、发送语音
+
+                ResponsePassive::voice($fromusername, $tousername, $mediaId);
+
+        7、发送视频
+
+                ResponsePassive::video($fromusername, $tousername, $mediaId, '视频标题', '视频描述');
+
+        8、发送音乐
+
+                ResponsePassive::music($fromusername, $tousername, '音乐标题', '音乐描述', '音乐链接', '高质量音乐链接,WIFI环境优先使用该链接播放音乐', '缩略图的媒体id,通过上传多媒体文件,得到的id');
+
+        9、发送图文
+
+            1)创建图文消息内容
+
+                $tuwenList = array();
+
+                $tuwenList[] = array('title'=>'标题1', 'description'=>'描述1', 'pic_url'=>'图片URL1', 'url'=>'点击跳转URL1');
+
+                $tuwenList[] = array('title'=>'标题2', 'description'=>'描述2', 'pic_url'=>'图片URL2', 'url'=>'点击跳转URL2');
+
+            2)构建图文消息格式
+
+                $itemList = array();
+
+                foreach($tuwenList as $tuwen){
+
+                    $itemList[] = ResponsePassive::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
+
+                }
+
+            3)发送图文消息
+
+                ResponsePassive::news($fromusername, $tousername, $itemList);
+
+
+
+
+    二、AccessToken授权。
+
+        1、类简介:除了被动相应用户之外,在主动给用户发送消息,用户组管理等高级操作,是需要AccessToken授权的,我们调用一个URL给微信服务器,微信服务器会返回给我们一个散列字符串,在高级操作的时候需要将此串以参数的形式发送。散列字符串10分钟内有效,过期需要重新获取,获取新的后之前的全部失效。
+
+        2、使用命名空间:use LaneWeChat\Core\AccessToken;
+
+        3、参数:无
+
+        4、获取AccessToken
+
+            AccessToken::getAccessToken(); 该调用会返回微信服务器散列后的AccessToken字符串。
+
+        5、温馨提示
+
+            如果暂且用不到此功能,请跳过。最后来看这里!
+
+        6、功能补充
+
+            有一个地方需要用户自行完善,根据介绍我们已经知道了,获取AccessToken只有10分钟的有效期,过期需要重新获取。因此,我们需要存储这个AccessToken。
+
+            由于大家的存储方式各不相同,有Mysql的,有Redis的,有MongoDB的,还有Session的。所以这里我讲存储和读取给留空了。
+
+            流程:AccessToken类,public方法只有一个,就是getAccessToken()。这个方法会调用一个私有方法_checkAccessToken()来检测AccessToken是否存在并且是否过期,如果不存在或过期,则调用私有方法_getAccessToken()
+
+            完善步骤:
+
+            1)、打开core/accesstoken.lib.php文件。
+
+            2)、私有方法_getAccessToken()的倒数第二行(return是倒数第一行),在这个地方,请讲变量$accessTokenJson存储起来,变量$accessTokenJson是一个字符串。
+
+            3)、私有方法_checkAccessToken()的第一行就是读取操作(有一行伪代码$accessToken = YourDatabase::get('access_token');),将刚才第二步的存储的东西给读出来,并且赋值给$accessToken。
+
+            4)、在第二步的存储,第三部的读取的时候,请不要修改数据,仅仅完善一个读和存的操作就可以了。
+
+
+
+
+    三、主动给用户发送消息。
+
+        1、类简介:用户输入文本、图片、语音、音乐、视频等消息,以及关注、取消关注,上报地理位置等事件后,服务器被动给出应答。
+
+        2、使用命名空间:use LaneWeChat\Core\ResponsePassive;
+
+        3、参数  $tousername = "你的公众号Id";                 在变量$require['tousername']中
+
+                $mediaId = "通过上传多媒体文件,得到的id。";
+
+        4、发送文本内容
+
+        ResponseInitiative::text($tousername, '文本消息内容');
+
+        5、发送图片
+
+        ResponseInitiative::image($tousername, $mediaId);
+
+        6、发送语音
+
+        ResponseInitiative::voice($tousername, $mediaId);
+
+        7、发送视频
+
+        ResponseInitiative::video($tousername, $mediaId, '视频描述', '视频标题');
+
+        8、发送地理位置
+
+        ResponseInitiative::music($tousername, '音乐标题', '音乐描述', '音乐链接', '高质量音乐链接,WIFI环境优先使用该链接播放音乐', '缩略图的媒体id,通过上传多媒体文件,得到的id');
+
+        9、发送图文消息
+
+            1)创建图文消息内容
+
+                $tuwenList = array();
+
+                $tuwenList[] = array('title'=>'标题1', 'description'=>'描述1', 'pic_url'=>'图片URL1', 'url'=>'点击跳转URL1');
+
+                $tuwenList[] = array('title'=>'标题2', 'description'=>'描述2', 'pic_url'=>'图片URL2', 'url'=>'点击跳转URL2');
+
+            2)构建图文消息格式
+
+                $itemList = array();
+
+                foreach($tuwenList as $tuwen){
+
+                    $itemList[] = ResponseInitiative::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
+
+                }
+
+            3)发送图文消息
+
+                ResponseInitiative::news($tousername, $itemList);
+
+
+
+
+    四、用户及用户组管理。
+
+        1、类简介:获取粉丝列表,创建\修改用户组,讲用户添加\移除到用户组。
+
+        2、使用命名空间:use LaneWeChat\Core\UserManage;
+
+        3、参数  $openId = '用户和微信公众号的唯一ID';           在变量$require['openid']中
+
+                $mediaId = "通过上传多媒体文件,得到的id。";
+
+                $groupId = '分组ID';                         在添加新分组、获取分组列表的时候可以得到
+
+        4、分组管理 - 创建分组
+
+            UserManage::createGroup('分组名');
+
+        5、分组管理 - //获取分组列表
+
+            UserManage::getGroupList();
+
+        6、分组管理 - 查询用户所在分组
+
+            UserManage::getGroupByOpenId($openId);
+
+        7、分组管理 - 修改分组名
+
+            UserManage::editGroupName($groupId, '新的组名');
+
+        8、分组管理 - 移动用户分组
+
+            UserManage::editUserGroup($openId, $groupId);
+
+        9、用户管理 - 获取用户基本信息
+
+            UserManage::getUserInfo($openId);
+
+        10、用户管理 - 获取关注者列表
+
+            UserManage::getFansList($next_openId='');
+
+        11、用户管理 - 获取网络状态
+
+            UserManage::getNetworkState();
+
+
+
+
+    五、网页授权。
+
+        1、类简介:在网页中获取来访用户的数据。
+
+        2、使用命名空间:use LaneWeChat\Core\WeChatOAuth;
+
+        3、参数  $openId = '用户和微信公众号的唯一ID';           在变量$require['openid']中
+
+                $mediaId = "通过上传多媒体文件,得到的id。";
+
+                $groupId = '分组ID';                         在添加新分组、获取分组列表的时候可以得到
+
+        4、获取CODE。
+
+            参数:$scope:snsapi_base不弹出授权页面,只能获得OpenId;snsapi_userinfo弹出授权页面,可以获得所有信息
+
+            参数:$redirect_uri:将会跳转到redirect_uri/?code=CODE&state=STATE 通过GET方式获取code和state。获取CODE时,发送请求和参数给微信服务器,微信服务器会处理后将跳转到本参数指定的URL页面
+
+            WeChatOAuth::getCode($redirect_uri, $state=1, $scope='snsapi_base');
+
+        5、通过code换取网页授权access_token(access_token网页版)。首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
+
+            参数:$code getCode()获取的code参数。$code = $_GET['code'];
+
+            WeChatOAuth::getAccessTokenAndOpenId($code);
+
+
+
+
+    六、多媒体上传下载
+
+        1、类简介:在网页中获取来访用户的数据。上传的多媒体文件有格式和大小限制,如下:
+
+            * 图片(image): 1M,支持JPG格式
+
+            * 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
+
+            * 视频(video):10MB,支持MP4格式
+
+            * 缩略图(thumb):64KB,支持JPG格式
+
+            * 媒体文件在后台保存时间为3天,即3天后media_id失效
+
+        2、使用命名空间:use LaneWeChat\Core\Media;
+
+        3、参数  $filename 上传的文件的绝对路径
+
+                $type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
+
+                $mediaId = "通过上传多媒体文件,得到的id。";
+
+                $groupId = '分组ID';                         在添加新分组、获取分组列表的时候可以得到
+
+        4、上传:上传后,微信服务器会返回一个mediaId。
+
+            Media::upload($filename, $type);
+
+        5、下载:根据mediaId下载一个多媒体文件。
+
+            Media::download($mediaId);
+
+
+
+    七、自定义菜单
+
+        1、类简介:添加自定义菜单。最多可以有三个一级菜单,每个一级菜单最多可以有五个菜单。一级菜单最多4个汉字,二级菜单最多7个汉字。创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
+
+            摘自微信官方网站:目前自定义菜单接口可实现两种类型按钮,如下:
+
+            click:
+
+                用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者,并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
+
+            view:
+
+                用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值	(即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
+
+            总结一下哦,就是微信的菜单分两种,一种是view型,就是你设置一个网址,点了这个菜单之后就跳到你设置的网址去了。另一种就是click型,你设置一个key,然后用户点击的时候会通过本框架唯一入口wechat.php发送一个消息类型为event的请求,在wechatrequest.lib.php文件下的eventClick方法中可以使用。
+
+        2、使用命名空间:use LaneWeChat\Core\Menu;
+
+        3、设置菜单:是所有的菜单数据全部发送一次,可不是每新增一个只发一个菜单。
+
+            Menu::setMenu($menuList);
+
+            $menuLis 是菜单列表,结构如下:
+
+            $menuList = array(
+
+                                array('id'=>'1', 'pid'=>'0', 'name'=>'顶级分类一', 'type'=>'', 'code'=>''),
+
+                                array('id'=>'2', 'pid'=>'1', 'name'=>'分类一子分类一', 'type'=>'2', 'code'=>'lane_wechat_menu_1_1'),
+
+                                array('id'=>'3', 'pid'=>'1', 'name'=>'分类一子分类二', 'type'=>'1', 'code'=>'http://www.lanecn.com'),
+
+                                array('id'=>'4', 'pid'=>'0', 'name'=>'顶级分类二', 'type'=>'1', 'code'=>'http://www.php.net/'),
+
+                                array('id'=>'5', 'pid'=>'0', 'name'=>'顶级分类三', 'type'=>'2', 'code'=>'lane_wechat_menu_3'),
+
+                            );
+
+            'id'是您的系统中对分类的唯一编号;
+
+            'pid'是该分类的上级分类,顶级分类则填写0;
+
+            'name'是分类名称;
+
+            'type'是菜单类型,数字1或者2,1是view类型,2是click类型,如果该分类下有子分类请务必留空;
+
+            'code'是view类型的URL或者click类型的自定义key,如果该分类下有子分类请务必留空。
+
+        4、获取微信菜单:获取到的是已经设置过的菜单列表,格式为Json,是微信服务器返回的原始数据。
+
+            Menu::getMenu();
+
+        5、删除微信菜单:将会删除设置过的所有菜单(一键清空)。
+
+            Menu::delMenu();
+
+
+
+
+实例示范:
+
+    1、通过网页授权获得用户信息
+
+        场景:用户点击了我的自定义菜单,或者我发送的文本消息中包含一个URL,用户打开了我的微信公众号的网页版,我需要获取用户的信息。
+
+        代码:
+
+        <?php
+            use LaneWeChat\Core\WeChatOAuth;
+            use LaneWeChat\Core\UserManage;
+
+            //第一步,获取CODE
+            WeChatOAuth::getCode('http://www.lanecn.com/index.php', 1, 'snsapi_base');
+            //此时页面跳转到了http://www.lanecn.com/index.php,code和state在GET参数中。
+            $code = $_GET['code'];
+            //第二步,获取access_token网页版
+            $openId = WeChatOAuth::getAccessTokenAndOpenId($code);
+            //第三步,获取用户信息
+            $userInfo = UserManage::getUserInfo($openId['openid']);
+        ?>
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/autoloader.php b/Extend/Vendor/LaneWeChat/autoloader.php
new file mode 100644
index 0000000..750b63c
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/autoloader.php
@@ -0,0 +1,36 @@
+<?php
+namespace LaneWeChat;
+/**
+ *
+ * 自动载入函数
+ * Created by Lane.
+ * User: lane
+ * Date: 14-10-15
+ * Time: 下午6:13
+ * E-mail: lixuan868686@163.com
+ * WebSite: http://www.lanecn.com
+ */
+class Autoloader{
+    const NAMESPACE_PREFIX = 'LaneWeChat\\';
+    /**
+     * 向PHP注册在自动载入函数
+     */
+    public static function register(){
+        spl_autoload_register(array(new self, 'autoload'));
+    }
+
+    /**
+     * 根据类名载入所在文件
+     */
+    public static function autoload($className){
+        $namespacePrefixStrlen = strlen(self::NAMESPACE_PREFIX);
+        if(strncmp(self::NAMESPACE_PREFIX, $className, $namespacePrefixStrlen) === 0){
+            $className = strtolower($className);
+            $filePath = str_replace('\\', DIRECTORY_SEPARATOR, substr($className, $namespacePrefixStrlen));
+            $filePath = realpath(__DIR__ . (empty($filePath) ? '' : DIRECTORY_SEPARATOR) . $filePath . '.lib.php');
+            if(file_exists($filePath)){
+                require_once $filePath;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/config.php b/Extend/Vendor/LaneWeChat/config.php
new file mode 100644
index 0000000..c36f0e6
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/config.php
@@ -0,0 +1,51 @@
+<?php
+namespace LaneWeChat;
+/**
+ * 系统主配置文件.
+ * @Created by Lane.
+ * @Author: lane
+ * @Mail lixuan868686@163.com
+ * @Date: 14-8-1
+ * @Time: 下午1:00
+ * @Blog: Http://www.lanecn.com
+ */
+//版本号
+define('LANEWECHAT_VERSION', '1.2.2');
+define('LANEWECHAT_VERSION_DATE', '2014-10-14');
+
+//微信公众平台相关
+define('WECHAT_TOKEN', 'weixin');
+define("WECHAT_APPID", 'wxe864803f7865d939');
+define("WECHAT_APPSECRET", '0c451f7c33881c22f067dc73847f0b67');
+define("WECHAT_URL", 'http://www.lanecn.com');
+
+////-----引入系统所需类库-------------------
+////引入错误消息类
+//include_once 'core/msg.lib.php';
+////引入错误码类
+//include_once 'core/msgconstant.lib.php';
+////引入CURL类
+//include_once 'core/curl.lib.php';
+//
+////-----------引入微信所需的基本类库----------------
+////引入微信处理中心类
+//include_once 'core/wechat.lib.php';
+////引入微信请求处理类
+//include_once 'core/wechatrequest.lib.php';
+////引入微信被动响应处理类
+//include_once 'core/responsepassive.lib.php';
+////引入微信access_token类
+//include 'core/accesstoken.lib.php';
+//
+////-----如果是认证服务号,需要引入以下类--------------
+////引入微信权限管理类
+//include_once 'core/wechatoauth.lib.php';
+////引入微信用户/用户组管理类
+//include_once 'core/usermanage.lib.php';
+////引入微信主动相应处理类
+//include_once 'core/responseinitiative.lib.php';
+////引入多媒体管理类
+//include_once 'core/media.lib.php';
+////引入自定义菜单类
+//include_once 'core/menu.lib.php';
+?>
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/config.yaml b/Extend/Vendor/LaneWeChat/config.yaml
new file mode 100644
index 0000000..e39f9c3
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/config.yaml
@@ -0,0 +1,2 @@
+name: 9173weixin
+version: 2
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/accesstoken.lib.php b/Extend/Vendor/LaneWeChat/core/accesstoken.lib.php
new file mode 100644
index 0000000..b6b71ba
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/accesstoken.lib.php
@@ -0,0 +1,67 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 微信Access_Token的获取与过期检查
+ * Created by Lane.
+ * User: lane
+ * Date: 13-12-29
+ * Time: 下午5:54
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class AccessToken{
+    public static function test(){
+        echo 'hello world';
+    }
+    /**
+     * 获取微信Access_Token
+     */
+    public static function getAccessToken(){
+        //检测本地是否已经拥有access_token,并且检测access_token是否过期
+        $accessToken = self::_checkAccessToken();
+        if($accessToken === false){
+            $accessToken = self::_getAccessToken();
+        }
+        return $accessToken['access_token'];
+    }
+
+    /**
+     * @descrpition 从微信服务器获取微信ACCESS_TOKEN
+     * @return Ambigous|bool
+     */
+    private function _getAccessToken(){
+        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.WECHAT_APPID.'&secret='.WECHAT_APPSECRET;
+        $accessToken = Curl::callWebServer($url, '', 'GET');
+        if(!isset($accessToken['access_token'])){
+            return Msg::returnErrMsg(MsgConstant::ERROR_GET_ACCESS_TOKEN, '获取ACCESS_TOKEN失败');
+        }
+        $accessToken['time'] = time();
+        $accessTokenJson = json_encode($accessToken);
+        //存入数据库
+        /**
+         * 这里通常我会把access_token存起来,然后用的时候读取,判断是否过期,如果过期就重新调用此方法获取,存取操作请自行完成
+         *
+         * 请将变量$accessTokenJson给存起来,这个变量是一个字符串
+         */
+
+        return $accessToken;
+    }
+
+    /**
+     * @descrpition 检测微信ACCESS_TOKEN是否过期
+     *              -10是预留的网络延迟时间
+     * @return bool
+     */
+    private static function _checkAccessToken(){
+        //获取access_token。是上面的获取方法获取到后存起来的。
+        $accessToken = YourDatabase::get('access_token');
+        if(!empty($accessToken['value'])){
+            $accessToken = json_decode($accessToken['value'], true);
+            if(time() - $accessToken['time'] < $accessToken['expires_in']-10){
+                return $accessToken;
+            }
+        }
+        return false;
+    }
+}
+?>
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/curl.lib.php b/Extend/Vendor/LaneWeChat/core/curl.lib.php
new file mode 100644
index 0000000..73ddf07
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/curl.lib.php
@@ -0,0 +1,159 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ *
+ * CURL工具
+ *
+ * Class Curl
+ * Created by Lane.
+ * @Author: lane
+ * @Mail: lixuan868686@163.com
+ * @Date: 14-1-10
+ * @Time: 下午4:22
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class Curl {
+	private static $_ch;
+	private static $_header;
+	private static $_body;
+	
+	private static $_cookie = array();
+    private static $_options = array();
+    private static $_url = array ();
+    private static $_referer = array ();
+
+    /**
+     * 调用外部url
+     * @param $queryUrl
+     * @param $param 参数
+     * @param string $method
+     * @return bool|mixed
+     */
+    public static function callWebServer($queryUrl, $param='', $method='get', $is_json=true, $is_urlcode=true) {
+        if (empty($queryUrl)) {
+            return false;
+        }
+        $method = strtolower($method);
+        $ret = '';
+        $param = empty($param) ? array() : $param;
+        self::_init();
+        if ($method == 'get') {
+            $ret = self::_httpGet($queryUrl, $param);
+        } elseif($method == 'post') {
+            $ret = self::_httpPost($queryUrl, $param, $is_urlcode);
+        }
+        if(!empty($ret)){
+            if($is_json){
+                return json_decode($ret, true);
+            }else{
+                return $ret;
+            }
+        }
+        return true;
+    }
+
+    private static function _init() {
+        self::$_ch = curl_init();
+
+        curl_setopt(self::$_ch, CURLOPT_HEADER, true);
+        curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, true);
+        //curl_setopt(self::$_ch, CURLOPT_FRESH_CONNECT, true);
+    }
+
+    public static function setOption($optArray=array()) {
+		foreach($optArray as $opt) {
+			curl_setopt(self::$_ch, $opt['key'], $opt['value']);
+		} 
+	}
+	
+	private static function _close() {
+		if (is_resource(self::$_ch)) {  
+            curl_close(self::$_ch);  
+        }
+        
+        return true;
+	}
+	
+	private static function _httpGet($url, $query=array()) {
+          
+        if (!empty($query)) {  
+            $url .= (strpos($url, '?') === false) ? '?' : '&';  
+            $url .= is_array($query) ? http_build_query($query) : $query;  
+        }  
+          
+        curl_setopt(self::$_ch, CURLOPT_URL, $url);
+        curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
+
+        $ret = self::_execute();
+        self::_close();
+        return $ret;  
+	}
+	
+	private static function _httpPost($url, $query=array(), $is_urlcode=true) {
+  		if (is_array($query)) {
+            foreach ($query as $key => $val) {  
+				if($is_urlcode){
+                    $encode_key = urlencode($key);
+                }else{
+                    $encode_key = $key;
+                }
+				if ($encode_key != $key) {  
+					unset($query[$key]);  
+				}
+                if($is_urlcode){
+                    $query[$encode_key] = urlencode($val);
+                }else{
+                    $query[$encode_key] = $val;
+                }
+
+            }  
+        }
+
+        curl_setopt(self::$_ch, CURLOPT_URL, $url);
+        curl_setopt(self::$_ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt(self::$_ch, CURLOPT_HEADER, 0);
+        curl_setopt(self::$_ch, CURLOPT_POST, true );
+        curl_setopt(self::$_ch, CURLOPT_POSTFIELDS, $query);
+        curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt(self::$_ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+
+          
+        $ret = self::_execute();
+        self::_close();
+        return $ret;  
+	}
+	
+	private static function _put($url, $query = array()) {
+		curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'PUT');  
+	
+		return self::_httpPost($url, $query);
+	}  
+
+	private static function _delete($url, $query = array()) {
+		curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'DELETE');  
+	
+		return self::_httpPost($url, $query);
+	}  
+
+	private static function _head($url, $query = array()) {
+		curl_setopt(self::$_ch, CURLOPT_CUSTOMREQUEST, 'HEAD');
+		
+		return self::_httpPost($url, $query);
+	}  
+	
+	private static function _execute() {
+		$response = curl_exec(self::$_ch);
+
+		$errno = curl_errno(self::$_ch);  
+
+		if ($errno > 0) {
+			throw new Exception(curl_error(self::$_ch), $errno);  
+		}
+
+		return  $response;
+	}
+}
+
+?>
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/media.lib.php b/Extend/Vendor/LaneWeChat/core/media.lib.php
new file mode 100644
index 0000000..319cb09
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/media.lib.php
@@ -0,0 +1,55 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 多媒体的上传与下载
+ * Created by Lane.
+ * User: lane
+ * Date: 14-8-11
+ * Time: 上午9:51
+ * E-mail: lixuan868686@163.com
+ * WebSite: http://www.lanecn.com
+ */
+class Media{
+    /**
+     * 多媒体上传。上传图片、语音、视频等文件到微信服务器,上传后服务器会返回对应的media_id,公众号此后可根据该media_id来获取多媒体。
+     * 上传的多媒体文件有格式和大小限制,如下:
+     * 图片(image): 1M,支持JPG格式
+     * 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
+     * 视频(video):10MB,支持MP4格式
+     * 缩略图(thumb):64KB,支持JPG格式
+     * 媒体文件在后台保存时间为3天,即3天后media_id失效。
+     *
+     * @param $filename,文件绝对路径
+     * @param $type, 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
+     * @return {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
+     */
+    public static function upload($filename, $type){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token='.$accessToken.'&type='.$type;
+        $data = array();
+        $data['media'] = $filename;
+        return Curl::callWebServer($queryUrl, $data, 'POST');
+    }
+
+    /**
+     * 下载多媒体文件
+     * @param $mediaId 多媒体ID
+     * @return 头信息如下
+     *
+     * HTTP/1.1 200 OK
+     * Connection: close
+     * Content-Type: image/jpeg
+     * Content-disposition: attachment; filename="MEDIA_ID.jpg"
+     * Date: Sun, 06 Jan 2013 10:20:18 GMT
+     * Cache-Control: no-cache, must-revalidate
+     * Content-Length: 339721
+     * curl -G "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
+     */
+    public static function download($mediaId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'http://file.api.weixin.qq.com/cgi-bin/media/get?access_token='.$accessToken.'&media_id='.$mediaId;
+        return Curl::callWebServer($queryUrl, '', 'GET');
+    }
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/menu.lib.php b/Extend/Vendor/LaneWeChat/core/menu.lib.php
new file mode 100644
index 0000000..bcd27ea
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/menu.lib.php
@@ -0,0 +1,122 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 自定义菜单
+ * Created by PhpStorm.
+ * User: lane
+ * Date: 14-8-17
+ * Time: 下午3:12
+ * E-mail: lixuan868686@163.com
+ * WebSite: http://www.lanecn.com
+ */
+class Menu{
+    /**
+     * 添加菜单,一级菜单最多3个,每个一级菜单最多可以有5个二级菜单
+     * @param $menuList
+     *          array(
+                    array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>),
+                    array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>),
+                    array('id'=>'', 'pid'=>'', 'name'=>'', 'type'=>'', 'code'=>),
+     *          );
+     *          'type'是菜单类型,数字1或者2,1是view类型,2是click类型
+     *          'code'是view类型的URL或者click类型的key
+     *
+     * @return bool
+     */
+    public function setMenu($menuList){
+        //树形排布
+        $menuList2 = $menuList;
+        foreach($menuList as $key=>$menu){
+            foreach($menuList2 as $k=>$menu2){
+                if($menu['id'] == $menu2['pid']){
+                    $menuList[$key]['sub_button'][] = $menu2;
+                    unset($menuList[$k]);
+                }
+            }
+        }
+        $typeView = 1;
+        $typeClick = 2;
+        //处理数据
+        foreach($menuList as $key=>$menu){
+            //处理type和code
+            if($menu['type'] == $typeView){
+                $menuList[$key]['type'] = 'view';
+                $menuList[$key]['url'] = $menu['code'];
+                //处理URL。因为URL不能在转换JSON时被转为UNICODE
+                $menuList[$key]['url'] = urlencode($menuList[$key]['url']);
+            }else if($menu['type'] == $typeClick){
+                $menuList[$key]['type'] = 'click';
+                $menuList[$key]['key'] = $menu['code'];
+            }
+            unset($menuList[$key]['code']);
+            //处理PID和ID
+            unset($menuList[$key]['id']);
+            unset($menuList[$key]['pid']);
+            //处理名字。因为汉字不能在转换JSON时被转为UNICODE
+            $menuList[$key]['name'] = urlencode($menu['name']);
+            //处理子类菜单
+            if(isset($menu['sub_button'])){
+                unset($menuList[$key]['type']);
+                foreach($menu['sub_button'] as $k=>$son){
+                    //处理type和code
+                    if($son['type'] == $typeView){
+                        $menuList[$key]['sub_button'][$k]['type'] = 'view';
+                        $menuList[$key]['sub_button'][$k]['url'] = $son['code'];
+                        $menuList[$key]['sub_button'][$k]['url'] = urlencode($menuList[$key]['sub_button'][$k]['url']);
+                    }else if($son['type'] == $typeClick){
+                        $menuList[$key]['sub_button'][$k]['type'] = 'click';
+                        $menuList[$key]['sub_button'][$k]['key'] = $son['code'];
+                    }
+                    unset($menuList[$key]['sub_button'][$k]['code']);
+                    //处理PID和ID
+                    unset($menuList[$key]['sub_button'][$k]['id']);
+                    unset($menuList[$key]['sub_button'][$k]['pid']);
+                    //处理名字。因为汉字不能在转换JSON时被转为UNICODE
+                    $menuList[$key]['sub_button'][$k]['name'] = urlencode($son['name']);
+                }
+            }
+        }
+        //整理格式
+        $data = array();
+        $menuList = array_values($menuList);
+        $data['button'] = $menuList;
+        //转换成JSON
+        $data = json_encode($data);
+        $data = urldecode($data);
+
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$accessToken;
+        $result = Curl::callWebServer($url, $data, 'POST');
+        if($result['errcode'] == 0){
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获取微信菜单
+     * @return bool|mixed
+     *
+     * 返回:{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"http://www.soso.com/","sub_button":[]},{"type":"view","name":"视频","url":"http://v.qq.com/","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}
+     */
+    public static function getMenu(){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$accessToken;
+        return Curl::callWebServer($url, '', 'GET');
+    }
+
+    /**
+     * 获取微信菜单
+     * @return bool|mixed
+     *
+     * 成功返回:{"errcode":0,"errmsg":"ok"}
+     */
+    public static function delMenu(){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$accessToken;
+        return Curl::callWebServer($url, '', 'GET');
+    }
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/msg.lib.php b/Extend/Vendor/LaneWeChat/core/msg.lib.php
new file mode 100644
index 0000000..1bbae84
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/msg.lib.php
@@ -0,0 +1,32 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ *
+ * 错误提示类
+ *
+ * Class Msg
+ * Created by Lane.
+ * @Author: lane
+ * @Mail: lixuan868686@163.com
+ * @Date: 14-1-10
+ * @Time: 下午4:22
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class Msg {
+	/**
+	 * 返回错误信息 ...
+	 * @param int $code 错误码
+	 * @param string $errorMsg 错误信息
+	 * @return Ambigous <multitype:unknown , multitype:, boolean>
+	 */
+	public static function returnErrMsg($code,  $errorMsg = null) {
+		$returnMsg = array('error_code' => $code);
+		if (!empty($errorMsg)) {
+			$returnMsg['custom_msg'] = $errorMsg;
+		}
+        $returnMsg['custom_msg'] = '出错啦!'.$returnMsg['custom_msg'];
+        exit($returnMsg['custom_msg']);
+	}
+}
+?>
diff --git a/Extend/Vendor/LaneWeChat/core/msgconstant.lib.php b/Extend/Vendor/LaneWeChat/core/msgconstant.lib.php
new file mode 100644
index 0000000..65d6791
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/msgconstant.lib.php
@@ -0,0 +1,37 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 错误码常量
+ * Created by Lane.
+ * @Class MsgConstant
+ * @Author: lane
+ * @Mail lixuan868686@163.com
+ * @Date: 14-1-10
+ * @Time: 下午4:22
+ */
+class MsgConstant{
+
+    //-------系统错误相关--101 到200 ------
+    const ERROR_SYSTEM = 101; //系统错误
+    const ERROR_NEWS_ITEM_COUNT_MORE_TEN = 102; //图文消息的项数超过10
+    const ERROR_MENU_CLICK = 103; //微信这个坑爹货,菜单跳转失败,请重试。
+    
+
+    //-------用户输入相关--1001到1100------
+    const ERROR_INPUT_ERROR = 1001; //输入有误,请重新输入
+    const ERROR_UNKNOW_TYPE = 1002; //收到了未知类型的消息
+    const ERROR_CAPTCHA_ERROR = 1003; //验证码错误
+    const ERROR_REQUIRED_FIELDS = 1004; //必填项未填写全
+
+    //-------远程调用相关--1201到1300------
+    const ERROR_REMOTE_SERVER_NOT_RESPOND = 1201; //远程服务器未响应
+    const ERROR_GET_ACCESS_TOKEN = 1202; //获取ACCESS_TOKEN失败
+
+    //-------文章管理相关--1301到1400------
+
+    //-------分类管理相关--1401到1500------
+    const ERROR_MENU_NOT_EXISTS = 1401; //菜单不存在
+
+    //-------文案类-----------------------
+    const ERROR_NO_BINDING_TEXT = '对不起,您尚未绑定微信,轻松绑定微信,即可查询实时流量,享受便捷服务!'; //未绑定微信时错误文案
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/responseinitiative.lib.php b/Extend/Vendor/LaneWeChat/core/responseinitiative.lib.php
new file mode 100644
index 0000000..40d3ef2
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/responseinitiative.lib.php
@@ -0,0 +1,188 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 发送主动响应
+ * Created by Lane.
+ * User: lane
+ * Date: 13-12-29
+ * Time: 下午5:54
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class ResponseInitiative{
+
+    protected static $queryUrl = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=';
+
+    protected static $action = 'POST';
+
+    /**
+     * @descrpition 文本
+     * @param $tousername
+     * @param $content 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
+     * @return string
+     */
+    public static function text($tousername, $content){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'text',
+            'text'=>array(
+                'content'=>$content,
+            ),
+        );
+        $template = json_encode($template);
+
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+    /**
+     * @descrpition 图片
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id。
+     * @return string
+     */
+    public static function image($tousername, $mediaId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'image',
+            'image'=>array(
+                'media_id'=>$mediaId,
+            ),
+        );
+        $template = json_encode($template);
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+    /**
+     * @descrpition 语音
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id
+     * @return string
+     */
+    public static function voice($tousername, $mediaId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'voice',
+            'voice'=>array(
+                'media_id'=>$mediaId,
+            ),
+        );
+        $template = json_encode($template);
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+    /**
+     * @descrpition 视频
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id
+     * @param $title 标题
+     * @param $description 描述
+     * @return string
+     */
+    public static function video($tousername, $mediaId, $title, $description){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'video',
+            'video'=>array(
+                'media_id'=>$mediaId,
+                'title'=>$title,
+                'description'=>$description,
+            ),
+        );
+        $template = json_encode($template);
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+    /**
+     * @descrpition 音乐
+     * @param $tousername
+     * @param $title 标题
+     * @param $description 描述
+     * @param $musicUrl 音乐链接
+     * @param $hqMusicUrl 高质量音乐链接,WIFI环境优先使用该链接播放音乐
+     * @param $thumbMediaId 缩略图的媒体id,通过上传多媒体文件,得到的id
+     * @return string
+     */
+    public static function music($tousername, $title, $description, $musicUrl, $hqMusicUrl, $thumbMediaId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'music',
+            'music'=>array(
+                'title'=>$title,
+                'description'=>$description,
+                'musicurl'=>$musicUrl,
+                'hqmusicurl'=>$hqMusicUrl,
+                'thumb_media_id'=>$thumbMediaId,
+            ),
+        );
+        $template = json_encode($template);
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+    /**
+     * @descrpition 图文消息 - 单个项目的准备工作,用于内嵌到self::news()中。现调用本方法,再调用self::news()
+     *              多条图文消息信息,默认第一个item为大图,注意,如果调用本方法得到的数组总项数超过10,则将会无响应
+     * @param $title 标题
+     * @param $description 描述
+     * @param $picUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
+     * @param $url 点击图文消息跳转链接
+     * @return string
+     */
+    public static function newsItem($title, $description, $picUrl, $url){
+        return $template = array(
+            'title'=>$title,
+            'description'=>$description,
+            'url'=>$picUrl,
+            'picurl'=>$url,
+        );
+    }
+
+    /**
+     * @descrpition 图文 - 先调用self::newsItem()再调用本方法
+     * @param $tousername
+     * @param $item 数组,每个项由self::newsItem()返回
+     * @return string
+     */
+    public static function news($tousername, $item){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        self::$queryUrl = self::$queryUrl.$accessToken;
+
+        //开始
+        $template = array(
+            'touser'=>$tousername,
+            'msgtype'=>'news',
+            'news'=>array(
+                'articles'=>$item
+            ),
+        );
+        $template = json_encode($template);
+        return Curl::callWebServer(self::$queryUrl, $template, self::$action);
+    }
+
+
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/responsepassive.lib.php b/Extend/Vendor/LaneWeChat/core/responsepassive.lib.php
new file mode 100644
index 0000000..6547cea
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/responsepassive.lib.php
@@ -0,0 +1,195 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 发送被动响应
+ * Created by Lane.
+ * User: lane
+ * Date: 13-12-19
+ * Time: 下午3:01
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+
+class ResponsePassive{
+    /**
+     * @descrpition 文本
+     * @param $fromusername
+     * @param $tousername
+     * @param $content 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function text($fromusername, $tousername, $content, $funcFlag=0){
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[text]]></MsgType>
+    <Content><![CDATA[%s]]></Content>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), $content, $funcFlag);
+    }
+
+    /**
+     * @descrpition 图片
+     * @param $fromusername
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id。
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function image($fromusername, $tousername, $mediaId, $funcFlag=0){
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[image]]></MsgType>
+    <Image>
+    <MediaId><![CDATA[%s]]></MediaId>
+    </Image>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), $mediaId, $funcFlag);
+    }
+
+    /**
+     * @descrpition 语音
+     * @param $fromusername
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function voice($fromusername, $tousername, $mediaId, $funcFlag=0){
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[voice]]></MsgType>
+    <Voice>
+    <MediaId><![CDATA[%s]]></MediaId>
+    </Voice>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), $mediaId, $funcFlag);
+    }
+
+    /**
+     * @descrpition 视频
+     * @param $fromusername
+     * @param $tousername
+     * @param $mediaId 通过上传多媒体文件,得到的id
+     * @param $title 标题
+     * @param $description 描述
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function video($fromusername, $tousername, $mediaId, $title, $description, $funcFlag=0){
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[video]]></MsgType>
+    <Video>
+    <MediaId><![CDATA[%s]]></MediaId>
+    <Title><![CDATA[%s]]></Title>
+    <Description><![CDATA[%s]]></Description>
+    </Video>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), $mediaId, $title, $description, $funcFlag);
+    }
+
+    /**
+     * @descrpition 音乐
+     * @param $fromusername
+     * @param $tousername
+     * @param $title 标题
+     * @param $description 描述
+     * @param $musicUrl 音乐链接
+     * @param $hqMusicUrl 高质量音乐链接,WIFI环境优先使用该链接播放音乐
+     * @param $thumbMediaId 缩略图的媒体id,通过上传多媒体文件,得到的id
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function music($fromusername, $tousername, $title, $description, $musicUrl, $hqMusicUrl, $thumbMediaId, $funcFlag=0){
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[music]]></MsgType>
+    <Music>
+    <Title><![CDATA[%s]]></Title>
+    <Description><![CDATA[%s]]></Description>
+    <MusicUrl><![CDATA[%s]]></MusicUrl>
+    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
+    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
+    </Music>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), $title, $description, $musicUrl, $hqMusicUrl, $thumbMediaId, $funcFlag);
+    }
+
+    /**
+     * @descrpition 图文消息 - 单个项目的准备工作,用于内嵌到self::news()中。现调用本方法,再调用self::news()
+     *              多条图文消息信息,默认第一个item为大图,注意,如果调用本方法得到的数组总项数超过10,则将会无响应
+     * @param $title 标题
+     * @param $description 描述
+     * @param $picUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
+     * @param $url 点击图文消息跳转链接
+     * @return string
+     */
+    public static function newsItem($title, $description, $picUrl, $url){
+        $template = <<<XML
+<item>
+  <Title><![CDATA[%s]]></Title>
+  <Description><![CDATA[%s]]></Description>
+  <PicUrl><![CDATA[%s]]></PicUrl>
+  <Url><![CDATA[%s]]></Url>
+</item>
+XML;
+        return sprintf($template, $title, $description, $picUrl, $url);
+    }
+
+    /**
+     * @descrpition 图文 - 先调用self::newsItem()再调用本方法
+     * @param $fromusername
+     * @param $tousername
+     * @param $item 数组,每个项由self::newsItem()返回
+     * @param $funcFlag 默认为0,设为1时星标刚才收到的消息
+     * @return string
+     */
+    public static function news($fromusername, $tousername, $item, $funcFlag=0){
+        //多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
+        if(count($item) >= 10){
+            $request = array('fromusername'=>$fromusername, 'tousername'=>$tousername);
+            return Msg::returnErrMsg(MsgConstant::ERROR_NEWS_ITEM_COUNT_MORE_TEN, '图文消息的项数不能超过10条', $request);
+
+        }
+        $template = <<<XML
+<xml>
+    <ToUserName><![CDATA[%s]]></ToUserName>
+    <FromUserName><![CDATA[%s]]></FromUserName>
+    <CreateTime>%s</CreateTime>
+    <MsgType><![CDATA[news]]></MsgType>
+    <ArticleCount>%s</ArticleCount>
+    <Articles>
+    %s
+    </Articles>
+    <FuncFlag>%s</FuncFlag>
+</xml>
+XML;
+        return sprintf($template, $fromusername, $tousername, time(), count($item), implode($item), $funcFlag);
+    }
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/usermanage.lib.php b/Extend/Vendor/LaneWeChat/core/usermanage.lib.php
new file mode 100644
index 0000000..19b8f17
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/usermanage.lib.php
@@ -0,0 +1,142 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 用户管理 类
+ * Created by Lane.
+ * Author: lane
+ * Date: 13-12-31
+ * Time: 上午10:48
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class UserManage{
+
+    //-----------------------------组--------------管-------------理----------------------
+
+    /**
+     * @descrpition 创建分组
+     * @param $groupName 组名 UTF-8
+     * @return JSON {"group": {"id": 107,"name": "test"}}
+     */
+    public static function createGroup($groupName){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/groups/create?access_token='.$accessToken;
+        $data = '{"group":{"name":"'.$groupName.'"}}';
+        return Curl::callWebServer($queryUrl, $data, 'POST');
+
+    }
+
+    /**
+     * @descrpition 获取分组列表
+     * @return JSON {"groups":[{"id": 0,"name": "未分组", "count": 72596}]}
+     */
+    public static function getGroupList(){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token='.$accessToken;
+        $data = '';
+        return Curl::callWebServer($queryUrl, $data, 'GET');
+
+    }
+
+    /**
+     * @descrpition 查询用户所在分组
+     * @param $openId 用户唯一OPENID
+     * @return JSON {"groupid": 102}
+     */
+    public static function getGroupByOpenId($openId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/groups/getid?access_token='.$accessToken;
+        $data = '{"openid":"'.$openId.'"}';
+        return Curl::callWebServer($queryUrl, $data, 'POST');
+
+    }
+
+    /**
+     * @descrpition 修改分组名
+     * @param $groupId 要修改的分组ID
+     * @param $groupName 新分组名
+     * @return JSON {"errcode": 0, "errmsg": "ok"}
+     */
+    public static function editGroupName($groupId, $groupName){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/groups/update?access_token='.$accessToken;
+        $data = '{"group":{"id":'.$groupId.',"name":"'.$groupName.'"}}';
+        return Curl::callWebServer($queryUrl, $data, 'POST');
+
+    }
+
+    /**
+     * @descrpition 移动用户分组
+     * @param $openid 要移动的用户OpenId
+     * @param $to_groupid 移动到新的组ID
+     * @return JSON {"errcode": 0, "errmsg": "ok"}
+     */
+    public static function editUserGroup($openid, $to_groupid){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token='.$accessToken;
+        $data = '{"openid":"'.$openid.'","to_groupid":'.$to_groupid.'}';
+        return Curl::callWebServer($queryUrl, $data, 'POST');
+
+    }
+
+    //-----------------------------用-------户-------管--------理----------------------
+
+    /**
+     * @descrpition 获取用户基本信息
+     * @param $openId 用户唯一OpenId
+     * @return JSON {
+                    "subscribe": 1,
+                    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
+                    "nickname": "Band",
+                    "sex": 1,          //用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
+                    "language": "zh_CN",
+                    "city": "广州",
+                    "province": "广东",
+                    "country": "中国",
+                    "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
+                    "subscribe_time": 1382694957
+                    }
+     */
+    public static function getUserInfo($openId){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        $queryUrl = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$accessToken.'&openid='.$openId;
+        $data = '';
+        return Curl::callWebServer($queryUrl, $data, 'GET');
+    }
+
+    /**
+     * @descrpition 获取关注者列表
+     * @param $next_openid 第一个拉取的OPENID,不填默认从头开始拉取
+     * @return JSON {"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
+     */
+    public static function getFansList($next_openid=''){
+        //获取ACCESS_TOKEN
+        $accessToken = AccessToken::getAccessToken();
+        if(empty($next_openid)){
+            $queryUrl = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$accessToken;
+        }else{
+            $queryUrl = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$accessToken.'&next_openid='.$next_openid;
+        }
+        $data = '';
+        return Curl::callWebServer($queryUrl, $data, 'GET');
+    }
+
+    /**
+     * @descrpition 获取网络状态
+     * @return String network_type:wifi wifi网络。network_type:edge 非wifi,包含3G/2G。network_type:fail 网络断开连接
+     */
+    public static function getNetworkState(){
+        echo "WeixinJSBridge.invoke('getNetworkType',{},
+		function(e){
+	    	WeixinJSBridge.log(e.err_msg);
+	    });";
+    }
+
+
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/wechat.lib.php b/Extend/Vendor/LaneWeChat/core/wechat.lib.php
new file mode 100644
index 0000000..148b759
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/wechat.lib.php
@@ -0,0 +1,115 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 微信公众平台来来路认证,处理中心,消息分发
+ * Created by Lane.
+ * Author: lane
+ * Date: 14-03-03
+ * Time: 上午10:20
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+class Wechat{
+
+    /**
+     * 调试模式,将错误通过文本消息回复显示
+     * @var boolean
+     */
+    private $debug;
+
+    /**
+     * 以数组的形式保存微信服务器每次发来的请求
+     * @var array
+     */
+    private $request;
+
+    /**
+     * 初始化,判断此次请求是否为验证请求,并以数组形式保存
+     * @param string $token 验证信息
+     * @param boolean $debug 调试模式,默认为关闭
+     */
+    public function __construct($token, $debug = FALSE) {
+        //未通过消息真假性验证
+       if ($this->isValid() && $this->validateSignature($token)) {
+            return $_GET['echostr'];
+        }
+
+        //是否打印错误报告
+        $this->debug = $debug;
+
+        //接受并解析微信中心POST发送XML数据
+        $xml = (array) simplexml_load_string($GLOBALS['HTTP_RAW_POST_DATA'], 'SimpleXMLElement', LIBXML_NOCDATA);
+
+        //将数组键名转换为小写
+        $this->request = array_change_key_case($xml, CASE_LOWER);
+    }
+
+    /**
+     * 判断此次请求是否为验证请求
+     * @return boolean
+     */
+    private function isValid() {
+        return isset($_GET['echostr']);
+    }
+
+    /**
+     * 判断验证请求的签名信息是否正确
+     * @param  string $token 验证信息
+     * @return boolean
+     */
+    private function validateSignature($token) {
+        $signature = $_GET['signature'];
+        $timestamp = $_GET['timestamp'];
+        $nonce = $_GET['nonce'];
+        $signatureArray = array($token, $timestamp, $nonce);
+        sort($signatureArray, SORT_STRING);
+        return sha1(implode($signatureArray)) == $signature;
+    }
+
+    /**
+     * 获取本次请求中的参数,不区分大小
+     * @param  string $param 参数名,默认为无参
+     * @return mixed
+     */
+    protected function getRequest($param = FALSE) {
+        if ($param === FALSE) {
+            return $this->request;
+        }
+        $param = strtolower($param);
+        if (isset($this->request[$param])) {
+            return $this->request[$param];
+        }
+        return NULL;
+    }
+
+    /**
+     * 分析消息类型,并分发给对应的函数
+     * @return void
+     */
+    public function run() {
+        return WechatRequest::switchType($this->request);
+    }
+
+    public function checkSignature()
+    {
+        $signature = $_GET["signature"];
+        $timestamp = $_GET["timestamp"];
+        $nonce = $_GET["nonce"];
+
+        $token = WECHAT_TOKEN;
+        $tmpArr = array($token, $timestamp, $nonce);
+        sort($tmpArr, SORT_STRING);
+        $tmpStr = implode( $tmpArr );
+        $tmpStr = sha1( $tmpStr );
+
+        if( $tmpStr == $signature ){
+            echo $_GET['echostr'];
+            return true;
+        }else{
+            return false;
+        }
+    }
+}
+
+
+
diff --git a/Extend/Vendor/LaneWeChat/core/wechatoauth.lib.php b/Extend/Vendor/LaneWeChat/core/wechatoauth.lib.php
new file mode 100644
index 0000000..a41998d
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/wechatoauth.lib.php
@@ -0,0 +1,77 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 微信OAuth2.0获取认证
+ * Created by lane.
+ * User: lane
+ * Date: 14-3-28
+ * Time: 下午1:55
+ * Mail lixuan868686@163.com
+ * Blog http://www.lanecn.com
+ */
+class WeChatOAuth{
+    /**
+     * Description: 获取CODE
+     * @param $scope snsapi_base不弹出授权页面,只能获得OpenId;snsapi_userinfo弹出授权页面,可以获得所有信息
+     * 将会跳转到redirect_uri/?code=CODE&state=STATE 通过GET方式获取code和state
+     */
+    public static function getCode($redirect_uri, $state=1, $scope='snsapi_base'){
+        if($redirect_uri[0] == '/'){
+            $redirect_uri = substr($redirect_uri, 1);
+        }
+        //公众号的唯一标识
+        $appid = WECHAT_APPID;
+        //授权后重定向的回调链接地址,请使用urlencode对链接进行处理
+        $redirect_uri = WECHAT_URL . $redirect_uri;
+        $redirect_uri = urlencode($redirect_uri);
+        //返回类型,请填写code
+        $response_type = 'code';
+        //构造请求微信接口的URL
+        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='.$appid.'&redirect_uri='.$redirect_uri.'&response_type='.$response_type.'&scope='.$scope.'&state='.$state.'#wechat_redirect';
+        header('Location: '.$url, true, 301);
+        //请求微信接口
+//        $result = Curl::callWebServer($url);
+//        return $result;
+    }
+
+
+    /**
+     * Description: 通过code换取网页授权access_token
+     * 首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。
+     * 公众号可通过下述接口来获取网页授权access_token。
+     * 如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
+     * @param $code getCode()获取的code参数
+     */
+    public static function getAccessTokenAndOpenId($code){
+        //公众号的唯一标识
+        $appid = WECHAT_APPID;
+        //公众号的appsecret
+        $secret = WECHAT_APPSECRET;
+        //填写为authorization_code
+        $grant_type = 'authorization_code';
+        //构造请求微信接口的URL
+        $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$secret.'&code='.$code.'&grant_type='.$grant_type.'';
+        //请求微信接口, Array(access_token, expires_in, refresh_token, openid, scope)
+        return Curl::callWebServer($url);
+    }
+
+    /**
+     * Description: 获取用户信息 通过 - snsapi_base。即不弹出授权认证
+     * @param $code getCode()获得,采用跳转方式,需要自行$_GET先获得
+     * @param Array
+     */
+    public static function getUserInfoBySnsapiBase($code, $uri){
+        //获取OpenId
+        $openId = self::getAccessTokenAndOpenId($code);
+        //如果code无效,则重新获取code
+        if(isset($openId['errcode']) && $openId['errcode']=40029){
+            WeChatOAuth::getCode($uri);
+        }
+        if(empty($openId['openid'])){
+            die('获取微信授权失败,请回到微信界面重新进入!无效openid');
+        }
+        $openId = $openId['openid'];
+        //根据OpenId获取用户信息
+        return UserManage::getUserInfo($openId);
+    }
+}
\ No newline at end of file
diff --git a/Extend/Vendor/LaneWeChat/core/wechatrequest.lib.php b/Extend/Vendor/LaneWeChat/core/wechatrequest.lib.php
new file mode 100644
index 0000000..a5468e3
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/core/wechatrequest.lib.php
@@ -0,0 +1,242 @@
+<?php
+namespace LaneWeChat\Core;
+/**
+ * 处理请求
+ * Created by Lane.
+ * User: lane
+ * Date: 13-12-19
+ * Time: 下午11:04
+ * Mail: lixuan868686@163.com
+ * Website: http://www.lanecn.com
+ */
+
+class WechatRequest{
+    /**
+     * @descrpition 分发请求
+     * @param $request
+     * @return array|string
+     */
+    public static function switchType(&$request){
+        $data = array();
+        switch ($request['msgtype']) {
+            //事件
+            case 'event':
+                switch ($request['event']) {
+                    //关注
+                    case 'subscribe':
+                        //二维码关注
+                        if(isset($request['eventkey']) && isset($request['ticket'])){
+                            $data = self::eventQrsceneSubscribe($request);
+                        //普通关注
+                        }else{
+                            $data = self::eventSubscribe($request);
+                        }
+                        break;
+                    //扫描二维码
+                    case 'scan':
+                        $data = self::eventScan($request);
+                        break;
+                    //地理位置
+                    case 'location':
+                    case 'LOCATION':
+                        $data = self::eventLocation($request);
+                        break;
+                    //自定义菜单
+                    case 'click':
+                    case 'CLICK':
+                        $data = self::eventClick($request);
+                        break;
+                    //取消关注
+                    case 'unsubscribe':
+                        $data = self::eventUnsubscribe($request);
+                        break;
+                    default:
+                        return Msg::returnErrMsg(MsgConstant::ERROR_UNKNOW_TYPE, '收到了未知类型的消息', $request);
+                        break;
+                }
+                break;
+            //文本
+            case 'text':
+                $data = self::text($request);
+                break;
+            //图像
+            case 'image':
+                $data = self::image($request);
+                break;
+            //语音
+            case 'voice':
+                $data = self::voice($request);
+                break;
+            //视频
+            case 'video':
+                $data = self::video($request);
+                break;
+            //位置
+            case 'location':
+                $data = self::location($request);
+                break;
+            //链接
+            case 'link':
+                $data = self::link($request);
+                break;
+            default:
+                return ResponsePassive::text($request['fromusername'], $request['tousername'], '收到未知的消息,我不知道怎么处理');
+                break;
+        }
+        return $data;
+    }
+
+
+    /**
+     * @descrpition 文本
+     * @param $request
+     * @return array
+     */
+    public static function text(&$request){
+        $content = '收到文本';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 图像
+     * @param $request
+     * @return array
+     */
+    public static function image(&$request){
+        $content = '收到图片';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 语音
+     * @param $request
+     * @return array
+     */
+    public static function voice(&$request){
+        $content = '收到语音';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 视频
+     * @param $request
+     * @return array
+     */
+    public static function video(&$request){
+        $content = '收到视频';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 地理
+     * @param $request
+     * @return array
+     */
+    public static function location(&$request){
+        $content = '收到上报的地理位置';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 链接
+     * @param $request
+     * @return array
+     */
+    public static function link(&$request){
+        $content = '收到连接';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 关注
+     * @param $request
+     * @return array
+     */
+    public static function eventSubscribe(&$request){
+        $content = '欢迎您关注我们的微信,将为您竭诚服务';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 取消关注
+     * @param $request
+     * @return array
+     */
+    public static function eventUnsubscribe(&$request){
+        $content = '为什么不理我了?';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 扫描二维码关注(未关注时)
+     * @param $request
+     * @return array
+     */
+    public static function eventQrsceneSubscribe(&$request){
+        $content = '欢迎您关注我们的微信,将为您竭诚服务';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 扫描二维码(已关注时)
+     * @param $request
+     * @return array
+     */
+    public static function eventScan(&$request){
+        $content = '您已经关注了哦~';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 上报地理位置
+     * @param $request
+     * @return array
+     */
+    public static function eventLocation(&$request){
+        $content = '收到上报的地理位置';
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 自定义菜单
+     * @param $request
+     * @return array
+     */
+    public static function eventClick(&$request){
+		//获取该分类的信息
+        $eventKey = $request['eventkey'];
+        $content = '收到点击菜单事件,您设置的key是' . $eventKey;
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+
+    /**
+     * @descrpition 接收用户回复,处理并返回发送
+     * @param $request
+     */
+    public function getUserChoice(&$request){
+            //发送图文列表
+            //图文列表逐条放入数组
+            $tuwenList = array();
+            $tuwenList[] = array(
+                'title' => '标题一',
+                'description' => '描述一',
+                'pic_url' => '图片URL地址',
+                'url' => '连接URL地址',
+            );
+            $tuwenList[] = array(
+                'title' => '标题二',
+                'description' => '',
+                'pic_url' => '',
+                'url' => '',
+            );
+            $item = array();
+            //构建图文列表
+            foreach($tuwenList as $tuwen){
+                $item[] = ResponsePassive::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
+            }
+            //发送图文列表
+            return ResponsePassive::news($request['fromusername'], $request['tousername'], $item);
+        //发送响应消息
+        return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
+    }
+}
diff --git a/Extend/Vendor/LaneWeChat/demo.php b/Extend/Vendor/LaneWeChat/demo.php
new file mode 100644
index 0000000..ff40f13
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/demo.php
@@ -0,0 +1,122 @@
+<?php
+namespace LaneWeChat;
+
+/**
+ * 主动给用户发送信息
+ */
+//命名空间
+use LaneWeChat\Core\ResponseInitiative;
+//需要发给谁?
+$tousername = "用户和公众号兑换的OpenId";
+$mediaId = "通过上传多媒体文件,得到的id。";
+//发送文本内容
+ResponseInitiative::text($tousername, '文本消息内容');
+//发送图片
+ResponseInitiative::image($tousername, $mediaId);
+//发送语音
+ResponseInitiative::voice($tousername, $mediaId);
+//发送视频
+ResponseInitiative::video($tousername, $mediaId, '视频描述', '视频标题');
+//发送地理位置
+ResponseInitiative::music($tousername, '音乐标题', '音乐描述', '音乐链接', '高质量音乐链接,WIFI环境优先使用该链接播放音乐', '缩略图的媒体id,通过上传多媒体文件,得到的id');
+//发送图文消息
+//创建图文消息内容
+$tuwenList[] = array('title'=>'标题1', 'description'=>'描述1', 'pic_url'=>'图片URL1', 'url'=>'点击跳转URL1');
+$tuwenList[] = array('title'=>'标题2', 'description'=>'描述2', 'pic_url'=>'图片URL2', 'url'=>'点击跳转URL2');
+//构建图文消息格式
+$itemList = array();
+foreach($tuwenList as $tuwen){
+    $itemList[] = ResponseInitiative::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
+}
+ResponseInitiative::news($tousername, $itemList);
+
+
+/**
+ * 被动发送消息
+ */
+//命名空间
+use LaneWeChat\Core\ResponsePassive;
+//需要发给谁?
+$fromusername = "谁发给你的?(用户的openId)";
+$tousername = "你的公众号Id";
+$mediaId = "通过上传多媒体文件,得到的id。";
+//发送文本
+ResponsePassive::text($fromusername, $tousername, '文本消息内容');
+//发送图片
+ResponsePassive::image($fromusername, $tousername, $mediaId);
+//发送语音
+ResponsePassive::voice($fromusername, $tousername, $mediaId);
+//发送视频
+ResponsePassive::video($fromusername, $tousername, $mediaId, '视频标题', '视频描述');
+//发送音乐
+ResponsePassive::music($fromusername, $tousername, '音乐标题', '音乐描述', '音乐链接', '高质量音乐链接,WIFI环境优先使用该链接播放音乐', '缩略图的媒体id,通过上传多媒体文件,得到的id');
+//发送图文
+//创建图文消息内容
+$tuwenList[] = array('title'=>'标题1', 'description'=>'描述1', 'pic_url'=>'图片URL1', 'url'=>'点击跳转URL1');
+$tuwenList[] = array('title'=>'标题2', 'description'=>'描述2', 'pic_url'=>'图片URL2', 'url'=>'点击跳转URL2');
+//构建图文消息格式
+$itemList = array();
+foreach($tuwenList as $tuwen){
+    $itemList[] = ResponsePassive::newsItem($tuwen['title'], $tuwen['description'], $tuwen['pic_url'], $tuwen['url']);
+}
+ResponsePassive::news($fromusername, $tousername, $itemList);
+
+
+/**
+ * 用户管理
+ */
+//命名空间
+use LaneWeChat\Core\UserManage;
+$openId = '用户和微信公众号的唯一ID';
+//----分组管理----
+//创建分组
+UserManage::createGroup('分组名');
+//获取分组列表
+UserManage::getGroupList();
+//查询用户所在分组
+UserManage::getGroupByOpenId($openId);
+//修改分组名
+UserManage::editGroupName('分组Id', '新的组名');
+//移动用户分组
+UserManage::editUserGroup($openId, '新的分组ID');
+//---用户管理----
+//获取用户基本信息
+UserManage::getUserInfo($openId);
+//获取关注者列表
+UserManage::getFansList($next_openId='');
+//获取网络状态
+UserManage::getNetworkState();
+
+/**
+ * 网页授权
+ */
+//命名空间
+use LaneWeChat\Core\WeChatOAuth;
+/**
+ * Description: 获取CODE
+ * @param $scope snsapi_base不弹出授权页面,只能获得OpenId;snsapi_userinfo弹出授权页面,可以获得所有信息
+ * 将会跳转到redirect_uri/?code=CODE&state=STATE 通过GET方式获取code和state
+ */
+$redirect_uri = '获取CODE时,发送请求和参数给微信服务器,微信服务器会处理后将跳转到本参数指定的URL页面';
+WeChatOAuth::getCode($redirect_uri, $state=1, $scope='snsapi_base');
+/**
+ * Description: 通过code换取网页授权access_token
+ * 首先请注意,这里通过code换取的网页授权access_token,与基础支持中的access_token不同。
+ * 公众号可通过下述接口来获取网页授权access_token。
+ * 如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。
+ * @param $code getCode()获取的code参数
+ */
+$code = $_GET['code'];
+WeChatOAuth::getAccessTokenAndOpenId($code);
+
+/**
+ * Description: 获取用户信息 通过 - snsapi_base。即不弹出授权认证
+ * @param $code getCode()获得,采用跳转方式,需要自行$_GET先获得
+ */
+$code = $_GET['code'];
+WeChatOAuth::getUserInfoBySnsapiBase($code, $redirect_uri='CODE不存在时需要传给getCode()的参数中的$redirect_uri');
+
+//上传多媒体
+Media::upload($filename, $type);
+//下载多媒体
+Media::download($mediaId);
diff --git a/Extend/Vendor/LaneWeChat/wechat.php b/Extend/Vendor/LaneWeChat/wechat.php
new file mode 100644
index 0000000..0b825d7
--- /dev/null
+++ b/Extend/Vendor/LaneWeChat/wechat.php
@@ -0,0 +1,29 @@
+<?php
+namespace LaneWeChat;
+
+use LaneWeChat\Core\Wechat;
+
+/**
+ * 微信插件唯一入口文件.
+ * @Created by Lane.
+ * @Author: lane
+ * @Mail lixuan868686@163.com
+ * @Date: 14-1-10
+ * @Time: 下午4:00
+ * @Blog: Http://www.lanecn.com
+ */
+//引入配置文件
+include_once __DIR__.'/config.php';
+//引入自动载入函数
+include_once __DIR__.'/autoloader.php';
+//调用自动载入函数
+AutoLoader::register();
+
+//初始化微信类
+$wechat = new WeChat(WECHAT_TOKEN, TRUE);
+
+//首次使用需要注视掉下面这1行(21行),并打开最后一行(24行)
+echo $wechat->run();
+
+//首次使用需要打开下面这一行(24行),并且注释掉上面1行(21行)。本行用来验证URL
+//$wechat->checkSignature();
\ No newline at end of file