Browse Source

公众号类库:
1、修正 高级群发-预览消息接口URL
2、优化、整理部分API的常量定义,使之更清晰化。参考常量API_BASE_URL_PREFIX
3、修正 高级群发接口的mpvideo类型参数
4、增加 添加、修改、删除客服账号、上传客服头像接口

说明文档:
1、整理公众号类库主动API部分权限的说明

binsee 10 years ago
parent
commit
b63033053e
4 changed files with 340 additions and 106 deletions
  1. 34 22
      README.md
  2. 150 26
      Thinkphp/Wechat.class.php
  3. 122 37
      wechat.class.php
  4. 34 21
      wiki/官方API类库.md

+ 34 - 22
README.md

@@ -32,26 +32,33 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 调用官方API,具有更灵活的消息分类响应方式,支持链式调用操作 ; 
 
 ### 主要功能 
-- 接入验证 (初级权限)
-- 自动回复(文本、图片、语音、视频、音乐、图文)(初级权限)
-- 菜单操作(查询、创建、删除)(菜单权限)
-- 客服消息(文本、图片、语音、视频、音乐、图文)(认证权限)
-- 二维码(创建临时、永久二维码,获取二维码URL)(服务号、认证权限)
-- 长链接转短链接接口(服务号、认证权限)
-- 分组操作(查询、创建、修改、移动用户到分组)(认证权限)
-- 网页授权(基本授权,用户信息授权)(服务号、认证权限)
-- 用户信息(查询用户基本信息、获取关注者列表)(认证权限)
-- 多客服功能(认证权限)
-- 媒体文件(上传、获取)(认证权限) 
-- 调用地址组件 (支付权限) 
-- 生成订单签名数据 (支付权限) 
-- 订单成功回调 (支付权限) 
-- 发货通知 (支付权限) 
-- 支付订单查询 (支付权限) 
-- 高级群发(认证权限)
-- 模板消息(服务号、认证权限) 
-- 语义理解(服务号、认证权限) 
-- 获取微信服务器IP列表(初级权限) 
+- 接入验证 **(初级权限)**
+- 自动回复(文本、图片、语音、视频、音乐、图文)**(初级权限)**
+- 菜单操作(查询、创建、删除)**(菜单权限)**
+- 客服消息(文本、图片、语音、视频、音乐、图文)**(认证权限)**
+- 二维码(创建临时、永久二维码,获取二维码URL)**(服务号、认证权限)**
+- 长链接转短链接接口**(服务号、认证权限)**
+- 分组操作(查询、创建、修改、移动用户到分组)**(认证权限)**
+- 网页授权(基本授权,用户信息授权)**(服务号、认证权限)**
+- 用户信息(查询用户基本信息、获取关注者列表)**(认证权限)**
+- 多客服功能(客服管理、获取客服记录)**(认证权限)**
+- 媒体文件(上传、获取)**(认证权限)** 
+- 调用地址组件 **(支付权限) **
+- 生成订单签名数据 **(支付权限) **
+- 订单成功回调 **(支付权限) **
+- 发货通知 **(支付权限) **
+- 支付订单查询 **(支付权限) **
+- 高级群发**(认证权限)**
+- 模板消息**(服务号、认证权限) **
+- 语义理解**(服务号、认证权限) **
+- 获取微信服务器IP列表**(初级权限) **
+> 备注:
+> 初级权限:基本权限,任何正常的公众号都有此权限
+> 菜单权限:正常的服务号、认证后的订阅号拥有此权限
+> 认证权限:分为订阅号、服务号认证,如前缀服务号则仅认证的服务号有此权限,否则为认证后的订阅号、服务号都有此权限
+> 支付权限:仅认证后的服务号可以申请此权限
+
+
 
 
 ### 初始化动作 
@@ -77,7 +84,8 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
  *  getMenu() 获取菜单 
  *  deleteMenu() 删除菜单 
  *  uploadMedia($data, $type) 上传多媒体文件
- *  getMedia() 获取接收到的音频、视频媒体文件 
+ *  getMedia() 获取接收到的音频、视频媒体文件 
+ *  uploadMpVideo($data) 上传视频素材,当需要群发视频时,必须使用此方法得到的MediaID,否则无法显示
  *  uploadArticles($data) 上传图文消息素材
  *  sendMassMessage($data) 高级群发消息
  *  sendGroupMassMessage($data) 高级群发消息(群体或分组群发)
