浏览代码

公众号类:
1、增加 事件类型 常量的定义
2、增加 卡券 相关的系列接口及事件推送(主要参考 @CheerChen的github项目更新、官方卡券开发文档)
3、修正、增加少量的注释
4、被动接口 music() 方法,增加$thumbmediaid参数

企业号类:
1、增加 事件类型 常量的定义
2、修正 getRevEvent() 方法 由于空EventKey值可能出现的小问题

错误码类:
1、增加 2个 错误信息记录

demo.php文件:
1、修正对valid()方法的注释

README.md文档:
1、增加 公众号类-被动接口方法 的说明
2、增加 公众号类-预定义常量列表 的说明
3、增加 企业号类-预定义常量列表 的说明
4、修改 公众号类 调用示例的备注说明

binsee 10 年之前
父节点
当前提交
9a17f85c87
共有 10 个文件被更改,包括 1859 次插入381 次删除
  1. 133 9
      README.md
  2. 744 152
      Thinkphp/Wechat.class.php
  3. 41 27
      Thinkphp/qywechat.class.php
  4. 1 1
      demo.php
  5. 5 3
      errCode.php
  6. 3 3
      qyerrCode.php
  7. 41 27
      qywechat.class.php
  8. 747 152
      wechat.class.php
  9. 34 3
      wiki/企业号API类库.md
  10. 110 4
      wiki/官方API类库.md

+ 133 - 9
README.md

@@ -50,6 +50,7 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 - 支付订单查询 **(支付权限) **
 - 高级群发**(认证权限)**
 - 模板消息(设置所属行业、添加模板、发送模板消息)**(服务号、认证权限) **
+- 卡券管理(创建、修改、删除、发放、门店管理等)**(认证权限) **
 - 语义理解**(服务号、认证权限) **
 - 获取微信服务器IP列表**(初级权限) **
 > 备注:
@@ -59,8 +60,6 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 > 支付权限:仅认证后的服务号可以申请此权限
 
 
-
-
 ### 初始化动作 
 ```php
  $options = array(
@@ -74,10 +73,89 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 	);
  $weObj = new Wechat($options); //创建实例对象
  //TODO:调用$weObj各实例方法
+```
+
+### 被动接口方法:   
+* valid() 验证连接,被动接口处于加密模式时必须调用
+* 
+* getRev() 获取微信服务器发来信息(不返回结果),被动接口必须调用
+* getRevData() 返回微信服务器发来的信息(数组)
+* getRevFrom()  返回消息发送者的userid
+* getRevTo()  返回消息接收者的id(即公众号id)
+* getRevType() 返回接收消息的类型
+* getRevID() 返回消息id
+* getRevCtime() 返回消息发送事件
+* getRevContent() 返回消息内容正文或语音识别结果(文本型)
+* getRevPic() 返回图片信息(图片型信息) 返回数组{'mediaid'=>'','picurl'=>''}
+* getRevLink() 接收消息链接(链接型信息) 返回数组{'url'=>'','title'=>'','description'=>''}
+* getRevGeo() 返回地理位置(位置型信息) 返回数组{'x'=>'','y'=>'','scale'=>'','label'=>''}
+* getRevEventGeo() 返回事件地理位置(事件型信息) 返回数组{'x'=>'','y'=>'','precision'=>''}
+* getRevEvent() 返回事件类型(事件型信息) 返回数组{'event'=>'','key'=>''}
+* getRevScanInfo() 获取自定义菜单的扫码推事件信息,事件类型为`scancode_push`或`scancode_waitmsg` 返回数组array ('ScanType'=>'qrcode','ScanResult'=>'123123')
+* getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明
+* getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送,事件类型为`location_select` 数组结构见php文件内方法说明
+* getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
+* getRevVideo() 返回视频信息(视频型信息) 返回数组{'mediaid'=>'','thumbmediaid'=>''}
+* getRevTicket() 返回接收TICKET(扫描带参数二维码,关注或SCAN事件) 返回二维码的ticket值
+* getRevSceneId() 返回二维码的场景值(扫描带参数二维码的关注事件) 返回二维码的参数值
+* getRevTplMsgID() 返回主动推送的消息ID(群发或模板消息事件) 返回MsgID值
+* getRevStatus() 返回模板消息发送状态(模板消息事件) 返回文本:success(成功)|failed:user block(用户拒绝接收)|failed: system failed(发送失败(非用户拒绝))
+* getRevResult() 返回群发或模板消息发送结果(群发或模板消息事件) 返回数组,内容依事件类型而不同,参考开发文档中群发、模板消息推送事件
+* getRevKFCreate() 返回多客服-接入会话的客服账号(多客服-接入会话事件) 返回文本型
+* getRevKFClose() 返回多客服-处理会话的客服账号(多客服-接入会话事件) 返回文本型
+* getRevKFSwitch() 返回多客服-转接会话信息(多客服-转接会话事件) 返回数组	{'FromKfAccount' => '','ToKfAccount' => ''}
+* getRevCardPass() 返回卡券-审核通过的卡券ID(卡券-卡券审核事件) 返回文本型
+* getRevCardGet() 返回卡券-用户领取卡券的相关信息(卡券-领取卡券事件) 返回数组{'CardId' => '','IsGiveByFriend' => '','UserCardCode' => ''}
+* getRevCardDel() 返回卡券-用户删除卡券的相关信息(卡券-删除卡券事件) 返回数组{'CardId' => '','UserCardCode' => ''}
+* 
+* text($text) 设置文本型消息,参数:文本内容
+* image($mediaid) 设置图片型消息,参数:图片的media_id
+* voice($mediaid) 设置语音型消息,参数:语音的media_id
+* video($mediaid='',$title,$description) 设置视频型消息,参数:视频的media_id、标题、摘要
+* music($title,$desc,$musicurl,$hgmusicurl='',$thumbmediaid='') 设置回复音乐,参数:音乐标题、音乐描述、音乐链接、高音质链接、缩略图的媒体id
+* news($newsData) 设置图文型消息,参数:数组。数组结构见php文件内方法说明
+* image($mediaid) 设置图片型消息,参数:图片的media_id
+* Message($msg = '',$append = false) 设置发送的消息(一般不需要调用这个方法)
+* transfer_customer_service($customer_account = '') 转接多客服,如不指定客服可不提供参数,参数:指定客服的账号
+* reply() 将以上已经设置好的消息,回复给微信服务器
 
