_appid=$appid; $this->_appsecret=$appsecret; if (isset($_GET['echostr'])) { $this->valid(); } if (ALWAYSCHECK==true){ $check=$this->checkSignature(); if (!$check){ $this->writelog("checkSignature()--非法服务器"); exit; } } $this->_accessToken= $this->getAccessToken(); } public function getAccessToken(){ $dir="./Log"; if (!is_dir($dir)){ mkdir($dir); } $token_file=$dir.'/access_token'; if (file_exists($token_file) && time()-filemtime($token_file)<4800){ $this->writelog("文件中读取的token:".file_get_contents($token_file)); return file_get_contents($token_file); } $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}"; $result=$this->_requestGet($url); if(!$result){ $this->writelog("获取token出错"); return false; } $result_obj=json_decode($result); file_put_contents($token_file, $result_obj->access_token); $this->writelog("url获取的token:".$result_obj->access_token); return $result_obj->access_token; } private function _requestGet($url,$ssl=true){ $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); /* $user_agent=isset($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:''; curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); */ curl_setopt($curl, CURLOPT_AUTOREFERER, true); if ($ssl){ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); } curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response=curl_exec($curl); if ($response===false){ $this-> writelog('_requestGet()--返回值错误'); return false; } return $response; } private function _requestPost($url,$data,$ssl=true){ $curl=curl_init(); curl_setopt($curl, CURLOPT_URL, $url); $user_agent=isset($_SERVER['HTTP_USER_AGENT'])?$$_SERVER['HTTP_USER_AGENT']:''; curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); curl_setopt($curl, CURLOPT_AUTOREFERER, true); if ($ssl){ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); } curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); curl_setopt($curl, CURLOPT_HEADER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $response=curl_exec($curl); if ($response===false){ $this->writelog('_requestPost()--返回值错误'); return false; } //$error=json_decode($response,true); $this->writelog("url:".$url); $this->writelog("curl返回值为".$response); return $response; } public function valid() { $echoStr = $_GET["echostr"]; //valid signature , option if($this->checkSignature()){ $this->writelog( "valid()--第一次验证成功"); echo $echoStr; exit; }else { $this->writelog( "valid()--第一次验证,非法服务器"); exit(); } } private function checkSignature() { // you must define TOKEN by yourself if (!defined("TOKEN")) { throw new Exception('TOKEN is not defined!'); } $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN; $tmpArr = array($token, $timestamp, $nonce); // use SORT_STRING rule sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } private function writelog($activation){ $dir="./Log"; if (!is_dir($dir)){ mkdir($dir); } $filename=date("Y-m-d").".txt"; $open=fopen($dir."/".$filename,"a"); fwrite($open,date("Y-m-d H:i:s")."\t".$activation."\r\n"); fclose($open); } //获取消息 public function responseMsg() { //get post data, May be due to the different environments //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; $postStr = file_get_contents("php://input"); if ($this->debug){ $this->writelog("function:responseMsg--接收到的消息为--".$postStr); } //extract post data if (!empty($postStr)){ /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, the best way is to check the validity of xml by yourself */ libxml_disable_entity_loader(true); $this->msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); foreach ($this->msg as $key=>$v){ $this->writelog("function:responseMsg--接收到的消息为--".$key); $this->writelog("function:responseMsg--接收到的消息为--".$v); } $this->MsgType=strtolower($this->msg['MsgType']); return $this->msg; }else { $this->writelog("消息为空"); return false; } } public function eventMsg($array){ switch ($array['Event']){ case 'subscribe': if (!empty($array['EventKey'])){ $id=substr($array['EventKey'],strpos($array['EventKey'],"qrscene_")+8); $openid=$array['FromUserName']; $time=date("Y-m-d H:i:s"); $pdo = new PDO("sqlsrv:Server=".HOST.";Database=".DB, USER, PASSWORD);//5.6版本pdo连接sqlsrv $sql="SELECT id FROM qrcodeDetail WHERE qrcodeId=".$id." AND openId='".$openid."'"; $selectDate=$pdo->query($sql); $selectRes=$selectDate->fetchAll(PDO::FETCH_ASSOC); if (empty($selectRes)){ $sql1="INSERT INTO qrcodeDetail values($id,'$openid','subscribe','$time')"; $this->writelog("eventMsg function : subscribe:result id=".$id."--sql1-".$sql1); $result=$pdo->exec($sql1); } /* $this->writelog("eventMsg function : SCAN:result id=".$id."---".json_encode($result)); $errinfo=$pdo->errorInfo(); if ($errinfo[0] !='00000') $this->writelog("eventMsg function : SCAN:error id=".$id."---".$errinfo[2]); else{ $res=$result->fetchAll(PDO::FETCH_ASSOC); $this->writelog("eventMsg function : SCAN:res id=".$id."---".json_encode($res)); $headUrl=$res[0]['url']; $this->writelog("eventMsg function : SCAN:headUrl id=".$id."---".$headUrl); header("Location: $headUrl");exit; } */ // $data='{"media_id":"AuXDjP791-NMcyJajUxBLw7rLLVx_s0V9I0l_sS92c0"}'; $sql2="SELECT media_id,url FROM qrcode WHERE id=".$id; $selectDate2=$pdo->query($sql2); $selectRes2=$selectDate2->fetchAll(PDO::FETCH_ASSOC); if (!empty($selectRes2)){ $media_id= $selectRes2[0]['media_id']; $Rurl= $selectRes2[0]['url']; }else { $media_id="AuXDjP791-NMcyJajUxBLzhsCmTK5evvwTjASqBwmv8"; $Rurl="http://wx.zhizhuchuxing.com/bookingHomePage/mdidiDetail.html?prod_code=NSPTSM01"; } $data='{"media_id":"'.$media_id.'"}'; $url="https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=".$this->_accessToken; $response=$this->_requestPost($url, $data); $this->writelog("返回--".$response); $media=json_decode($response,true); $mediaArray=$media['news_item']; $content = array(); foreach ($mediaArray as $k=>$v){ if ($k==0 || $k==1) $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['url']); else $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['content_source_url']); } $this->writelog("返回--".json_encode($content)); if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($array, $content); } } }else{ $data='{"media_id":"AuXDjP791-NMcyJajUxBLw7rLLVx_s0V9I0l_sS92c0"}'; $url="https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=".$this->_accessToken; $response=$this->_requestPost($url, $data); $this->writelog("返回--".$response); $media=json_decode($response,true); $mediaArray=$media['news_item']; $content = array(); foreach ($mediaArray as $k=>$v){ if ($k==0 || $k==1) $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['url']); else $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['content_source_url']); } $this->writelog("返回--".json_encode($content)); if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($array, $content); } } /* $contentStr="朋友你好,欢迎关注蜘蛛出行💐~ 蜘蛛出行是专注于互联网+交通出行的科技品牌,您提供安全舒适便捷的巴士出行服务。 点击下方预订按钮开始体验吧! 点这里预订普陀山门票 免去窗口排队苦恼😄 普陀山官方合作伙伴"; $textTpl=" %s "; $msgType="text"; $result= sprintf($textTpl, $array['FromUserName'], $array['ToUserName'], time(), $msgType, $contentStr); */ } break; case 'SCAN': if (isset($array['EventKey'])){ $pdo = new PDO("sqlsrv:Server=".HOST.";Database=".DB, USER, PASSWORD);//5.6版本pdo连接sqlsrv $id=$array['EventKey']; $openid=$array['FromUserName']; $time=date("Y-m-d H:i:s"); $sql="SELECT id FROM qrcodeDetail WHERE qrcodeId=".$id." AND openId='".$openid."'"; $selectDate=$pdo->query($sql); $selectRes=$selectDate->fetchAll(PDO::FETCH_ASSOC); if (empty($selectRes)){ $sql1="INSERT INTO qrcodeDetail values($id,'$openid','SCAN','$time')"; $this->writelog("eventMsg function : SCAN:result id=".$id."--sql1-".$sql1); $result=$pdo->exec($sql1); } /* $this->writelog("eventMsg function : SCAN:result id=".$id."---".json_encode($result)); $errinfo=$pdo->errorInfo(); if ($errinfo[0] !='00000') $this->writelog("eventMsg function : SCAN:error id=".$id."---".$errinfo[2]); else{ $res=$result->fetchAll(PDO::FETCH_ASSOC); $this->writelog("eventMsg function : SCAN:res id=".$id."---".json_encode($res)); $headUrl=$res[0]['url']; $this->writelog("eventMsg function : SCAN:headUrl id=".$id."---".$headUrl); header("Location: $headUrl");exit; } */ // $data='{"media_id":"AuXDjP791-NMcyJajUxBLw7rLLVx_s0V9I0l_sS92c0"}'; $sql2="SELECT media_id,url FROM qrcode WHERE id=".$id; $selectDate2=$pdo->query($sql2); $selectRes2=$selectDate2->fetchAll(PDO::FETCH_ASSOC); if (!empty($selectRes2)){ $media_id= $selectRes2[0]['media_id']; $Rurl= $selectRes2[0]['url']; }else { $media_id="AuXDjP791-NMcyJajUxBLzhsCmTK5evvwTjASqBwmv8"; $Rurl="http://wx.zhizhuchuxing.com/bookingHomePage/mdidiDetail.html?prod_code=NSPTSM01"; } $data='{"media_id":"'.$media_id.'"}'; $url="https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=".$this->_accessToken; $response=$this->_requestPost($url, $data); $this->writelog("返回--".$response); $media=json_decode($response,true); $mediaArray=$media['news_item']; $content = array(); foreach ($mediaArray as $k=>$v){ if ($k==0 || $k==1) $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['url']); elseif($k==2){ $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['content_source_url']); } else $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['content_source_url']); } $this->writelog("返回--".json_encode($content)); if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($array, $content); } } } break; case 'CLICK': if (isset($array['EventKey']) && $array['EventKey']=='Push-Photo-List'){ $data='{"media_id":"AuXDjP791-NMcyJajUxBLw7rLLVx_s0V9I0l_sS92c0"}'; $url="https://api.weixin.qq.com/cgi-bin/material/get_material?access_token=".$this->_accessToken; $response=$this->_requestPost($url, $data); $this->writelog("返回--".$response); $media=json_decode($response,true); $mediaArray=$media['news_item']; $content = array(); foreach ($mediaArray as $k=>$v){ if ($k==0 || $k==1) $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['url']); else $content[] = array("Title"=>$v['title'], "Description"=>$v['digest'], "PicUrl"=>$v['thumb_url'], "Url" =>$v['content_source_url']); } $this->writelog("返回--".json_encode($content)); if(is_array($content)){ if (isset($content[0]['PicUrl'])){ $result = $this->transmitNews($array, $content); } } } } /* $data='{"type":"news","offset":0,"count":20}'; $url="https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=".$this->_accessToken; $response=$this->_requestPost($url, $data); $this->writelog("返回--".$response); */ $this->writelog("回复用户event--".json_encode($result)); return $result; } private function aa(){ } //把openid存入数据库 public function insertOpenid($data,$type){ $openid=$data['FromUserName']; if ($type =='subscribe'){ $sql="insert into wx_user(openid) values('{$openid}')"; }else if($type =='unsubscribe'){ $sql="delete from wx_user where openid='{$openid}'"; } $result=''; try { $pdo = new PDO("sqlsrv:Server=".HOST.";Database=".DB, USER, PASSWORD);//5.6版本pdo连接sqlsrv //$pdo=new PDO("mysql:host=".HOST.";dbname=".DB,USER,PASSWORD); //7.0版本pdo连接mysql $result=$pdo->exec($sql); $errinfo=$pdo->errorInfo(); if ($errinfo[0] !='00000') $this->writelog($errinfo[2]); } catch (PDOException $e) { $this->writelog($e->getMessage()); } if ($result){ return true; }else { return false; } } //有用户关注的时候推送多图文消息 private function transmitNews($array, $newsArray) { if(!is_array($newsArray)){ return; } $itemTpl = " <![CDATA[%s]]> "; $item_str = ""; foreach ($newsArray as $item){ $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']); } $xmlTpl = " %s %s $item_str "; $result = sprintf($xmlTpl, $array['FromUserName'], $array['ToUserName'], time(), count($newsArray)); return $result; } //获取文本 public function textMsg($data){ $Content=trim($data['Content']); $textTpl=" %s "; $msgType = "text"; $contentStr=$this->simsimiHttp($Content); $this->writelog("textMsg有调用:".$contentStr); $resultStr = sprintf($textTpl, $data['FromUserName'], $data['ToUserName'], time(), $msgType, $contentStr); $this->writelog($resultStr); //return $resultStr; return ""; } private function simsimiHttp($msg){ $url="http://www.xiaodoubi.com/simsimiapi.php?msg=".$msg; $res = file_get_contents($url); file_put_contents("./demo.txt",date("Y-m-d H:i:s")." ".$res.PHP_EOL,FILE_APPEND); if (strpos($res,"xiaodouqqcom") !== false){ $res="无法回答,请不要发一下奇怪的问题或字符😒"; } if (strpos($msg,"主人") !== false){ $res="我的主人是宇宙无敌超级大帅哥^_^人称陌帅"; } return $res; } private function checkAccessToken($check){ if (isset($check['errcode']) && $check['errcode'] ==40001){ $url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appid}&secret={$this->_appsecret}"; $result=$this->_requestGet($url); if(!$result){ $this->writelog("获取token出错"); return false; } $result_obj=json_decode($result); file_put_contents($token_file, $result_obj->access_token); $this->writelog("url获取的token:".$result_obj->access_token); return $result_obj->access_token; } } } ?>