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.上传图文信息至微信素材库 *functionuploadArticlesToWeiXinServer() *2.关键字匹配图文回复 *functiongetArticleData() * *usage: *$options=array( *'token'=>'tokenaccesskey',//填写你设定的key *'appid'=>'wxdk1234567890',//填写高级调用功能的appid *'appsecret'=>'xxxxxxxxxxxxxxxxxxx',//填写高级调用功能的密钥 *); */ classWeiXinTool{ 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=""; //授权地址 constAUTH_URL='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s'; //素材上传 constUPLOAD_MEDIA_URL="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s"; constGET_MEDIA_URL="http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=%s&media_id=%s"; constUPLOAD_NEWS_URL="https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s"; publicfunction__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'); } /** *需修改 *具体业务需求,图文信息上传至素材库 *微站文章上传至微信素材 *@paramtype$wid *@paramtype$aid *@returnint */ publicfunctionuploadArticlesToWeiXinServer($wid,$aid){ //具体图文组装过程,需修改 $m=newModel('website_article'); $m_pubs=newModel('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=newModel('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($resas$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; } /** *需修改 *微站文章关键字匹配数据解析 */ publicstaticfunctiongetArticleData($keyword){ global$wid; $m=newModel('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($articlesas$v){ $m_article=newModel('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 *@paramtype$flag强制刷新accesstoken开关 *@returntype */ publicfunctiongetAccessToken($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']; returntrue; } /** *上传媒体 *@paramtype$file媒体文件$url或者物理路径地址 *@paramtype$type类型 *@returnint *return array(size=3) 'type'=>string'image'(length=5) 'media_id'=>string'-0Lr3rX9mDYBB7i5bDydvwFHHm3zW2Uxt0OoDFBPmGRfYiwckiALqHH_DlP9jCm_'(length=64) 'created_at'=>int1400477181 */ publicfunctionuploadMedia($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])){ //return40005;//格式错误 $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; //return40006;//大小错误 } $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; } /** *群发图文信息 *@paramtype$touser粉丝数组/粉丝组id *@paramtype$media_id *@returntype */ publicfunctionsendArticles($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; } /** *删除群发信息 *@paramtype$msgid *@returntype */ publicfunctiondelSend($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"=>"HappyDay", "content_source_url"=>"www.qq.com", "content"=>"content", "digest"=>"digest" ); *return array(size=3) 'type'=>string'news'(length=4) 'media_id'=>string'OuXqv2dgZzxAmK4z-tvStgr6InG18oIllWkD6Tj1qJZVRg-2f64FDU2D3J7dptHs'(length=64) 'created_at'=>int1400477183 */ publicfunctionuploadNews($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; } /** *获取粉丝列表 *@paramtype$nextOpenId *@returntype */ publicfunctiongetAllConnects($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获取微信信息 *@paramtype$openid *@returntype */ publicfunctiongetFansInfo($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; } /** *更新粉丝组信息 *@paramtype$openid *@paramtype$groupid *@returntype */ publicfunctionupdateFansGroups($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; } /** *获取粉丝组信息 *@paramtype$openid *@returntype */ publicfunctiongetFansGroupInfo($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 *@paramtype$key *@returntype */ publicfunctiongetKey($key){ returnmd5($this->appid.$this->appsecret.$key); } /** *获取媒体图片到本地 *@paramtype$mediaid *@returnstring */ publicfunctiongetMedia($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; } /** *用户组 *@paramtype$flag强制刷新用户组 *@returntype */ publicfunctiongetGroups($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; } /** *新增用户组 *@paramtype$name *@returntype */ publicfunctioncreateGroup($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; } /** *修改用户组 *@paramtype$id *@paramtype$name *@returntype */ publicfunctionmodifyGroup($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; } /** *多客服接入 *@globaltype$wid *@paramtype$postObj */ publicstaticfunctionresponseService($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; } /** *微信回复多图文 *@globaltype$wid *@paramtype$res *array(array(),array() *); *@paramtype$rid *@paramtype$postObj */ publicstaticfunctionresponse_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($resas$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解析 *@paramtype$url *@returnstring */ publicstaticfunctioncomplateUrl($url){ if(false===stristr($url,"http://")){//查找http://如果不存在 if(0===strpos($url,'/')){//查找首字母如果存在 $url=substr($url,1);//去除/ } $url="http://".$_SERVER['HTTP_HOST'].'/'.$url;//拼接完整路径 } return$url; } /** *微信url固定参数替换 *@paramtype$url *@paramtype$postObj *@returntype */ publicstaticfunctionreplaceToWXUrl($url,$postObj){ global$wechatid; returnstr_ireplace('fromUsername',$wechatid,$url); } /** *完成以下行为 *parseUrlParam *setUrlPublicParam *buildUrlParam *@paramtype$url *@paramtype$other附加参数基础参数widwxidwechatid */ publicstaticfunctionparseUrl($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 *@paramtype$url *@returntype */ publicstaticfunctionparseUrlParam($url){ $temp=explode("?",$url); $url0=$temp[0]; $url1=$temp[1]; $p=explode("&",$url1); $param=array(); foreach($pas$v){ $tempp=explode("=",$v); $param[$tempp[0]]=$tempp[1]; } returnarray("url"=>$url0,"param"=>$param); } /** *组装url *@paramtype$arr *@returntype */ publicstaticfunctionbuildUrlParam($arr){ $url=$arr['url']; $param=$arr['param']; $param_arr=array(); foreach($paramas$k=>$v){ if($k=="")continue; $param_arr[]=$k."=".$v; } return$url."?".implode("&",$param_arr)."#mp.weixin.qq.com"; } /** *设置微信保留参数信息 *@globaltype$uid *@globaltype$wid *@globaltype$wechatid *@paramtype$url *@returntype */ publicstaticfunctionsetUrlPublicParam($url){ global$uid,$wid,$wechatid; $url['param']['wid']=$wid; $url['param']['wxid']=$wechatid; $url['param']['wechatid']=$wechatid; return$url; } publicstatic$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'=>'缺少oauthcode', '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请求 *@paramstring$url */ publicstaticfunctionhttp_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{ returnfalse; } } /** *POST请求 *@paramstring$url *@paramarray$param *@returnstringcontent */ publicstaticfunctionhttp_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{ returnfalse; } } /** *微信api不支持中文转义的json结构 *@paramarray$arr */ staticfunctionjson_encode($arr){ $parts=array(); $is_list=false; //Findoutifthegivenarrayisanumericalarray $keys=array_keys($arr); $max_length=count($arr)-1; if(($keys[0]===0)&&($keys[$max_length]===$max_length)){//Seeifthefirstkeyis0andlastkeyislength-1 $is_list=true; for($i=0;$i<count($keys);$i++){//Seeifeachkeycorrespondestoitsposition if($i!=$keys[$i]){//Akeyfailsatpositioncheck. $is_list=false;//Itisanassociativearray. break; } } } foreach($arras$key=>$value){ if(is_array($value)){//Customhandlingforarrays if($is_list)$parts[]=self::json_encode($value);/*:RECURSION:*/ else$parts[]='"'.$key.'":'.self::json_encode($value);/*:RECURSION:*/ }else{ $str=''; if(!$is_list)$str='"'.$key.'":'; //Customhandlingformultipledatatypes if(is_numeric($value)&&$value<2000000000)$str.=$value;//Numbers elseif($value===false)$str.='false';//Thebooleans elseif($value===true)$str.='true'; else$str.='"'.addslashes($value).'"'; //Allotherthings //:TODO:Isthereanymoredatatypeweshouldbeinthelookoutfor?(Object?) $parts[]=$str; } } $json=implode(',',$parts); if($is_list)return'['.$json.']';//ReturnnumericalJSON return'{'.$json.'}';//ReturnassociativeJSON } }
以上就是本文的全部内容,希望对大家学习php程序设计有所帮助。