+### 预定义常量列表:
+```php
+////消息类型,使用实例调用getRevType()方法取得
+	const MSGTYPE_TEXT = 'text';
+	const MSGTYPE_IMAGE = 'image';
+	const MSGTYPE_LOCATION = 'location';
+	const MSGTYPE_LINK = 'link';
+	const MSGTYPE_EVENT = 'event';
+	const MSGTYPE_MUSIC = 'music';
+	const MSGTYPE_NEWS = 'news';
+	const MSGTYPE_VOICE = 'voice';
+	const MSGTYPE_VIDEO = 'video';
+////事件类型,使用实例调用getRevEvent()方法取得
+	const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+	const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+	const EVENT_SCAN = 'SCAN';                 //扫描带参数二维码
+	const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+	const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+	const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+	const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+	const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+	const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+	const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+	const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+	const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+	const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+	const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
+	const EVENT_KF_SEESION_CREATE = 'kfcreatesession';  //多客服 - 接入会话
+	const EVENT_KF_SEESION_CLOSE = 'kfclosesession';    //多客服 - 关闭会话
+	const EVENT_KF_SEESION_SWITCH = 'kfswitchsession';  //多客服 - 转接会话
+	const EVENT_CARD_PASS = 'card_pass_check';          //卡券 - 审核通过
+	const EVENT_CARD_NOTPASS = 'card_not_pass_check';   //卡券 - 审核未通过
+	const EVENT_CARD_USER_GET = 'user_get_card';        //卡券 - 用户领取卡券
+	const EVENT_CARD_USER_DEL = 'user_del_card';        //卡券 - 用户删除卡券
 ```
 