@@ -113,7 +121,11 @@ https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
  *  getCustomServiceMessage($data) 获取多客服会话记录
  *  transfer_customer_service($customer_account) 转发多客服消息
  *  getCustomServiceKFlist() 获取多客服客服基本信息
- *  getCustomServiceOnlineKFlist() 获取多客服在线客服接待信息
+ *  getCustomServiceOnlineKFlist() 获取多客服在线客服接待信息
+ *  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=语义理解)**
  
  

+ 150 - 26
Thinkphp/Wechat.class.php

@@ -60,7 +60,6 @@ class Wechat
 	const MENU_CREATE_URL = '/menu/create?';
 	const MENU_GET_URL = '/menu/get?';
 	const MENU_DELETE_URL = '/menu/delete?';
-	const MEDIA_GET_URL = '/media/get?';
 	const CALLBACKSERVER_GET_URL = '/getcallbackip?';
 	const QRCODE_CREATE_URL='/qrcode/create?';
 	const QR_SCENE = 0;
@@ -81,24 +80,29 @@ class Wechat
 	const TEMPLATE_SEND_URL = '/message/template/send?';
 	const MASS_SEND_GROUP_URL = '/message/mass/sendall?';
 	const MASS_DELETE_URL = '/message/mass/delete?';
-	const MASS_PREVIEW_URL = '/message/mass/xxxx?';
+	const MASS_PREVIEW_URL = '/message/mass/preview?';
 	const MASS_QUERY_URL = '/message/mass/get?';
 	const UPLOAD_MEDIA_URL = 'http://file.api.weixin.qq.com/cgi-bin';
 	const MEDIA_UPLOAD = '/media/upload?';
+	const MEDIA_GET_URL = '/media/get?';
 	const MEDIA_VIDEO_UPLOAD = '/media/uploadvideo?';
 	const OAUTH_PREFIX = 'https://open.weixin.qq.com/connect/oauth2';
 	const OAUTH_AUTHORIZE_URL = '/authorize?';
-	const OAUTH_TOKEN_PREFIX = 'https://api.weixin.qq.com/sns/oauth2';
-	const OAUTH_TOKEN_URL = '/access_token?';
-	const OAUTH_REFRESH_URL = '/refresh_token?';
-	const OAUTH_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?';
-	const OAUTH_AUTH_URL = 'https://api.weixin.qq.com/sns/auth?';
-	const PAY_DELIVERNOTIFY = 'https://api.weixin.qq.com/pay/delivernotify?';
-	const PAY_ORDERQUERY = 'https://api.weixin.qq.com/pay/orderquery?';
+	const API_BASE_URL_PREFIX = 'https://api.weixin.qq.com'; //以下API接口URL需要使用此前缀
+	const OAUTH_TOKEN_URL = '/sns/oauth2/access_token?';
+	const OAUTH_REFRESH_URL = '/sns/oauth2/refresh_token?';
+	const OAUTH_USERINFO_URL = '/sns/oauth2/sns/userinfo?';
+	const OAUTH_AUTH_URL = '/sns/auth?';
+	const PAY_DELIVERNOTIFY = '/pay/delivernotify?';
+	const PAY_ORDERQUERY = '/pay/orderquery?';
 	const CUSTOM_SERVICE_GET_RECORD = '/customservice/getrecord?';
 	const CUSTOM_SERVICE_GET_KFLIST = '/customservice/getkflist?';
-	const CUSTOM_SERVICE_GET_ONLINEKFLIST = '/customservice/getkflist?';
-	const SEMANTIC_API_URL= 'https://api.weixin.qq.com/semantic/semproxy/search?';
+	const CUSTOM_SERVICE_GET_ONLINEKFLIST = '/customservice/getonlinekflist?';
+	const CS_KF_ACCOUNT_ADD_URL = '/customservice/kfaccount/add?';
+	const CS_KF_ACCOUNT_UPDATE_URL = '/customservice/kfaccount/update?';
+	const CS_KF_ACCOUNT_DEL_URL = '/customservice/kfaccount/del?';
+	const CS_KF_ACCOUNT_UPLOAD_HEADIMG_URL = '/customservice/kfaccount/uploadheadimg?';
+	const SEMANTIC_API_URL= '/semantic/semproxy/search?';
 	
 	private $token;
 	private $encodingAesKey;
