小潘杂谈

php微信高级接口群发 多客服

字号+ 作者:admin 来源:seo博客 2020-09-08 14:00 我要评论( )

这篇文章主要为大家详细介绍了php微信高级接口群发、多客服的相关资料,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了php微信高级接口群发、多客服源码,供......

这篇文章主要为大家详细介绍了php微信高级接口群发、多客服的相关资料,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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程序设计有所帮助。

更多php微信高级接口群发 多客服相关文章请关注PHP中文网!

转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。转载请注明seohttp://www.hkxiaopan.com

网友点评
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
精彩导读