1 <br /><br /> 2 <?php</p> 3 <p>define("TOKEN", "weixin");</p> 4 <p>$wechatObj = new wechatCallbackapiTest();<br /><br /> 5 if (!isset($_GET['echostr'])) {<br /><br /> 6 $wechatObj->responseMsg();<br /><br /> 7 }else{<br /><br /> 8 $wechatObj->valid();<br /><br /> 9 }</p> 10 <p>class wechatCallbackapiTest<br /><br /> 11 {<br /><br /> 12 //验证消息<br /><br /> 13 public function valid()<br /><br /> 14 {<br /><br /> 15 $echoStr = $_GET["echostr"];<br /><br /> 16 if($this->checkSignature()){<br /><br /> 17 echo $echoStr;<br /><br /> 18 exit;<br /><br /> 19 }<br /><br /> 20 }</p> 21 <p> //检查签名<br /><br /> 22 private function checkSignature()<br /><br /> 23 {<br /><br /> 24 $signature = $_GET["signature"];<br /><br /> 25 $timestamp = $_GET["timestamp"];<br /><br /> 26 $nonce = $_GET["nonce"];<br /><br /> 27 $token = TOKEN;<br /><br /> 28 $tmpArr = array($token, $timestamp, $nonce);<br /><br /> 29 sort($tmpArr, SORT_STRING);<br /><br /> 30 $tmpStr = implode($tmpArr);<br /><br /> 31 $tmpStr = sha1($tmpStr);</p> 32 <p> if($tmpStr == $signature){<br /><br /> 33 return true;<br /><br /> 34 }else{<br /><br /> 35 return false;<br /><br /> 36 }<br /><br /> 37 }</p> 38 <p> //响应消息<br /><br /> 39 public function responseMsg()<br /><br /> 40 {<br /><br /> 41 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];<br /><br /> 42 if (!empty($postStr)){<br /><br /> 43 $this->logger("R ".$postStr);<br /><br /> 44 $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);<br /><br /> 45 $RX_TYPE = trim($postObj->MsgType);</p> 46 <p> //消息类型分离<br /><br /> 47 switch ($RX_TYPE)<br /><br /> 48 {<br /><br /> 49 case "event":<br /><br /> 50 $result = $this->receiveEvent($postObj);<br /><br /> 51 break;<br /><br /> 52 case "text":<br /><br /> 53 $result = $this->receiveText($postObj);<br /><br /> 54 break;<br /><br /> 55 case "image":<br /><br /> 56 $result = $this->receiveImage($postObj);<br /><br /> 57 break;<br /><br /> 58 case "location":<br /><br /> 59 $result = $this->receiveLocation($postObj);<br /><br /> 60 break;<br /><br /> 61 case "voice":<br /><br /> 62 $result = $this->receiveVoice($postObj);<br /><br /> 63 break;<br /><br /> 64 case "video":<br /><br /> 65 $result = $this->receiveVideo($postObj);<br /><br /> 66 break;<br /><br /> 67 case "link":<br /><br /> 68 $result = $this->receiveLink($postObj);<br /><br /> 69 break;<br /><br /> 70 default:<br /><br /> 71 $result = "unknown msg type: ".$RX_TYPE;<br /><br /> 72 break;<br /><br /> 73 }<br /><br /> 74 $this->logger("T ".$result);<br /><br /> 75 echo $result;<br /><br /> 76 }else {<br /><br /> 77 echo "";<br /><br /> 78 exit;<br /><br /> 79 }<br /><br /> 80 }</p> 81 <p> //接收事件消息<br /><br /> 82 private function receiveEvent($object)<br /><br /> 83 {<br /><br /> 84 $content = "";<br /><br /> 85 switch ($object->Event)<br /><br /> 86 {<br /><br /> 87 case "subscribe":<br /><br /> 88 $content = "欢迎关注方倍工作室 ";<br /><br /> 89 $content .= (!empty($object->EventKey))?("\n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";<br /><br /> 90 break;<br /><br /> 91 case "unsubscribe":<br /><br /> 92 $content = "取消关注";<br /><br /> 93 break;<br /><br /> 94 case "SCAN":<br /><br /> 95 $content = "扫描场景 ".$object->EventKey;<br /><br /> 96 break;<br /><br /> 97 case "CLICK":<br /><br /> 98 switch ($object->EventKey)<br /><br /> 99 {<br /><br /> 100 case "COMPANY":<br /><br /> 101 $content = "方倍工作室提供互联网相关产品与服务。";<br /><br /> 102 break;<br /><br /> 103 default:<br /><br /> 104 $content = "点击菜单:".$object->EventKey;<br /><br /> 105 break;<br /><br /> 106 }<br /><br /> 107 break;<br /><br /> 108 case "LOCATION":<br /><br /> 109 $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude;<br /><br /> 110 break;<br /><br /> 111 case "VIEW":<br /><br /> 112 $content = "跳转链接 ".$object->EventKey;<br /><br /> 113 break;<br /><br /> 114 case "MASSSENDJOBFINISH":<br /><br /> 115 $content = "消息ID:".$object->MsgID.",结果:".$object->Status.",粉丝数:".$object->TotalCount.",过滤:".$object->FilterCount.",发送成功:".$object->SentCount.",发送失败:".$object->ErrorCount;<br /><br /> 116 break;<br /><br /> 117 default:<br /><br /> 118 $content = "receive a new event: ".$object->Event;<br /><br /> 119 break;<br /><br /> 120 }<br /><br /> 121 if(is_array($content)){<br /><br /> 122 if (isset($content[0]['PicUrl'])){<br /><br /> 123 $result = $this->transmitNews($object, $content);<br /><br /> 124 }else if (isset($content['MusicUrl'])){<br /><br /> 125 $result = $this->transmitMusic($object, $content);<br /><br /> 126 }<br /><br /> 127 }else{<br /><br /> 128 $result = $this->transmitText($object, $content);<br /><br /> 129 }<br /><br /> 130 return $result;<br /><br /> 131 }</p> 132 <p> //接收文本消息<br /><br /> 133 private function receiveText($object)<br /><br /> 134 {<br /><br /> 135 $keyword = trim($object->Content);<br /><br /> 136 //多客服人工回复模式<br /><br /> 137 if (strstr($keyword, "您好") || strstr($keyword, "你好") || strstr($keyword, "在吗")){<br /><br /> 138 $result = $this->transmitService($object);<br /><br /> 139 }<br /><br /> 140 //自动回复模式<br /><br /> 141 else{<br /><br /> 142 if (strstr($keyword, "文本")){<br /><br /> 143 $content = "这是个文本消息";<br /><br /> 144 }else if (strstr($keyword, "图文") || strstr($keyword, "单图文")){<br /><br /> 145 $content = array();<br /><br /> 146 $content[] = array("Title"=>"单图文标题", "Description"=>"单图文内容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");<br /><br /> 147 }else if (strstr($keyword, "多图文")){<br /><br /> 148 $content = array();<br /><br /> 149 $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");<br /><br /> 150 $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");<br /><br /> 151 $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");<br /><br /> 152 break;<br /><br /> 153 }else if (strstr($keyword, "音乐")){<br /><br /> 154 $content = array();<br /><br /> 155 $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");<br /><br /> 156 }else{<br /><br /> 157 $content = date("Y-m-d H:i:s",time())."\n技术支持 方倍工作室";<br /><br /> 158 }</p> 159 <p> if(is_array($content)){<br /><br /> 160 if (isset($content[0]['PicUrl'])){<br /><br /> 161 $result = $this->transmitNews($object, $content);<br /><br /> 162 }else if (isset($content['MusicUrl'])){<br /><br /> 163 $result = $this->transmitMusic($object, $content);<br /><br /> 164 }<br /><br /> 165 }else{<br /><br /> 166 $result = $this->transmitText($object, $content);<br /><br /> 167 }<br /><br /> 168 }</p> 169 <p> return $result;<br /><br /> 170 }</p> 171 <p> //接收图片消息<br /><br /> 172 private function receiveImage($object)<br /><br /> 173 {<br /><br /> 174 $content = array("MediaId"=>$object->MediaId);<br /><br /> 175 $result = $this->transmitImage($object, $content);<br /><br /> 176 return $result;<br /><br /> 177 }</p> 178 <p> //接收位置消息<br /><br /> 179 private function receiveLocation($object)<br /><br /> 180 {<br /><br /> 181 $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;<br /><br /> 182 $result = $this->transmitText($object, $content);<br /><br /> 183 return $result;<br /><br /> 184 }</p> 185 <p> //接收语音消息<br /><br /> 186 private function receiveVoice($object)<br /><br /> 187 {<br /><br /> 188 if (isset($object->Recognition) && !empty($object->Recognition)){<br /><br /> 189 $content = "你刚才说的是:".$object->Recognition;<br /><br /> 190 $result = $this->transmitText($object, $content);<br /><br /> 191 }else{<br /><br /> 192 $content = array("MediaId"=>$object->MediaId);<br /><br /> 193 $result = $this->transmitVoice($object, $content);<br /><br /> 194 }</p> 195 <p> return $result;<br /><br /> 196 }</p> 197 <p> //接收视频消息<br /><br /> 198 private function receiveVideo($object)<br /><br /> 199 {<br /><br /> 200 $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");<br /><br /> 201 $result = $this->transmitVideo($object, $content);<br /><br /> 202 return $result;<br /><br /> 203 }</p> 204 <p> //接收链接消息<br /><br /> 205 private function receiveLink($object)<br /><br /> 206 {<br /><br /> 207 $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;<br /><br /> 208 $result = $this->transmitText($object, $content);<br /><br /> 209 return $result;<br /><br /> 210 }</p> 211 <p> //回复文本消息<br /><br /> 212 private function transmitText($object, $content)<br /><br /> 213 {<br /><br /> 214 $xmlTpl = "<xml><br /><br /> 215 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 216 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 217 <CreateTime>%s</CreateTime><br /><br /> 218 <MsgType><![CDATA[text]]></MsgType><br /><br /> 219 <Content><![CDATA[%s]]></Content><br /><br /> 220 </xml>";<br /><br /> 221 $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);<br /><br /> 222 return $result;<br /><br /> 223 }</p> 224 <p> //回复图片消息<br /><br /> 225 private function transmitImage($object, $imageArray)<br /><br /> 226 {<br /><br /> 227 $itemTpl = "<Image><br /><br /> 228 <MediaId><![CDATA[%s]]></MediaId><br /><br /> 229 </Image>";</p> 230 <p> $item_str = sprintf($itemTpl, $imageArray['MediaId']);</p> 231 <p> $xmlTpl = "<xml><br /><br /> 232 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 233 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 234 <CreateTime>%s</CreateTime><br /><br /> 235 <MsgType><![CDATA[image]]></MsgType><br /><br /> 236 $item_str<br /><br /> 237 </xml>";</p> 238 <p> $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());<br /><br /> 239 return $result;<br /><br /> 240 }</p> 241 <p> //回复语音消息<br /><br /> 242 private function transmitVoice($object, $voiceArray)<br /><br /> 243 {<br /><br /> 244 $itemTpl = "<Voice><br /><br /> 245 <MediaId><![CDATA[%s]]></MediaId><br /><br /> 246 </Voice>";</p> 247 <p> $item_str = sprintf($itemTpl, $voiceArray['MediaId']);</p> 248 <p> $xmlTpl = "<xml><br /><br /> 249 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 250 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 251 <CreateTime>%s</CreateTime><br /><br /> 252 <MsgType><![CDATA[voice]]></MsgType><br /><br /> 253 $item_str<br /><br /> 254 </xml>";</p> 255 <p> $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());<br /><br /> 256 return $result;<br /><br /> 257 }</p> 258 <p> //回复视频消息<br /><br /> 259 private function transmitVideo($object, $videoArray)<br /><br /> 260 {<br /><br /> 261 $itemTpl = "<Video><br /><br /> 262 <MediaId><![CDATA[%s]]></MediaId><br /><br /> 263 <ThumbMediaId><![CDATA[%s]]></ThumbMediaId><br /><br /> 264 <Title><![CDATA[%s]]></Title><br /><br /> 265 <Description><![CDATA[%s]]></Description><br /><br /> 266 </Video>";</p> 267 <p> $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);</p> 268 <p> $xmlTpl = "<xml><br /><br /> 269 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 270 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 271 <CreateTime>%s</CreateTime><br /><br /> 272 <MsgType><![CDATA[video]]></MsgType><br /><br /> 273 $item_str<br /><br /> 274 </xml>";</p> 275 <p> $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());<br /><br /> 276 return $result;<br /><br /> 277 }</p> 278 <p> //回复图文消息<br /><br /> 279 private function transmitNews($object, $newsArray)<br /><br /> 280 {<br /><br /> 281 if(!is_array($newsArray)){<br /><br /> 282 return;<br /><br /> 283 }<br /><br /> 284 $itemTpl = " <item><br /><br /> 285 <Title><![CDATA[%s]]></Title><br /><br /> 286 <Description><![CDATA[%s]]></Description><br /><br /> 287 <PicUrl><![CDATA[%s]]></PicUrl><br /><br /> 288 <Url><![CDATA[%s]]></Url><br /><br /> 289 </item><br /><br /> 290 ";<br /><br /> 291 $item_str = "";<br /><br /> 292 foreach ($newsArray as $item){<br /><br /> 293 $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);<br /><br /> 294 }<br /><br /> 295 $xmlTpl = "<xml><br /><br /> 296 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 297 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 298 <CreateTime>%s</CreateTime><br /><br /> 299 <MsgType><![CDATA[news]]></MsgType><br /><br /> 300 <ArticleCount>%s</ArticleCount><br /><br /> 301 <Articles><br /><br /> 302 $item_str</Articles><br /><br /> 303 </xml>";</p> 304 <p> $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));<br /><br /> 305 return $result;<br /><br /> 306 }</p> 307 <p> //回复音乐消息<br /><br /> 308 private function transmitMusic($object, $musicArray)<br /><br /> 309 {<br /><br /> 310 $itemTpl = "<Music><br /><br /> 311 <Title><![CDATA[%s]]></Title><br /><br /> 312 <Description><![CDATA[%s]]></Description><br /><br /> 313 <MusicUrl><![CDATA[%s]]></MusicUrl><br /><br /> 314 <HQMusicUrl><![CDATA[%s]]></HQMusicUrl><br /><br /> 315 </Music>";</p> 316 <p> $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);</p> 317 <p> $xmlTpl = "<xml><br /><br /> 318 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 319 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 320 <CreateTime>%s</CreateTime><br /><br /> 321 <MsgType><![CDATA[music]]></MsgType><br /><br /> 322 $item_str<br /><br /> 323 </xml>";</p> 324 <p> $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());<br /><br /> 325 return $result;<br /><br /> 326 }</p> 327 <p> //回复多客服消息<br /><br /> 328 private function transmitService($object)<br /><br /> 329 {<br /><br /> 330 $xmlTpl = "<xml><br /><br /> 331 <ToUserName><![CDATA[%s]]></ToUserName><br /><br /> 332 <FromUserName><![CDATA[%s]]></FromUserName><br /><br /> 333 <CreateTime>%s</CreateTime><br /><br /> 334 <MsgType><![CDATA[transfer_customer_service]]></MsgType><br /><br /> 335 </xml>";<br /><br /> 336 $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());<br /><br /> 337 return $result;<br /><br /> 338 }</p> 339 <p> //日志记录<br /><br /> 340 private function logger($log_content)<br /><br /> 341 {<br /><br /> 342 if(isset($_SERVER['HTTP_APPNAME'])){ //SAE<br /><br /> 343 sae_set_display_errors(false);<br /><br /> 344 sae_debug($log_content);<br /><br /> 345 sae_set_display_errors(true);<br /><br /> 346 }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL<br /><br /> 347 $max_size = 10000;<br /><br /> 348 $log_filename = "log.xml";<br /><br /> 349 if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}<br /><br /> 350 file_put_contents($log_filename, date('H:i:s')." ".$log_content."\r\n", FILE_APPEND);<br /><br /> 351 }<br /><br /> 352 }<br /><br /> 353 }<br /><br /> 354 ?><br /><br />