@@ -1254,8 +1258,7 @@ class Wechat
 	 *     ),
 	 *      "msgtype"=>"mpvideo", 
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1288,8 +1291,7 @@ class Wechat
 	 *     ),
 	 *      "msgtype"=>"mpvideo", 
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1340,8 +1342,7 @@ class Wechat
 	 *     "touser"=>"OPENID",
 	 *      "msgtype"=>"mpvideo",
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1384,7 +1385,7 @@ class Wechat
 			}
 			return true;
 		}
-		return false;n
+		return false;
 	}
 	
 	/**
@@ -1676,7 +1677,7 @@ class Wechat
 	public function getOauthAccessToken(){
 		$code = isset($_GET['code'])?$_GET['code']:'';
 		if (!$code) return false;
-		$result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1697,7 +1698,7 @@ class Wechat
 	 * @return boolean|mixed
 	 */
 	public function getOauthRefreshToken($refresh_token){
-		$result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_REFRESH_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_REFRESH_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1720,7 +1721,7 @@ class Wechat
 	 * 注意:unionid字段 只有在用户将公众号绑定到微信开放平台账号后,才会出现。建议调用前用isset()检测一下
 	 */
 	public function getOauthUserinfo($access_token,$openid){
-		$result = $this->http_get(self::OAUTH_USERINFO_URL.'access_token='.$access_token.'&openid='.$openid);
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_USERINFO_URL.'access_token='.$access_token.'&openid='.$openid);
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1741,7 +1742,7 @@ class Wechat
 	 * @return boolean 是否有效
 	 */
 	public function getOauthAuth($access_token,$openid){
-	    $result = $this->http_get(self::OAUTH_AUTH_URL.'access_token='.$access_token.'&openid='.$openid);
+	    $result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_AUTH_URL.'access_token='.$access_token.'&openid='.$openid);
 	    if ($result)
 	    {
 	        $json = json_decode($result,true);
@@ -1914,7 +1915,7 @@ class Wechat
 		$postdata['app_signature'] = $this->getSignature($postdata);
 		$postdata['sign_method'] = 'sha1';
 		unset($postdata['appkey']);
-		$result = $this->http_post(self::PAY_DELIVERNOTIFY.'access_token='.$this->access_token,self::json_encode($postdata));
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::PAY_DELIVERNOTIFY.'access_token='.$this->access_token,self::json_encode($postdata));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1945,7 +1946,7 @@ class Wechat
 		$postdata['app_signature'] = $this->getSignature($postdata);
 		$postdata['sign_method'] = 'sha1';
 		unset($postdata['appkey']);
-		$result = $this->http_post(self::PAY_ORDERQUERY.'access_token='.$this->access_token,self::json_encode($postdata));
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::PAY_ORDERQUERY.'access_token='.$this->access_token,self::json_encode($postdata));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -2108,8 +2109,42 @@ class Wechat
 	 }
 	 */
 	public function getCustomServiceOnlineKFlist(){
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_get(self::API_URL_PREFIX.self::CUSTOM_SERVICE_GET_ONLINEKFLIST.'access_token='.$this->access_token);
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
+	
+	/**
+	 * 添加客服账号
+	 * 
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $nickname     //客服昵称,最长6个汉字或12个英文字符
+	 * @param string $password     //客服账号明文登录密码,会自动加密
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0, 
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function addKFAccount($account,$nickname,$password){
+	    $data=array(
+	    	"kf_account" =>$account, 
+	        "nickname" => $nickname,
+	        "password" => md5($password)
+	    );
 		if (!$this->access_token && !$this->checkAuth()) return false;
-		$result = $this->http_get(self::API_URL_PREFIX.self::CUSTOM_SERVICE_GET_ONLINEKFLIST.'access_token='.$this->access_token);
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_ADD_URL.'access_token='.$this->access_token,self::json_encode($data));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -2122,6 +2157,95 @@ class Wechat
 		}
 		return false;
 	}
+
+	/**
+	 * 修改客服账号信息
+	 *
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $nickname     //客服昵称,最长6个汉字或12个英文字符
+	 * @param string $password     //客服账号明文登录密码,会自动加密
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function updateKFAccount($account,$nickname,$password){
+	    $data=array(
+	            "kf_account" =>$account,
+	            "nickname" => $nickname,
+	            "password" => md5($password)
+	    );
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data));
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
+
+	/**
+	 * 删除客服账号
+	 *
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function deleteKFAccount($account){
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_get(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_DEL_URL.'access_token='.$this->access_token.'&kf_account='.$account);
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
+	
+	/**
+	 * 上传客服头像
+	 *
+	 * @param string $account //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $imgfile //头像文件完整路径,如:'D:\user.jpg'。头像文件必须JPG格式,像素建议640*640
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function setKFHeadImg($account,$imgfile){
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_UPLOAD_HEADIMG_URL.'access_token='.$this->access_token.'&kf_account='.$account,array('media'=>'@'.$imgfile),true);
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
 	
 	/**
 	 * 语义理解接口
@@ -2151,7 +2275,7 @@ class Wechat
 	    } elseif ($region) {
 	        $data['region'] = $region;
 	    }
-	    $result = $this->http_post(self::SEMANTIC_API_URL.'access_token='.$this->access_token,self::json_encode($data));
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::SEMANTIC_API_URL.'access_token='.$this->access_token,self::json_encode($data));
 	    if ($result)
 	    {
 	        $json = json_decode($result,true);

+ 122 - 37
wechat.class.php

@@ -60,7 +60,6 @@ class Wechat
 	const MENU_CREATE_URL = '/menu/create?';
 	const MENU_GET_URL = '/menu/get?';
 	const MENU_DELETE_URL = '/menu/delete?';
-	const MEDIA_GET_URL = '/media/get?';
 	const CALLBACKSERVER_GET_URL = '/getcallbackip?';
 	const QRCODE_CREATE_URL='/qrcode/create?';
 	const QR_SCENE = 0;
@@ -85,24 +84,25 @@ class Wechat
 	const MASS_QUERY_URL = '/message/mass/get?';
 	const UPLOAD_MEDIA_URL = 'http://file.api.weixin.qq.com/cgi-bin';
 	const MEDIA_UPLOAD = '/media/upload?';
+	const MEDIA_GET_URL = '/media/get?';
 	const MEDIA_VIDEO_UPLOAD = '/media/uploadvideo?';
 	const OAUTH_PREFIX = 'https://open.weixin.qq.com/connect/oauth2';
 	const OAUTH_AUTHORIZE_URL = '/authorize?';
-	const OAUTH_TOKEN_PREFIX = 'https://api.weixin.qq.com/sns/oauth2';
-	const OAUTH_TOKEN_URL = '/access_token?';
-	const OAUTH_REFRESH_URL = '/refresh_token?';
-	const OAUTH_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?';
-	const OAUTH_AUTH_URL = 'https://api.weixin.qq.com/sns/auth?';
-	const PAY_DELIVERNOTIFY = 'https://api.weixin.qq.com/pay/delivernotify?';
-	const PAY_ORDERQUERY = 'https://api.weixin.qq.com/pay/orderquery?';
+	const API_BASE_URL_PREFIX = 'https://api.weixin.qq.com'; //以下API接口URL需要使用此前缀
+	const OAUTH_TOKEN_URL = '/sns/oauth2/access_token?';
+	const OAUTH_REFRESH_URL = '/sns/oauth2/refresh_token?';
+	const OAUTH_USERINFO_URL = '/sns/oauth2/sns/userinfo?';
+	const OAUTH_AUTH_URL = '/sns/auth?';
+	const PAY_DELIVERNOTIFY = '/pay/delivernotify?';
+	const PAY_ORDERQUERY = '/pay/orderquery?';
 	const CUSTOM_SERVICE_GET_RECORD = '/customservice/getrecord?';
 	const CUSTOM_SERVICE_GET_KFLIST = '/customservice/getkflist?';
 	const CUSTOM_SERVICE_GET_ONLINEKFLIST = '/customservice/getonlinekflist?';
-	const CUSTOM_SERVICE_ACCOUNT_ADD = '/customservice/kfaccount/add?';
-	const CUSTOM_SERVICE_ACCOUNT_UPDATE = '/customservice/kfaccount/update?';
-	const CUSTOM_SERVICE_ACCOUNT_DEL = '/customservice/kfaccount/del?';
-	const CUSTOM_SERVICE_ACCOUNT_UPDATE_HEADIMG = '/customservice/kfaccount/uploadheadimg?';
-	const SEMANTIC_API_URL= 'https://api.weixin.qq.com/semantic/semproxy/search?';
+	const CS_KF_ACCOUNT_ADD_URL = '/customservice/kfaccount/add?';
+	const CS_KF_ACCOUNT_UPDATE_URL = '/customservice/kfaccount/update?';
+	const CS_KF_ACCOUNT_DEL_URL = '/customservice/kfaccount/del?';
+	const CS_KF_ACCOUNT_UPLOAD_HEADIMG_URL = '/customservice/kfaccount/uploadheadimg?';
+	const SEMANTIC_API_URL= '/semantic/semproxy/search?';
 	
 	private $token;
 	private $encodingAesKey;
@@ -1248,8 +1248,7 @@ class Wechat
 	 *     ),
 	 *      "msgtype"=>"mpvideo", 
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1282,8 +1281,7 @@ class Wechat
 	 *     ),
 	 *      "msgtype"=>"mpvideo", 
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1334,8 +1332,7 @@ class Wechat
 	 *     "touser"=>"OPENID",
 	 *      "msgtype"=>"mpvideo",
 	 *      // 在下面5种类型中选择对应的参数内容
-	 *      // mpvideo =>array ( "media_id"=>"MediaId", "title"=>"TITLE", "description"=>"Description" )
-	 *      // mpnews | voice | image => array( "media_id"=>"MediaId")
+	 *      // mpnews | voice | image | mpvideo => array( "media_id"=>"MediaId")
 	 *      // text => array ( "content" => "hello")
 	 * }
 	 * @return boolean|array
@@ -1378,7 +1375,7 @@ class Wechat
 			}
 			return true;
 		}
-		return false;n
+		return false;
 	}
 	
 	/**
@@ -1670,7 +1667,7 @@ class Wechat
 	public function getOauthAccessToken(){
 		$code = isset($_GET['code'])?$_GET['code']:'';
 		if (!$code) return false;
-		$result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_TOKEN_URL.'appid='.$this->appid.'&secret='.$this->appsecret.'&code='.$code.'&grant_type=authorization_code');
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1691,7 +1688,7 @@ class Wechat
 	 * @return boolean|mixed
 	 */
 	public function getOauthRefreshToken($refresh_token){
-		$result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_REFRESH_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_REFRESH_URL.'appid='.$this->appid.'&grant_type=refresh_token&refresh_token='.$refresh_token);
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1714,7 +1711,7 @@ class Wechat
 	 * 注意:unionid字段 只有在用户将公众号绑定到微信开放平台账号后,才会出现。建议调用前用isset()检测一下
 	 */
 	public function getOauthUserinfo($access_token,$openid){
-		$result = $this->http_get(self::OAUTH_USERINFO_URL.'access_token='.$access_token.'&openid='.$openid);
+		$result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_USERINFO_URL.'access_token='.$access_token.'&openid='.$openid);
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1735,7 +1732,7 @@ class Wechat
 	 * @return boolean 是否有效
 	 */
 	public function getOauthAuth($access_token,$openid){
-	    $result = $this->http_get(self::OAUTH_AUTH_URL.'access_token='.$access_token.'&openid='.$openid);
+	    $result = $this->http_get(self::API_BASE_URL_PREFIX.self::OAUTH_AUTH_URL.'access_token='.$access_token.'&openid='.$openid);
 	    if ($result)
 	    {
 	        $json = json_decode($result,true);
@@ -1908,7 +1905,7 @@ class Wechat
 		$postdata['app_signature'] = $this->getSignature($postdata);
 		$postdata['sign_method'] = 'sha1';
 		unset($postdata['appkey']);
-		$result = $this->http_post(self::PAY_DELIVERNOTIFY.'access_token='.$this->access_token,self::json_encode($postdata));
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::PAY_DELIVERNOTIFY.'access_token='.$this->access_token,self::json_encode($postdata));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -1939,7 +1936,7 @@ class Wechat
 		$postdata['app_signature'] = $this->getSignature($postdata);
 		$postdata['sign_method'] = 'sha1';
 		unset($postdata['appkey']);
-		$result = $this->http_post(self::PAY_ORDERQUERY.'access_token='.$this->access_token,self::json_encode($postdata));
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::PAY_ORDERQUERY.'access_token='.$this->access_token,self::json_encode($postdata));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -2085,10 +2082,10 @@ class Wechat
 		}
 		return false;
 	}
-
+	
 	/**
-	 *  获取多客服在线客服接待信息
-	 *
+	 * 获取多客服在线客服接待信息
+	 * 
 	 * @return boolean|array {
 	 "kf_online_list": [
 	 {
@@ -2120,25 +2117,24 @@ class Wechat
 	/**
 	 * 添加客服账号
 	 * 
-	 * @param sr $account
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $nickname     //客服昵称,最长6个汉字或12个英文字符
+	 * @param string $password     //客服账号明文登录密码,会自动加密
 	 * @return boolean|array
 	 * 成功返回结果
 	 * {
 	 *   "errcode": 0, 
 	 *   "errmsg": "ok",
 	 * }
-	 *     "kf_account" : test1@test,
-    "nickname" : “客服1”,
-    "password" : "pswmd5",
 	 */
-	public function addCustomServiceKFAccount($account,$nickname,$password){
+	public function addKFAccount($account,$nickname,$password){
 	    $data=array(
 	    	"kf_account" =>$account, 
 	        "nickname" => $nickname,
-	        "password" => $password
+	        "password" => md5($password)
 	    );
 		if (!$this->access_token && !$this->checkAuth()) return false;
-		$result = $this->http_get(self::API_URL_PREFIX.self::CUSTOM_SERVICE_ACCOUNT_ADD.'access_token='.$this->access_token,self::json_encode($data));
+		$result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_ADD_URL.'access_token='.$this->access_token,self::json_encode($data));
 		if ($result)
 		{
 			$json = json_decode($result,true);
@@ -2151,6 +2147,95 @@ class Wechat
 		}
 		return false;
 	}
+
+	/**
+	 * 修改客服账号信息
+	 *
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $nickname     //客服昵称,最长6个汉字或12个英文字符
+	 * @param string $password     //客服账号明文登录密码,会自动加密
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function updateKFAccount($account,$nickname,$password){
+	    $data=array(
+	            "kf_account" =>$account,
+	            "nickname" => $nickname,
+	            "password" => md5($password)
+	    );
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data));
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
+
+	/**
+	 * 删除客服账号
+	 *
+	 * @param string $account      //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function deleteKFAccount($account){
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_get(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_DEL_URL.'access_token='.$this->access_token.'&kf_account='.$account);
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
+	
+	/**
+	 * 上传客服头像
+	 *
+	 * @param string $account //完整客服账号,格式为:账号前缀@公众号微信号,账号前缀最多10个字符,必须是英文或者数字字符
+	 * @param string $imgfile //头像文件完整路径,如:'D:\user.jpg'。头像文件必须JPG格式,像素建议640*640
+	 * @return boolean|array
+	 * 成功返回结果
+	 * {
+	 *   "errcode": 0,
+	 *   "errmsg": "ok",
+	 * }
+	 */
+	public function setKFHeadImg($account,$imgfile){
+	    if (!$this->access_token && !$this->checkAuth()) return false;
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::CS_KF_ACCOUNT_UPLOAD_HEADIMG_URL.'access_token='.$this->access_token.'&kf_account='.$account,array('media'=>'@'.$imgfile),true);
+	    if ($result)
+	    {
+	        $json = json_decode($result,true);
+	        if (!$json || !empty($json['errcode'])) {
+	            $this->errCode = $json['errcode'];
+	            $this->errMsg = $json['errmsg'];
+	            return false;
+	        }
+	        return $json;
+	    }
+	    return false;
+	}
 	
 	/**
 	 * 语义理解接口
@@ -2180,7 +2265,7 @@ class Wechat
 	    } elseif ($region) {
 	        $data['region'] = $region;
 	    }
-	    $result = $this->http_post(self::SEMANTIC_API_URL.'access_token='.$this->access_token,self::json_encode($data));
+	    $result = $this->http_post(self::API_BASE_URL_PREFIX.self::SEMANTIC_API_URL.'access_token='.$this->access_token,self::json_encode($data));
 	    if ($result)
 	    {
 	        $json = json_decode($result,true);

+ 34 - 21
wiki/官方API类库.md

@@ -3,25 +3,31 @@
 调用官方API,具有更灵活的消息分类响应方式,支持链式调用操作 ; 
 
 ## 主要功能 
-- 接入验证 (初级权限)
-- 自动回复(文本、图片、语音、视频、音乐、图文)(初级权限)
-- 菜单操作(查询、创建、删除)(菜单权限)
-- 客服消息(文本、图片、语音、视频、音乐、图文)(认证权限)
-- 二维码(创建临时、永久二维码,获取二维码URL)(认证权限)
-- 长链接转短链接接口(认证权限)
-- 分组操作(查询、创建、修改、移动用户到分组)(认证权限)
-- 网页授权(基本授权,用户信息授权)(认证权限)
-- 用户信息(查询用户基本信息、获取关注者列表)(认证权限)
-- 多客服功能(认证权限)
-- 媒体文件(上传、获取)(认证权限) 
-- 调用地址组件 (支付权限) 
-- 生成订单签名数据 (支付权限) 
-- 订单成功回调 (支付权限) 
-- 发货通知 (支付权限) 
-- 支付订单查询 (支付权限) 
-- 模板消息(支付权限) 
-- 语义理解(认证权限) 
-- 获取微信服务器IP列表(认证权限) 
+- 接入验证 **(初级权限)**
+- 自动回复(文本、图片、语音、视频、音乐、图文)**(初级权限)**
+- 菜单操作(查询、创建、删除)**(菜单权限)**
+- 客服消息(文本、图片、语音、视频、音乐、图文)**(认证权限)**
+- 二维码(创建临时、永久二维码,获取二维码URL)**(服务号、认证权限)**
+- 长链接转短链接接口**(服务号、认证权限)**
+- 分组操作(查询、创建、修改、移动用户到分组)**(认证权限)**
+- 网页授权(基本授权,用户信息授权)**(服务号、认证权限)**
+- 用户信息(查询用户基本信息、获取关注者列表)**(认证权限)**
+- 多客服功能(客服管理、获取客服记录)**(认证权限)**
+- 媒体文件(上传、获取)**(认证权限)** 
+- 调用地址组件 **(支付权限) **
+- 生成订单签名数据 **(支付权限) **
+- 订单成功回调 **(支付权限) **
+- 发货通知 **(支付权限) **
+- 支付订单查询 **(支付权限) **
+- 高级群发**(认证权限)**
+- 模板消息**(服务号、认证权限) **
+- 语义理解**(服务号、认证权限) **
+- 获取微信服务器IP列表**(初级权限) **
+> 备注:
+> 初级权限:基本权限,任何正常的公众号都有此权限
+> 菜单权限:正常的服务号、认证后的订阅号拥有此权限
+> 认证权限:分为订阅号、服务号认证,如前缀服务号则仅认证的服务号有此权限,否则为认证后的订阅号、服务号都有此权限
+> 支付权限:仅认证后的服务号可以申请此权限
 
 
 ## 初始化动作 
@@ -48,10 +54,13 @@
  *  deleteMenu() 删除菜单 
  *  uploadMedia($data, $type) 上传多媒体文件
  *  getMedia() 获取接收到的音频、视频媒体文件 
+ *  uploadMpVideo($data) 上传视频素材,当需要群发视频时,必须使用此方法得到的MediaID,否则无法显示
  *  uploadArticles($data) 上传图文消息素材
  *  sendMassMessage($data) 高级群发消息
- *  sendGroupMassMessage($data) 高级群发消息(分组群发)
- *  deleteMassMessage() 删除群发图文消息
+ *  sendGroupMassMessage($data) 高级群发消息(全体或分组群发)
+ *  deleteMassMessage($msg_id) 删除群发图文消息
+ *  previewMassMessage($data) 预览群发消息
+ *  queryMassMessage($msg_id) 查询群发消息发送状态
  *  getQRCode($scene_id,$type=0,$expire=1800) 获取推广二维码ticket字串 
  *  getQRUrl($ticket) 获取二维码图片地址
  *  getShortUrl($long_url) 长链接转短链接接口
@@ -82,6 +91,10 @@
  *  transfer_customer_service($customer_account) 转发多客服消息
  *  getCustomServiceKFlist() 获取多客服客服基本信息
  *  getCustomServiceOnlineKFlist() 获取多客服在线客服接待信息
+ *  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=语义理解)**