本文实例为大家分享了php微信高级接口群发、多客服源码,供大家参考,具体内容如下
/** * 微信接口调用 * 依赖 * 全局变量 * global $uid 公众号用户id, $wid 公众号id, $wechatid 粉丝唯一id; * 参数 * $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; * $postObj = simplexml_load_string($postStr, "SimpleXMLElement", LIBXML_NOCDATA); * 缓存类 自定义 * Cache:set * Cache:get * 具体业务修改 * 1.上传图文信息至微信素材库 * function uploadArticlesToWeiXinServer() * 2.关键字匹配图文回复 * function getArticleData() ** usage: *$options = array( *"token"=>"tokenaccesskey", //填写你设定的key *"appid"=>"wxdk1234567890", //填写高级调用功能的app id *"appsecret"=>"xxxxxxxxxxxxxxxxxxx", //填写高级调用功能的密钥 *); */class WeiXinTool {private $appid;private $appsecret;private $access_token;private $mediaType = array("image" => array("jpg"), "voice" => array("amr", "MP3"), "video" => array("mp4"), "thumb" => array("jpg"));private $mediaMaxSize = array("image" => 131072, "voice" => 262144, "video" => 1048576, "thumb" => 65536);private $tem_file_path = "";//授权地址const AUTH_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s";//素材上传const UPLOAD_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s";const GET_MEDIA_URL = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s";const UPLOAD_NEWS_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s";public function __construct($options) {$this->appid = isset($options["appid"]) ? $options["appid"] : "";$this->appsecret = isset($options["appsecret"]) ? $options["appsecret"] : "";//需修改//上传图片临时文件目录自定义$this->tem_file_path = YYUC_FRAME_PATH . YYUC_PUB . "/" . Session::get("upath");}/** * 需修改 * 具体业务需求,图文信息上传至素材库 * 微站文章上传至微信素材 * @param type $wid* @param type $aid * @return int */public function uploadArticlesToWeiXinServer($wid, $aid) {//具体图文组装过程,需修改$m = new Model("website_article");$m_pubs = new Model("pubs");$m_pubs->find(array("id" => $wid));$m->find(array("wid" => $wid, "id" => $aid));$res = array();if ($m->has_id() && $m_pubs->has_id()) {$res[] = $m->get_model_array();//var_dump($res);$m->votetouser = json_decode($m->votetouser, TRUE);$articles = $m->votetouser[0];$m_article = new Model("website_article");$ress = $m_article->where(array("wid" => $wid, "id" => $articles))->list_all_array();$res = array_merge($res, $ress);} else {$errarr = array();$errarr["errcode"] = 44003;$errarr["errmsg"] = self::$errorno[$errarr["errcode"]];return $errarr;}$items = array();foreach ($res as $k => $v) {$mediaid = $this->uploadMedia($v["picurl"]);if ($mediaid["media_id"]) {$thumb_media_id = $mediaid["media_id"];} else {return $mediaid;}$item = array("thumb_media_id" => $thumb_media_id,"author" => $m_pubs->pubun,"title" => $v["title"],"content_source_url" => WeiXinTool::complateUrl(WeiSite::parseArticleLinkData($v)),"content" => $v["reply_content"], //内容 富文本"digest" => $v["description"]//描述);$items[] = $item;}//以上具体图文组装过程,需修改$postData["articles"] = $items;$error = $this->uploadNews($postData);return $error;}/** * 需修改 * 微站文章关键字匹配数据解析 */public static function getArticleData($keyword) {global $wid;$m = new Model("website_article");$m->find(array("wid" => $wid, "keyword@~" => " " . $keyword . " "));$res = array();if ($m->has_id()) {$res[] = array("tit" => $m->title, "pic" => $m->picurl, "dec" => $m->description, "url" => WeiSite::parseArticleLinkData($m->get_model_array()));$m->votetouser = json_decode($m->votetouser, TRUE);$articles = $m->votetouser[0];if (!empty($articles)) {foreach ($articles as $v) {$m_article = new Model("website_article");$m_article->find(array("wid" => $wid, "id" => $v));$res[] = array("tit" => $m_article->title, "pic" => $m_article->picurl, "dec" => $m_article->description, "url" => WeiSite::parseArticleLinkData($m_article->get_model_array()));}}return $res;}}/** * 获取accesstoken * @param type $flag 强制刷新accesstoken 开关 * @return type */public function getAccessToken($flag = FALSE) {$url = sprintf(self::AUTH_URL, $this->appid, $this->appsecret);$result = Cache::get(md5($url));if ($flag || empty($result)) {$result = $this->http_get($url);$result = json_decode($result, TRUE);if ($result["errcode"]) {return $result["errcode"];}Cache::set(md5($url), $result, 1);}$this->access_token = $result["access_token"];return true;}/** * 上传媒体 * @param type $file 媒体文件 $url或者物理路径地址 * @param type $type 类型* @return int * returnarray (size=3) "type" => string "image" (length=5) "media_id" => string "-0Lr3rX9mDYBB7i5bDydvwFHHm3zW2Uxt0OoDFBPmGRfYiwckiALqHH_DlP9jCm_" (length=64) "created_at" => int 1400477181 */public function uploadMedia($file, $type = "image") {$file = self::complateUrl($file);$urlarr = parse_url($file);$filetype = explode(".", $urlarr["path"]);$filetype = strtolower($filetype[count($filetype) - 1]);$resizeSize = 100; //图片处理后另存质量if (!key_exists($type, $this->mediaType) || !in_array($filetype, $this->mediaType[$type])) {//return 40005; //格式错误$errarr = array();$errarr["errcode"] = 40005;$errarr["errmsg"] = self::$errorno[$errarr["errcode"]];return $errarr;}$temp_file = $this->tem_file_path . "uploadMedia." . $filetype;$temp_file_resize = $this->tem_file_path . "uploadMediaResize." . $filetype;file_put_contents($temp_file, self::http_get($file));$handle = fopen($temp_file, "r");$fstat = fstat($handle);if ($fstat["size"] > $this->mediaMaxSize[$type]) {$resizeSize = intval($this->mediaMaxSize[$type] / $fstat["size"] * 100);ImageTool::resizeImage($temp_file_resize, $temp_file, 400, 400, $resizeSize); //图片太大再处理压缩$temp_file = $temp_file_resize;//return 40006; //大小错误}$filePath = realpath($temp_file);$uploadUrl = sprintf(self::UPLOAD_MEDIA_URL, $this->access_token, $type);$postData = array("r" => time(), "media" => "@{$filePath}");$result = self::http_post($uploadUrl, $postData);$result = json_decode($result, TRUE);return $result;}/** * 群发图文信息 * @param type $touser 粉丝数组/粉丝组id * @param type $media_id * @return type */public function sendArticles($touser, $media_id) {$errarr = array();$postData = array();$postData["mpnews"] = array("media_id" => $media_id);$postData["msgtype"] = "mpnews";if (is_array($touser)) {//用户列表群发$postData["touser"] = $touser;$url = "https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=%s";} else {$group = intval($touser);$groups = $this->getGroups(true);if (key_exists($group, $groups["list"])) {$postData["filter"] = array("group_id" => $group);} else {$errarr["errcode"] = 40050; //无效分组id$errarr["errmsg"] = self::$errorno[$errarr["errcode"]];return $errarr;}$url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=%s";}$url = sprintf($url, $this->access_token);$result = self::http_post($url, self::json_encode($postData));$result = json_decode($result, TRUE);return $result;}/** * 删除群发信息 * @param type $msgid * @return type */public function delSend($msgid) {$url = "https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=%s";$url = sprintf($url, $this->access_token);$postData = array("msgid" => $msgid, "r" => time());$result = self::http_post($url, self::json_encode($postData));$result = json_decode($result, TRUE);return $result;}/** * 群发图文素材上传 $postData = array("articles" => array($item, $item,...)); $item = array( "thumb_media_id" => "WMQubqCECMQwAjqh8CI500LfhyoG0vmTTlKKJM5oP-of0uLML1_2s26j8XeIorDL", "author" => "xxx", "title" => "Happy Day", "content_source_url" => "www.qq.com", "content" => "content", "digest" => "digest" ); * returnarray (size=3) "type" => string "news" (length=4) "media_id" => string "OuXqv2dgZzxAmK4z-tvStgr6InG18oIllWkD6Tj1qJZVRg-2f64FDU2D3J7dptHs" (length=64) "created_at" => int 1400477183 */public function uploadNews($postData) {$uploadUrl = sprintf(self::UPLOAD_NEWS_URL, $this->access_token);$result = self::http_post($uploadUrl, self::json_encode($postData));$result = json_decode($result, TRUE);return $result;}/** * 获取粉丝列表 * @param type $nextOpenId * @return type */public function getAllConnects($nextOpenId = "") {$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=%s";$url = sprintf($url, $this->access_token, $nextOpenId);$result = self::http_get($url);$result = json_decode($result, TRUE);$count = count($result["data"]["openid"]);$list = $result["data"]["openid"];if ($result["data"]["openid"][$count - 1] == $result["next_openid"]) {return $result["data"]["openid"];} else {$templist = $this->getAllConnects($result["next_openid"]);$list = array_merge($list, $templist);return $list;}}/** * 根据粉丝唯一id获取微信信息 * @param type $openid * @return type */public function getFansInfo($openid) {$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s&lang=zh_CN";$url = sprintf($url, $this->access_token, $openid);$result = self::http_get($url);$result = json_decode($result, TRUE);return $result;}/** * 更新粉丝组信息 * @param type $openid * @param type $groupid * @return type */public function updateFansGroups($openid, $groupid) {$url = "https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=%s";$url = sprintf($url, $this->access_token);$postData = array("to_groupid" => $groupid, "openid" => $openid);$result = self::http_post($url, self::json_encode($postData));$result = json_decode($result, TRUE);$this->getGroups(true);return $result;}/** * 获取粉丝组信息 * @param type $openid * @return type */public function getFansGroupInfo($openid) {$url = "https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=%s";$url = sprintf($url, $this->access_token);$postData = array("r" => time(), "openid" => $openid);$result = self::http_post($url, self::json_encode($postData));$result = json_decode($result, TRUE);return $result["groupid"];}/** * 获取唯一key * @param type $key * @return type */public function getKey($key) {return md5($this->appid . $this->appsecret . $key);}/** * 获取媒体图片到本地 * @param type $mediaid * @return string */public function getMedia($mediaid) {$url = sprintf(self::GET_MEDIA_URL, $this->access_token, $mediaid);$result = self::http_get($url);$temp_file = $this->tem_file_path . "getMedia.jpg";file_put_contents($temp_file, $result);return $temp_file;}/** * 用户组 * @param type $flag 强制刷新用户组 * @return type */public function getGroups($flag = false) {$key = $this->appid . "gasdfev" . $this->appsecret;$result = Cache::get($key);if (empty($result) || $flag) {$url = "https://api.weixin.qq.com/cgi-bin/groups/get?access_token=%s";$url = sprintf($url, $this->access_token);$result = self::http_get($url);$result = json_decode($result, TRUE);$temg = array();$temlist = array();foreach ($result["groups"] as $k => $v) {$temg[$v["id"]] = $v;$temlist[$v["id"]] = $v["name"];}$result["map"] = $temg;$result["list"] = $temlist;Cache::set($key, $result);}return $result;}/** * 新增用户组 * @param type $name * @return type */public function createGroup($name) {$url = "https://api.weixin.qq.com/cgi-bin/groups/create?access_token=%s";$url = sprintf($url, $this->access_token);$result = self::http_post($url, self::json_encode(array("group" => array("name" => $name))));$result = json_decode($result, TRUE);return $result;}/** * 修改用户组 * @param type $id * @param type $name * @return type */public function modifyGroup($id, $name) {$url = "https://api.weixin.qq.com/cgi-bin/groups/update?access_token=%s";$url = sprintf($url, $this->access_token);$result = self::http_post($url, self::json_encode(array("group" => array("id" => $id, "name" => $name))));$result = json_decode($result, TRUE);return $result;}/** * 多客服接入 * @global type $wid * @param type $postObj */public static function responseService($postObj) {global $wid;$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>";$resstr = sprintf($textTpl, $fromUsername, $toUsername, time());echo $resstr;}/** * 微信回复多图文 * @global type $wid * @param type $res * array(array(),array() * ); * @param type $rid * @param type $postObj */public static function response_morearts($res, $postObj) {global $wid;$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles> ITEM </Articles> </xml>";$resstr = sprintf($textTpl, $fromUsername, $toUsername, time(), "news", count($res));$item = "";$subitem = "<item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item>";foreach ($res as $r) {$r["url"] = self::parseUrl($r["url"]);$item .= sprintf($subitem, $r["tit"], $r["des"], self::complateUrl($r["pic"]), self::replaceToWXUrl(self::complateUrl($r["url"]), $postObj));}$resstr = str_replace("ITEM", $item, $resstr);echo $resstr;}/** * url解析 * @param type $url * @return string */public static function complateUrl($url) {if (false === stristr($url, "http://")) {//查找http:// 如果不存在if (0 === strpos($url, "/")) {//查找首字母 如果存在$url = substr($url, 1); //去除/}$url = "http://" . $_SERVER["HTTP_HOST"] . "/" . $url; //拼接完整路径}return $url;}/** * 微信url固定参数替换 * @param type $url * @param type $postObj * @return type */public static function replaceToWXUrl($url, $postObj) {global $wechatid;return str_ireplace("fromUsername", $wechatid, $url);}/** * 完成以下行为 * parseUrlParam * setUrlPublicParam * buildUrlParam * @param type $url * @param type $other 附加参数 基础参数wid wxid wechatid */public static function parseUrl($url, $other = array()) {$url = self::parseUrlParam($url);$url = self::setUrlPublicParam($url);if (is_array($other) && !empty($other)) {$url["param"] = array_merge($url["param"], $other);}$url = self::buildUrlParam($url);return $url;}/** * 分析url * @param type $url * @return type */public static function parseUrlParam($url) {$temp = explode("?", $url);$url0 = $temp[0];$url1 = $temp[1];$p = explode("&", $url1);$param = array();foreach ($p as $v) {$tempp = explode("=", $v);$param[$tempp[0]] = $tempp[1];}return array("url" => $url0, "param" => $param);}/** * 组装url * @param type $arr * @return type */public static function buildUrlParam($arr) {$url = $arr["url"];$param = $arr["param"];$param_arr = array();foreach ($param as $k => $v) {if ($k == "") continue;$param_arr[] = $k . "=" . $v;}return $url . "?" . implode("&", $param_arr) . "#mp.weixin.qq.com";}/** * 设置微信保留参数信息 * @global type $uid * @global type $wid * @global type $wechatid * @param type $url * @return type */public static function setUrlPublicParam($url) {global $uid, $wid, $wechatid;$url["param"]["wid"] = $wid;$url["param"]["wxid"] = $wechatid;$url["param"]["wechatid"] = $wechatid;return $url;}public static $errorno = array("-1" => "系统繁忙","0" => "请求成功","40001" => "获取access_token时AppSecret错误,或者access_token无效","40002" => "不合法的凭证类型","40003" => "不合法的OpenID","40004" => "不合法的媒体文件类型","40005" => "不合法的文件类型","40006" => "不合法的文件大小","40007" => "不合法的媒体文件id","40008" => "不合法的消息类型","40009" => "不合法的图片文件大小","40010" => "不合法的语音文件大小","40011" => "不合法的视频文件大小","40012" => "不合法的缩略图文件大小","40013" => "不合法的APPID","40014" => "不合法的access_token","40015" => "不合法的菜单类型","40016" => "不合法的按钮个数","40017" => "不合法的按钮个数","40018" => "不合法的按钮名字长度","40019" => "不合法的按钮KEY长度","40020" => "不合法的按钮URL长度","40021" => "不合法的菜单版本号","40022" => "不合法的子菜单级数","40023" => "不合法的子菜单按钮个数","40024" => "不合法的子菜单按钮类型","40025" => "不合法的子菜单按钮名字长度","40026" => "不合法的子菜单按钮KEY长度","40027" => "不合法的子菜单按钮URL长度","40028" => "不合法的自定义菜单使用用户","40029" => "不合法的oauth_code","40030" => "不合法的refresh_token","40031" => "不合法的openid列表","40032" => "不合法的openid列表长度","40033" => "不合法的请求字符,不能包含uxxxx格式的字符","40035" => "不合法的参数","40038" => "不合法的请求格式","40039" => "不合法的URL长度","40050" => "不合法的分组id","40051" => "分组名字不合法","40059" => "不合法的消息id","41001" => "缺少access_token参数","41002" => "缺少appid参数","41003" => "缺少refresh_token参数","41004" => "缺少secret参数","41005" => "缺少多媒体文件数据","41006" => "缺少media_id参数","41007" => "缺少子菜单数据","41008" => "缺少oauth code","41009" => "缺少openid","42001" => "access_token超时","42002" => "refresh_token超时","42003" => "oauth_code超时","43001" => "需要GET请求","43002" => "需要POST请求","43003" => "需要HTTPS请求","43004" => "需要接收者关注","43005" => "需要好友关系","44001" => "多媒体文件为空","44002" => "POST的数据包为空","44003" => "图文消息内容为空","44004" => "文本消息内容为空","45001" => "多媒体文件大小超过限制","45002" => "消息内容超过限制","45003" => "标题字段超过限制","45004" => "描述字段超过限制","45005" => "链接字段超过限制","45006" => "图片链接字段超过限制","45007" => "语音播放时间超过限制","45008" => "图文消息超过限制","45009" => "接口调用超过限制","45010" => "创建菜单个数超过限制","45015" => "回复时间超过限制","45016" => "系统分组,不允许修改","45017" => "分组名字过长","45018" => "分组数量超过上限","46001" => "不存在媒体数据","46002" => "不存在的菜单版本","46003" => "不存在的菜单数据","46004" => "不存在的用户","47001" => "解析JSON/XML内容错误","48001" => "api功能未授权","50001" => "用户未授权该api");/** * GET 请求 * @param string $url */public static function http_get($url) {if (!function_exists("curl_init")) {die("curl 未开启");};$oCurl = curl_init();if (stripos($url, "https://") !== FALSE) {curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);}curl_setopt($oCurl, CURLOPT_URL, $url);curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);$sContent = curl_exec($oCurl);$aStatus = curl_getinfo($oCurl);curl_close($oCurl);if (intval($aStatus["http_code"]) == 200) {return $sContent;} else {return false;}}/** * POST 请求 * @param string $url * @param array $param * @return string content */public static function http_post($url, $param, $httpBuildQuery = false) {if (!function_exists("curl_init")) {die("curl 未开启");};$oCurl = curl_init();if (stripos($url, "https://") !== FALSE) {curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);}curl_setopt($oCurl, CURLOPT_URL, $url);curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);//curl_setopt($oCurl, CURLOPT_HTTPHEADER, $header);//设置HTTP头curl_setopt($oCurl, CURLOPT_POST, 1);if ($httpBuildQuery) {$param = http_build_query($param);}curl_setopt($oCurl, CURLOPT_POSTFIELDS, $param);$sContent = curl_exec($oCurl);$aStatus = curl_getinfo($oCurl);curl_close($oCurl);if (intval($aStatus["http_code"]) == 200) {return $sContent;} else {return false;}}/** * 微信api不支持中文转义的json结构 * @param array $arr */static function json_encode($arr) {$parts = array();$is_list = false;//Find out if the given array is a numerical array$keys = array_keys($arr);$max_length = count($arr) - 1;if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1$is_list = true;for ($i = 0; $i < count($keys); $i ++) { //See if each key correspondes to its positionif ($i != $keys [$i]) { //A key fails at position check.$is_list = false; //It is an associative array.break;}}}foreach ($arr as $key => $value) {if (is_array($value)) { //Custom handling for arraysif ($is_list) $parts [] = self::json_encode($value); /* :RECURSION: */else $parts [] = """ . $key . "":" . self::json_encode($value); /* :RECURSION: */} else {$str = "";if (!$is_list) $str = """ . $key . "":";//Custom handling for multiple data typesif (is_numeric($value) && $value < 2000000000) $str .= $value; //Numberselseif ($value === false) $str .= "false"; //The booleanselseif ($value === true) $str .= "true";else $str .= """ . addslashes($value) . """;//All other things// :TODO: Is there any more datatype we should be in the lookout for? (Object?)$parts [] = $str;}}$json = implode(",", $parts);if ($is_list) return "[" . $json . "]"; //Return numerical JSONreturn "{" . $json . "}"; //Return associative JSON}}以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。