-### 新增Auth高级权限类方法:   
+### 主动接口方法:   
  *  checkAuth($appid,$appsecret,$token) 此处传入公众后台高级接口提供的appid和appsecret, 或者手动指定$token为access_token。函数将返回access_token操作令牌
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
@@ -134,6 +212,25 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
  *  deleteKFAccount($account) 删除客服账号
  *  setKFHeadImg($account,$imgfile) 上传客服头像
  *  querySemantic($uid,$query,$category,$latitude=0,$longitude=0,$city="",$region="") 语义理解接口 参数含义及返回的json内容请查看 **[微信语义理解接口](http://mp.weixin.qq.com/wiki/index.php?title=语义理解)**
+ *  createCard($data) 创建卡券
+ *  updateCard($data) 修改卡券
+ *  delCard($card_id) 删除卡券
+ *  getCardInfo($card_id) 查询卡券详情
+ *  getCardColors() 获取颜色列表
+ *  getCardLocations() 拉取门店列表
+ *  addCardLocations($data) 批量导入门店信息
+ *  createCardQrcode($card_id) 生成卡券二维码
+ *  consumeCardCode($code) 消耗 code
+ *  decryptCardCode($encrypt_code) code 解码
+ *  checkCardCode($code) 获取 code 的有效性
+ *  getCardIdList($data) 批量查询卡列表
+ *  updateCardCode($code,$code_id,$new_code) 更改 code
+ *  unavailableCardCode($code) 设置卡券失效**(不可逆)**
+ *  modifyCardStock($data) 库存修改
+ *  activateMemberCard($data) 激活/绑定会员卡,参数结构请参看卡券开发文档(6.1.1 激活/绑定会员卡)章节
+ *  updateMemberCard($data) 会员卡交易,参数结构请参看卡券开发文档(6.1.2 会员卡交易)章节
+ *  updateLuckyMoney($code,$balance,$card_id='') 更新红包金额
+ *  setCardTestWhiteList($openid=array(),$user=array()) 设置卡券测试白名单
  
  
 ## 2. wechatext.class.php 非官方扩展API  
@@ -249,9 +346,9 @@ $options = array(
 ```
 
 ### 被动接口方法:   
-* valid() 验证连接
+* valid() 验证连接,被动接口必须调用
 * 
-* getRev() 获取微信服务器发来信息(不返回结果)
+* getRev() 获取微信服务器发来信息(不返回结果),被动接口必须调用
 * getRevData() 返回微信服务器发来的信息(数组)
 * getRevPostXml() 返回微信服务器发来的原始加密xml信息
 * getRevFrom()  返回消息发送者的userid
@@ -269,7 +366,6 @@ $options = array(
 * getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明
 * getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送,事件类型为`location_select` 数组结构见php文件内方法说明
 * getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
-* getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
 * getRevVideo() 返回视频信息(视频型信息) 返回数组{'mediaid'=>'','thumbmediaid'=>''}
 * 
 * text($text) 设置文本型消息,参数:文本内容
@@ -280,6 +376,35 @@ $options = array(
 * image($mediaid) 设置图片型消息,参数:图片的media_id
 * Message($msg = '',$append = false) 设置发送的消息(一般不需要调用这个方法)
 * reply() 将已经设置好的消息,回复给微信服务器
+  
+### 预定义常量列表:
+```php
+////消息类型,使用实例调用getRevType()方法取得
+    const MSGTYPE_TEXT = 'text';
+    const MSGTYPE_IMAGE = 'image';
+    const MSGTYPE_LOCATION = 'location';
+    const MSGTYPE_LINK = 'link';    //暂不支持
+    const MSGTYPE_EVENT = 'event';
+    const MSGTYPE_MUSIC = 'music';    //暂不支持
+    const MSGTYPE_NEWS = 'news';
+    const MSGTYPE_VOICE = 'voice';
+    const MSGTYPE_VIDEO = 'video';
+////事件类型,使用实例调用getRevEvent()方法取得
+    const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+    const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+    const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+    const EVENT_ENTER_AGENT = 'enter_agent';   //用户进入应用
+    const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+    const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+    const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+    const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+    const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+    const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+    const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+    const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+    const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+    const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
+```
 
 ### 主动接口方法:
 * checkAuth($appid='',$appsecret='',$token='') 通用auth验证方法,也用来换取ACCESS_TOKEN 。仅在需要手动指定access_token时才用`$token`
@@ -314,8 +439,7 @@ $options = array(
 * sendMessage($data) 主动发送信息接口,参数请看php文件内方法说明
 * authSucc($userid) 二次验证,参数: 员工UserID
 * getOauthRedirect($callback,$state='STATE',$scope='snsapi_base') 组合授权跳转接口url
-  
-  
+
 # 调用示例
 ----------
 
@@ -327,7 +451,7 @@ $options = array(
 		'token'=>'tokenaccesskey' //填写你设定的key
 	);
 $weObj = new Wechat($options);
-$weObj->valid(); //注意, 应用验证通过后,可将此句注释掉, 但会降低网站安全性
+$weObj->valid();//明文或兼容模式可以在接口验证通过后注释此句,但加密模式一定不能注释,否则会验证失败
 $type = $weObj->getRev()->getRevType();
 switch($type) {
 	case Wechat::MSGTYPE_TEXT:

文件差异内容过多而无法显示
+ 744 - 152
Thinkphp/Wechat.class.php


+ 41 - 27
Thinkphp/qywechat.class.php

@@ -27,6 +27,20 @@ class Wechat
     const MSGTYPE_NEWS = 'news';
     const MSGTYPE_VOICE = 'voice';
     const MSGTYPE_VIDEO = 'video';
+    const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+    const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+    const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+    const EVENT_ENTER_AGENT = 'enter_agent';   //用户进入应用
+    const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+    const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+    const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+    const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+    const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+    const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+    const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+    const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+    const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+    const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
     const API_URL_PREFIX = 'https://qyapi.weixin.qq.com/cgi-bin';
     const USER_CREATE_URL = '/user/create?';
     const USER_UPDATE_URL = '/user/update?';
@@ -47,7 +61,7 @@ class Wechat
     const TAG_GET_URL = '/tag/get?';
     const TAG_ADDUSER_URL = '/tag/addtagusers?';
     const TAG_DELUSER_URL = '/tag/deltagusers?';
-    const TAG_LIST_URL = '/tag/list?';    
+    const TAG_LIST_URL = '/tag/list?';
     const MEDIA_UPLOAD_URL = '/media/upload?';
     const MEDIA_GET_URL = '/media/get?';
     const AUTHSUCC_URL = '/user/authsucc?';
@@ -67,7 +81,7 @@ class Wechat
 	private $access_token;
     private $agentid;       //应用id   AgentID
 	private $postxml;
-    private $agentidxml;    //接收的应用id   AgentID	
+    private $agentidxml;    //接收的应用id   AgentID
 	private $_msg;
 	private $_receive;
 	private $_sendmsg;      //主动发送消息的内容
@@ -378,7 +392,7 @@ class Wechat
 	public function getRevFrom() {
 		if (isset($this->_receive['FromUserName']))
 			return $this->_receive['FromUserName'];
-		else 
+		else
 			return false;
 	}
 	
@@ -388,7 +402,7 @@ class Wechat
 	public function getRevTo() {
 		if (isset($this->_receive['ToUserName']))
 			return $this->_receive['ToUserName'];
-		else 
+		else
 			return false;
 	}
 	
@@ -398,7 +412,7 @@ class Wechat
 	public function getRevAgentID() {
 		if (isset($this->_receive['AgentID']))
 			return $this->_receive['AgentID'];
-		else 
+		else
 			return false;
 	}
 
@@ -408,7 +422,7 @@ class Wechat
 	public function getRevType() {
 		if (isset($this->_receive['MsgType']))
 			return $this->_receive['MsgType'];
-		else 
+		else
 			return false;
 	}
 	
@@ -418,7 +432,7 @@ class Wechat
 	public function getRevID() {
 		if (isset($this->_receive['MsgId']))
 			return $this->_receive['MsgId'];
-		else 
+		else
 			return false;
 	}
 	
@@ -428,7 +442,7 @@ class Wechat
 	public function getRevCtime() {
 		if (isset($this->_receive['CreateTime']))
 			return $this->_receive['CreateTime'];
-		else 
+		else
 			return false;
 	}
 	
@@ -451,7 +465,7 @@ class Wechat
 				'mediaid'=>$this->_receive['MediaId'],
 				'picurl'=>(string)$this->_receive['PicUrl'],    //防止picurl为空导致解析出错
 			);
-		else 
+		else
 			return false;
 	}
 	
@@ -466,7 +480,7 @@ class Wechat
 				'scale'=>(string)$this->_receive['Scale'],
 				'label'=>(string)$this->_receive['Label']
 			);
-		} else 
+		} else
 			return false;
 	}
 	
@@ -491,7 +505,7 @@ class Wechat
 		if (isset($this->_receive['Event'])){
 			$array['event'] = $this->_receive['Event'];
 		}
-		if (isset($this->_receive['EventKey'])){
+		if (isset($this->_receive['EventKey']) && !empty($this->_receive['EventKey'])){
 			$array['key'] = $this->_receive['EventKey'];
 		}
 		if (isset($array) && count($array) > 0) {
@@ -621,7 +635,7 @@ class Wechat
 				'mediaid'=>$this->_receive['MediaId'],
 				'format'=>$this->_receive['Format'],
 			);
-		} else 
+		} else
 			return false;
 	}
 	
@@ -716,7 +730,7 @@ class Wechat
 	
 	/**
 	 * 设置回复图文
-	 * @param array $newsData 
+	 * @param array $newsData
 	 * 数组结构:
 	 *  array(
 	 *  	"0"=>array(
@@ -766,7 +780,7 @@ class Wechat
 	}
 
 	/**
-	 * 
+	 *
 	 * 回复微信服务器, 此函数支持链式操作
 	 * Example: $this->text('msg tips')->reply();
 	 * @param string $msg 要发送的信息, 默认取$this->_msg
@@ -774,7 +788,7 @@ class Wechat
 	 */
 	public function reply($msg=array(),$return = false)
 	{
-		if (empty($msg)) 
+		if (empty($msg))
 			$msg = $this->_msg;
 		$xmldata=  $this->xml_encode($msg);
 		$this->log($xmldata);
@@ -800,7 +814,7 @@ class Wechat
 			echo $smsg;
 		    return true;
 		    
-		}else 
+		}else
 		    return false;
 	}
 
@@ -1067,7 +1081,7 @@ class Wechat
 	 * {
  	 *   "errcode": 0,        //返回码
 	 *   "errmsg": "created",  //对返回码的文本描述内容
- 	 *   "id": 2               //创建的部门id。 
+ 	 *   "id": 2               //创建的部门id。
 	 * }
 	 */
 	public function createDepartment($data){
@@ -1705,29 +1719,29 @@ class Wechat
 	 *         "safe":"0"			//是否为保密消息,对于news无效
 	 *         "agentid" => "001",	//应用id
 	 *         "msgtype" => "text",  //根据信息类型,选择下面对应的信息结构体
-	 * 
+	 *
 	 *         "text" => array(
 	 *                 "content" => "Holiday Request For Pony(http://xxxxx)"
 	 *         ),
-	 * 
+	 *
 	 *         "image" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         "voice" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         " video" => array(
 	 *                 "media_id" => "MEDIA_ID",
 	 *                 "title" => "Title",
 	 *                 "description" => "Description"
 	 *         ),
-	 * 
+	 *
 	 *         "file" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         "news" => array(			//不支持保密
 	 *                 "articles" => array(    //articles  图文消息,一个图文消息支持1到10个图文
 	 *                     array(
@@ -1739,7 +1753,7 @@ class Wechat
 	 *                     ),
 	 *                 )
 	 *         ),
-	 * 
+	 *
 	 *         "mpnews" => array(
 	 *                 "articles" => array(    //articles  图文消息,一个图文消息支持1到10个图文
 	 *                     array(
@@ -1755,7 +1769,7 @@ class Wechat
 	 *         )
 	 * )
 	 * 请查看官方开发文档中的 发送消息 -> 消息类型及数据格式
-	 * 
+	 *
 	 * @return boolean|array
 	 * 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;
 	 * 如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分。
@@ -1789,7 +1803,7 @@ class Wechat
 	 * 当员工绑定通讯录中的帐号后,会收到一条图文消息,
 	 * 引导员工到企业的验证页面验证身份,企业在员工验证成功后,
 	 * 调用如下接口即可让员工关注成功。
-	 * 
+	 *
 	 * @param $userid
 	 * @return boolean|array 成功返回结果
 	 * {
@@ -1900,7 +1914,7 @@ class Prpcrypt
 
         try {
             //获得16位随机字符串,填充到明文之前
-            $random = $this->getRandomStr();//"aaaabbbbccccdddd"; 
+            $random = $this->getRandomStr();//"aaaabbbbccccdddd";
             $text = $random . pack("N", strlen($text)) . $text . $appid;
             // 网络字节序
             $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

+ 1 - 1
demo.php

@@ -4,7 +4,7 @@ $options = array(
 		'token'=>'tokenaccesskey' //填写你设定的key
 	);
 $weObj = new Wechat($options);
-$weObj->valid();
+$weObj->valid();//明文或兼容模式可以在接口验证通过后注释此句,但加密模式一定不能注释,否则会验证失败
 $type = $weObj->getRev()->getRevType();
 switch($type) {
 	case Wechat::MSGTYPE_TEXT:

+ 5 - 3
errCode.php

@@ -6,9 +6,9 @@
  *  @version 1.0
  *  usage:
  *      $ret=ErrCode::getErrText(40001); //错误码可以通过公众号类库的公开变量errCode得到
- *      if ($ret) 
+ *      if ($ret)
  *      	echo $ret;
- *      else 
+ *      else
  *          echo "未找到对应的内容";
  */
 class ErrCode
@@ -54,6 +54,7 @@ class ErrCode
 	    '40039'=>'不合法的URL长度',
 	    '40050'=>'不合法的分组id',
 	    '40051'=>'分组名字不合法',
+	    '40099'=>'该 code 已被核销',
 	    '41001'=>'缺少access_token参数',
 	    '41002'=>'缺少appid参数',
 	    '41003'=>'缺少refresh_token参数',
@@ -66,6 +67,7 @@ class ErrCode
 	    '42001'=>'access_token超时',
 	    '42002'=>'refresh_token超时',
 	    '42003'=>'oauth_code超时',
+	    '42005'=>'调用接口频率超过上限',
 	    '43001'=>'需要GET请求',
 	    '43002'=>'需要POST请求',
 	    '43003'=>'需要HTTPS请求',
@@ -124,7 +126,7 @@ class ErrCode
 	        '7000035'=>'获取股票信息失败',
 	        '7000036'=>'utf8 编码转换失败',
 	);
-	
+
 	public static function getErrText($err) {
 		if (isset(self::$errCode[$err])) {
 			return self::$errCode[$err];

+ 3 - 3
qyerrCode.php

@@ -6,9 +6,9 @@
  *  @version 1.0
  *  usage:
  *      $ret=ErrCode::getErrText(40001); //错误码可以通过公众号类库的公开变量errCode得到
- *      if ($ret) 
+ *      if ($ret)
  *      	echo $ret;
- *      else 
+ *      else
  *          echo "未找到对应的内容";
  */
 class ErrCode
@@ -166,7 +166,7 @@ class ErrCode
 	        '60114'=>'性别不合法',
 
 	);
-	
+
 	public static function getErrText($err) {
 		if (isset(self::$errCode[$err])) {
 			return self::$errCode[$err];

+ 41 - 27
qywechat.class.php

@@ -27,6 +27,20 @@ class Wechat
     const MSGTYPE_NEWS = 'news';
     const MSGTYPE_VOICE = 'voice';
     const MSGTYPE_VIDEO = 'video';
+    const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+    const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+    const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+    const EVENT_ENTER_AGENT = 'enter_agent';   //用户进入应用
+    const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+    const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+    const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+    const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+    const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+    const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+    const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+    const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+    const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+    const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
     const API_URL_PREFIX = 'https://qyapi.weixin.qq.com/cgi-bin';
     const USER_CREATE_URL = '/user/create?';
     const USER_UPDATE_URL = '/user/update?';
@@ -47,7 +61,7 @@ class Wechat
     const TAG_GET_URL = '/tag/get?';
     const TAG_ADDUSER_URL = '/tag/addtagusers?';
     const TAG_DELUSER_URL = '/tag/deltagusers?';
-    const TAG_LIST_URL = '/tag/list?';    
+    const TAG_LIST_URL = '/tag/list?';
     const MEDIA_UPLOAD_URL = '/media/upload?';
     const MEDIA_GET_URL = '/media/get?';
     const AUTHSUCC_URL = '/user/authsucc?';
@@ -67,7 +81,7 @@ class Wechat
 	private $access_token;
     private $agentid;       //应用id   AgentID
 	private $postxml;
-    private $agentidxml;    //接收的应用id   AgentID	
+    private $agentidxml;    //接收的应用id   AgentID
 	private $_msg;
 	private $_receive;
 	private $_sendmsg;      //主动发送消息的内容
@@ -373,7 +387,7 @@ class Wechat
 	public function getRevFrom() {
 		if (isset($this->_receive['FromUserName']))
 			return $this->_receive['FromUserName'];
-		else 
+		else
 			return false;
 	}
 	
@@ -383,7 +397,7 @@ class Wechat
 	public function getRevTo() {
 		if (isset($this->_receive['ToUserName']))
 			return $this->_receive['ToUserName'];
-		else 
+		else
 			return false;
 	}
 	
@@ -393,7 +407,7 @@ class Wechat
 	public function getRevAgentID() {
 		if (isset($this->_receive['AgentID']))
 			return $this->_receive['AgentID'];
-		else 
+		else
 			return false;
 	}
 
@@ -403,7 +417,7 @@ class Wechat
 	public function getRevType() {
 		if (isset($this->_receive['MsgType']))
 			return $this->_receive['MsgType'];
-		else 
+		else
 			return false;
 	}
 	
@@ -413,7 +427,7 @@ class Wechat
 	public function getRevID() {
 		if (isset($this->_receive['MsgId']))
 			return $this->_receive['MsgId'];
-		else 
+		else
 			return false;
 	}
 	
@@ -423,7 +437,7 @@ class Wechat
 	public function getRevCtime() {
 		if (isset($this->_receive['CreateTime']))
 			return $this->_receive['CreateTime'];
-		else 
+		else
 			return false;
 	}
 	
@@ -446,7 +460,7 @@ class Wechat
 				'mediaid'=>$this->_receive['MediaId'],
 				'picurl'=>(string)$this->_receive['PicUrl'],    //防止picurl为空导致解析出错
 			);
-		else 
+		else
 			return false;
 	}
 	
@@ -461,7 +475,7 @@ class Wechat
 				'scale'=>(string)$this->_receive['Scale'],
 				'label'=>(string)$this->_receive['Label']
 			);
-		} else 
+		} else
 			return false;
 	}
 	
@@ -486,7 +500,7 @@ class Wechat
 		if (isset($this->_receive['Event'])){
 			$array['event'] = $this->_receive['Event'];
 		}
-		if (isset($this->_receive['EventKey'])){
+		if (isset($this->_receive['EventKey']) && !empty($this->_receive['EventKey'])){
 			$array['key'] = $this->_receive['EventKey'];
 		}
 		if (isset($array) && count($array) > 0) {
@@ -616,7 +630,7 @@ class Wechat
 				'mediaid'=>$this->_receive['MediaId'],
 				'format'=>$this->_receive['Format'],
 			);
-		} else 
+		} else
 			return false;
 	}
 	
@@ -711,7 +725,7 @@ class Wechat
 	
 	/**
 	 * 设置回复图文
-	 * @param array $newsData 
+	 * @param array $newsData
 	 * 数组结构:
 	 *  array(
 	 *  	"0"=>array(
@@ -761,7 +775,7 @@ class Wechat
 	}
 
 	/**
-	 * 
+	 *
 	 * 回复微信服务器, 此函数支持链式操作
 	 * Example: $this->text('msg tips')->reply();
 	 * @param string $msg 要发送的信息, 默认取$this->_msg
@@ -769,7 +783,7 @@ class Wechat
 	 */
 	public function reply($msg=array(),$return = false)
 	{
-		if (empty($msg)) 
+		if (empty($msg))
 			$msg = $this->_msg;
 		$xmldata=  $this->xml_encode($msg);
 		$this->log($xmldata);
@@ -795,7 +809,7 @@ class Wechat
 			echo $smsg;
 		    return true;
 		    
-		}else 
+		}else
 		    return false;
 	}
 
@@ -1058,7 +1072,7 @@ class Wechat
 	 * {
  	 *   "errcode": 0,        //返回码
 	 *   "errmsg": "created",  //对返回码的文本描述内容
- 	 *   "id": 2               //创建的部门id。 
+ 	 *   "id": 2               //创建的部门id。
 	 * }
 	 */
 	public function createDepartment($data){
@@ -1696,29 +1710,29 @@ class Wechat
 	 *         "safe":"0"			//是否为保密消息,对于news无效
 	 *         "agentid" => "001",	//应用id
 	 *         "msgtype" => "text",  //根据信息类型,选择下面对应的信息结构体
-	 * 
+	 *
 	 *         "text" => array(
 	 *                 "content" => "Holiday Request For Pony(http://xxxxx)"
 	 *         ),
-	 * 
+	 *
 	 *         "image" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         "voice" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         " video" => array(
 	 *                 "media_id" => "MEDIA_ID",
 	 *                 "title" => "Title",
 	 *                 "description" => "Description"
 	 *         ),
-	 * 
+	 *
 	 *         "file" => array(
 	 *                 "media_id" => "MEDIA_ID"
 	 *         ),
-	 * 
+	 *
 	 *         "news" => array(			//不支持保密
 	 *                 "articles" => array(    //articles  图文消息,一个图文消息支持1到10个图文
 	 *                     array(
@@ -1730,7 +1744,7 @@ class Wechat
 	 *                     ),
 	 *                 )
 	 *         ),
-	 * 
+	 *
 	 *         "mpnews" => array(
 	 *                 "articles" => array(    //articles  图文消息,一个图文消息支持1到10个图文
 	 *                     array(
@@ -1746,7 +1760,7 @@ class Wechat
 	 *         )
 	 * )
 	 * 请查看官方开发文档中的 发送消息 -> 消息类型及数据格式
-	 * 
+	 *
 	 * @return boolean|array
 	 * 如果对应用或收件人、部门、标签任何一个无权限,则本次发送失败;
 	 * 如果收件人、部门或标签不存在,发送仍然执行,但返回无效的部分。
@@ -1780,7 +1794,7 @@ class Wechat
 	 * 当员工绑定通讯录中的帐号后,会收到一条图文消息,
 	 * 引导员工到企业的验证页面验证身份,企业在员工验证成功后,
 	 * 调用如下接口即可让员工关注成功。
-	 * 
+	 *
 	 * @param $userid
 	 * @return boolean|array 成功返回结果
 	 * {
@@ -1891,7 +1905,7 @@ class Prpcrypt
 
         try {
             //获得16位随机字符串,填充到明文之前
-            $random = $this->getRandomStr();//"aaaabbbbccccdddd"; 
+            $random = $this->getRandomStr();//"aaaabbbbccccdddd";
             $text = $random . pack("N", strlen($text)) . $text . $appid;
             // 网络字节序
             $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);

文件差异内容过多而无法显示
+ 747 - 152
wechat.class.php


+ 34 - 3
wiki/企业号API类库.md

@@ -32,9 +32,9 @@ $options = array(
 ```
 
 ## 被动接口方法:   
-* valid() 验证连接
+* valid() 验证连接,被动接口必须调用
 * 
-* getRev() 获取微信服务器发来信息(不返回结果)
+* getRev() 获取微信服务器发来信息(不返回结果),被动接口必须调用
 * getRevData() 返回微信服务器发来的信息(数组)
 * getRevPostXml() 返回微信服务器发来的原始加密xml信息
 * getRevFrom()  返回消息发送者的userid
@@ -52,7 +52,6 @@ $options = array(
 * getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明
 * getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送,事件类型为`location_select` 数组结构见php文件内方法说明
 * getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
-* getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
 * getRevVideo() 返回视频信息(视频型信息) 返回数组{'mediaid'=>'','thumbmediaid'=>''}
 * 
 * text($text) 设置文本型消息,参数:文本内容
@@ -63,6 +62,35 @@ $options = array(
 * image($mediaid) 设置图片型消息,参数:图片的media_id
 * Message($msg = '',$append = false) 设置发送的消息(一般不需要调用这个方法)
 * reply() 将已经设置好的消息,回复给微信服务器
+  
+### 预定义常量列表:
+```php
+////消息类型,使用实例调用getRevType()方法取得
+    const MSGTYPE_TEXT = 'text';
+    const MSGTYPE_IMAGE = 'image';
+    const MSGTYPE_LOCATION = 'location';
+    const MSGTYPE_LINK = 'link';    //暂不支持
+    const MSGTYPE_EVENT = 'event';
+    const MSGTYPE_MUSIC = 'music';    //暂不支持
+    const MSGTYPE_NEWS = 'news';
+    const MSGTYPE_VOICE = 'voice';
+    const MSGTYPE_VIDEO = 'video';
+////事件类型,使用实例调用getRevEvent()方法取得
+    const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+    const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+    const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+    const EVENT_ENTER_AGENT = 'enter_agent';   //用户进入应用
+    const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+    const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+    const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+    const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+    const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+    const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+    const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+    const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+    const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+    const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
+```
 
 ## 主动接口方法:
 * checkAuth($appid='',$appsecret='',$token='') 通用auth验证方法,也用来换取ACCESS_TOKEN 。仅在需要手动指定access_token时才用`$token`
@@ -72,6 +100,7 @@ $options = array(
 * deleteMenu($agentid='') 删除菜单,参数:要删除菜单的应用id
 * uploadMedia($data, $type) 上传媒体文件,参数请看php文件内方法说明(注意上传大文件时可能需要先调用 set_time_limit(0) 避免超时)
 * getMedia($media_id) 根据媒体文件ID获取媒体文件,参数:媒体id
+* getServerIp() 获取企业微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
 * createDepartment($data) 创建部门,参数: array("name"=>"邮箱产品组","parentid"=>"1","order" =>  "1")
 * updateDepartment($data) 更新部门,参数: array("id"=>"1","name"=>"邮箱产品组","parentid"=>"1","order" =>  "1")
 * deleteDepartment($id) 删除部门,参数:要删除的部门id
@@ -80,9 +109,11 @@ $options = array(
 * createUser($data) 创建成员,参数请看php文件内方法说明
 * updateUser($data) 更新成员,参数请看php文件内方法说明
 * deleteUser($userid) 删除成员,参数:员工UserID
+* deleteUsers($userids) 批量删除成员,参数:员工UserID数组
 * getUserInfo($userid) 获取成员信息,参数:员工UserID
 * getUserList($department_id,$fetch_child=0,$status=0) 获取部门成员,参数:部门id,是否递归获取子部门,获取类型。
 > 0获取全部员工,1获取已关注成员列表,2获取禁用成员列表,4获取未关注成员列表。status可叠加
+* getUserListInfo($department_id,$fetch_child=0,$status=0) 获取部门成员详情,参数同上
 * getUserId($code,$agentid) 根据code获取员工UserID与手机设备号,参数:Oauth2.0或者二次验证返回的code值,跳转链接时所在的企业应用ID
 * createTag($data) 创建标签,参数:array("tagname" => "UI")
 * updateTag($data) 更新标签,参数:array("tagid" => "1","tagname" => "UI")

+ 110 - 4
wiki/官方API类库.md

@@ -12,7 +12,7 @@
 - 分组操作(查询、创建、修改、移动用户到分组)**(认证权限)**
 - 网页授权(基本授权,用户信息授权)**(服务号、认证权限)**
 - 用户信息(查询用户基本信息、获取关注者列表)**(认证权限)**
-- 多客服功能(客服管理、获取客服记录)**(认证权限)**
+- 多客服功能(客服管理、获取客服记录、客服会话管理)**(认证权限)**
 - 媒体文件(上传、获取)**(认证权限)** 
 - 调用地址组件 **(支付权限) **
 - 生成订单签名数据 **(支付权限) **
@@ -20,7 +20,8 @@
 - 发货通知 **(支付权限) **
 - 支付订单查询 **(支付权限) **
 - 高级群发**(认证权限)**
-- 模板消息**(服务号、认证权限) **
+- 模板消息(设置所属行业、添加模板、发送模板消息)**(服务号、认证权限) **
+- 卡券管理(创建、修改、删除、发放、门店管理等)**(认证权限) **
 - 语义理解**(服务号、认证权限) **
 - 获取微信服务器IP列表**(初级权限) **
 > 备注:
@@ -43,10 +44,89 @@
 	);
  $weObj = new Wechat($options); //创建实例对象
  //TODO:调用$weObj各实例方法
+```
+
+### 被动接口方法:   
+* valid() 验证连接,被动接口处于加密模式时必须调用
+* 
+* getRev() 获取微信服务器发来信息(不返回结果),被动接口必须调用
+* getRevData() 返回微信服务器发来的信息(数组)
+* getRevFrom()  返回消息发送者的userid
+* getRevTo()  返回消息接收者的id(即公众号id)
+* getRevType() 返回接收消息的类型
+* getRevID() 返回消息id
+* getRevCtime() 返回消息发送事件
+* getRevContent() 返回消息内容正文或语音识别结果(文本型)
+* getRevPic() 返回图片信息(图片型信息) 返回数组{'mediaid'=>'','picurl'=>''}
+* getRevLink() 接收消息链接(链接型信息) 返回数组{'url'=>'','title'=>'','description'=>''}
+* getRevGeo() 返回地理位置(位置型信息) 返回数组{'x'=>'','y'=>'','scale'=>'','label'=>''}
+* getRevEventGeo() 返回事件地理位置(事件型信息) 返回数组{'x'=>'','y'=>'','precision'=>''}
+* getRevEvent() 返回事件类型(事件型信息) 返回数组{'event'=>'','key'=>''}
+* getRevScanInfo() 获取自定义菜单的扫码推事件信息,事件类型为`scancode_push`或`scancode_waitmsg` 返回数组array ('ScanType'=>'qrcode','ScanResult'=>'123123')
+* getRevSendPicsInfo() 获取自定义菜单的图片发送事件信息,事件类型为`pic_sysphoto`或`pic_photo_or_album`或`pic_weixin` 数组结构见php文件内方法说明
+* getRevSendGeoInfo() 获取自定义菜单的地理位置选择器事件推送,事件类型为`location_select` 数组结构见php文件内方法说明
+* getRevVoice() 返回语音信息(语音型信息) 返回数组{'mediaid'=>'','format'=>''}
+* getRevVideo() 返回视频信息(视频型信息) 返回数组{'mediaid'=>'','thumbmediaid'=>''}
+* getRevTicket() 返回接收TICKET(扫描带参数二维码,关注或SCAN事件) 返回二维码的ticket值
+* getRevSceneId() 返回二维码的场景值(扫描带参数二维码的关注事件) 返回二维码的参数值
+* getRevTplMsgID() 返回主动推送的消息ID(群发或模板消息事件) 返回MsgID值
+* getRevStatus() 返回模板消息发送状态(模板消息事件) 返回文本:success(成功)|failed:user block(用户拒绝接收)|failed: system failed(发送失败(非用户拒绝))
+* getRevResult() 返回群发或模板消息发送结果(群发或模板消息事件) 返回数组,内容依事件类型而不同,参考开发文档中群发、模板消息推送事件
+* getRevKFCreate() 返回多客服-接入会话的客服账号(多客服-接入会话事件) 返回文本型
+* getRevKFClose() 返回多客服-处理会话的客服账号(多客服-接入会话事件) 返回文本型
+* getRevKFSwitch() 返回多客服-转接会话信息(多客服-转接会话事件) 返回数组	{'FromKfAccount' => '','ToKfAccount' => ''}
+* getRevCardPass() 返回卡券-审核通过的卡券ID(卡券-卡券审核事件) 返回文本型
+* getRevCardGet() 返回卡券-用户领取卡券的相关信息(卡券-领取卡券事件) 返回数组{'CardId' => '','IsGiveByFriend' => '','UserCardCode' => ''}
+* getRevCardDel() 返回卡券-用户删除卡券的相关信息(卡券-删除卡券事件) 返回数组{'CardId' => '','UserCardCode' => ''}
+* 
+* text($text) 设置文本型消息,参数:文本内容
+* image($mediaid) 设置图片型消息,参数:图片的media_id
+* voice($mediaid) 设置语音型消息,参数:语音的media_id
+* video($mediaid='',$title,$description) 设置视频型消息,参数:视频的media_id、标题、摘要
+* music($title,$desc,$musicurl,$hgmusicurl='',$thumbmediaid='') 设置回复音乐,参数:音乐标题、音乐描述、音乐链接、高音质链接、缩略图的媒体id
+* news($newsData) 设置图文型消息,参数:数组。数组结构见php文件内方法说明
+* image($mediaid) 设置图片型消息,参数:图片的media_id
+* Message($msg = '',$append = false) 设置发送的消息(一般不需要调用这个方法)
+* transfer_customer_service($customer_account = '') 转接多客服,如不指定客服可不提供参数,参数:指定客服的账号
+* reply() 将以上已经设置好的消息,回复给微信服务器
 
+### 预定义常量列表:
+```php
+////消息类型,使用实例调用getRevType()方法取得
+	const MSGTYPE_TEXT = 'text';
+	const MSGTYPE_IMAGE = 'image';
+	const MSGTYPE_LOCATION = 'location';
+	const MSGTYPE_LINK = 'link';
+	const MSGTYPE_EVENT = 'event';
+	const MSGTYPE_MUSIC = 'music';
+	const MSGTYPE_NEWS = 'news';
+	const MSGTYPE_VOICE = 'voice';
+	const MSGTYPE_VIDEO = 'video';
+////事件类型,使用实例调用getRevEvent()方法取得
+	const EVENT_SUBSCRIBE = 'subscribe';       //订阅
+	const EVENT_UNSUBSCRIBE = 'unsubscribe';   //取消订阅
+	const EVENT_SCAN = 'SCAN';                 //扫描带参数二维码
+	const EVENT_LOCATION = 'LOCATION';         //上报地理位置
+	const EVENT_MENU_VIEW = 'VIEW';                     //菜单 - 点击菜单跳转链接
+	const EVENT_MENU_CLICK = 'CLICK';                   //菜单 - 点击菜单拉取消息
+	const EVENT_MENU_SCAN_PUSH = 'scancode_push';       //菜单 - 扫码推事件(客户端跳URL)
+	const EVENT_MENU_SCAN_WAITMSG = 'scancode_waitmsg'; //菜单 - 扫码推事件(客户端不跳URL)
+	const EVENT_MENU_PIC_SYS = 'pic_sysphoto';          //菜单 - 弹出系统拍照发图
+	const EVENT_MENU_PIC_PHOTO = 'pic_photo_or_album';  //菜单 - 弹出拍照或者相册发图
+	const EVENT_MENU_PIC_WEIXIN = 'pic_weixin';         //菜单 - 弹出微信相册发图器
+	const EVENT_MENU_LOCATION = 'location_select';      //菜单 - 弹出地理位置选择器
+	const EVENT_SEND_MASS = 'MASSSENDJOBFINISH';        //发送结果 - 高级群发完成
+	const EVENT_SEND_TEMPLATE = 'TEMPLATESENDJOBFINISH';//发送结果 - 模板消息发送结果
+	const EVENT_KF_SEESION_CREATE = 'kfcreatesession';  //多客服 - 接入会话
+	const EVENT_KF_SEESION_CLOSE = 'kfclosesession';    //多客服 - 关闭会话
+	const EVENT_KF_SEESION_SWITCH = 'kfswitchsession';  //多客服 - 转接会话
+	const EVENT_CARD_PASS = 'card_pass_check';          //卡券 - 审核通过
+	const EVENT_CARD_NOTPASS = 'card_not_pass_check';   //卡券 - 审核未通过
+	const EVENT_CARD_USER_GET = 'user_get_card';        //卡券 - 用户领取卡券
+	const EVENT_CARD_USER_DEL = 'user_del_card';        //卡券 - 用户删除卡券
 ```
 
-## 新增Auth高级权限类方法:   
+### 主动接口方法:   
  *  checkAuth($appid,$appsecret,$token) 此处传入公众后台高级接口提供的appid和appsecret, 或者手动指定$token为access_token。函数将返回access_token操作令牌
  *  createMenu($data) 创建菜单 $data菜单结构详见 **[自定义菜单创建接口](http://mp.weixin.qq.com/wiki/index.php?title=自定义菜单创建接口)**
  *  getServerIp() 获取微信服务器IP地址列表 返回数组array('127.0.0.1','127.0.0.1')
@@ -86,16 +166,42 @@
  *  sendPayDeliverNotify($openid,$transid,$out_trade_no,$status=1,$msg='ok') 发货通知  
  *  getPayOrder($out_trade_no) 查询订单信息  
  *  getAddrSign($url, $timeStamp, $nonceStr, $user_token='') 获取收货地址JS的签名
+ *  setTMIndustry($id1,$id2='') 模板消息,设置所属行业
+ *  addTemplateMessage($tpl_id) 模板消息,添加消息模板
  *  sendTemplateMessage($data) 发送模板消息
  *  getCustomServiceMessage($data) 获取多客服会话记录
  *  transfer_customer_service($customer_account) 转发多客服消息
  *  getCustomServiceKFlist() 获取多客服客服基本信息
  *  getCustomServiceOnlineKFlist() 获取多客服在线客服接待信息
+ *  createKFSession($openid,$kf_account,$text='') 创建指定多客服会话
+ *  closeKFSession($openid,$kf_account,$text='') 关闭指定多客服会话
+ *  getKFSession($openid) 获取用户会话状态
+ *  getKFSessionlist($kf_account) 获取指定客服的会话列表
+ *  getKFSessionWait() 获取未接入会话列表
  *  addKFAccount($account,$nickname,$password) 添加客服账号
  *  updateKFAccount($account,$nickname,$password) 修改客服账号信息
  *  deleteKFAccount($account) 删除客服账号
  *  setKFHeadImg($account,$imgfile) 上传客服头像
  *  querySemantic($uid,$query,$category,$latitude=0,$longitude=0,$city="",$region="") 语义理解接口 参数含义及返回的json内容请查看 **[微信语义理解接口](http://mp.weixin.qq.com/wiki/index.php?title=语义理解)**
+ *  createCard($data) 创建卡券
+ *  updateCard($data) 修改卡券
+ *  delCard($card_id) 删除卡券
+ *  getCardInfo($card_id) 查询卡券详情
+ *  getCardColors() 获取颜色列表
+ *  getCardLocations() 拉取门店列表
+ *  addCardLocations($data) 批量导入门店信息
+ *  createCardQrcode($card_id) 生成卡券二维码
+ *  consumeCardCode($code) 消耗 code
+ *  decryptCardCode($encrypt_code) code 解码
+ *  checkCardCode($code) 获取 code 的有效性
+ *  getCardIdList($data) 批量查询卡列表
+ *  updateCardCode($code,$code_id,$new_code) 更改 code
+ *  unavailableCardCode($code) 设置卡券失效**(不可逆)**
+ *  modifyCardStock($data) 库存修改
+ *  activateMemberCard($data) 激活/绑定会员卡,参数结构请参看卡券开发文档(6.1.1 激活/绑定会员卡)章节
+ *  updateMemberCard($data) 会员卡交易,参数结构请参看卡券开发文档(6.1.2 会员卡交易)章节
+ *  updateLuckyMoney($code,$balance,$card_id='') 更新红包金额
+ *  setCardTestWhiteList($openid=array(),$user=array()) 设置卡券测试白名单
 
 
 
@@ -107,7 +213,7 @@ $options = array(
 		'token'=>'tokenaccesskey' //填写你设定的key
 	);
 $weObj = new Wechat($options);
-$weObj->valid(); //注意, 应用验证通过后,可将此句注释掉, 但会降低网站安全性
+$weObj->valid();//明文或兼容模式可以在接口验证通过后注释此句,但加密模式一定不能注释,否则会验证失败
 $type = $weObj->getRev()->getRevType();
 switch($type) {
 	case Wechat::MSGTYPE_TEXT: