1 <?php 2 /** 3 * wechat php test 4 */ 5 6 //define your token 7 define("TOKEN", "weixin"); 8 $wechatObj = new wechatCallbackapiTest(); 9 //验证服务器和公众平台是否连接成功 10 //在服务器和公众平台验证成功之后,把$wechatObj->valid()注释掉 11 // $wechatObj->valid(); 12 echo $wechatObj->responseMsg(); 13 14 class wechatCallbackapiTest 15 { 16 public function valid() 17 { 18 $echoStr = $_GET["echostr"]; 19 20 //valid signature , option 21 if($this->checkSignature()){ 22 echo $echoStr; 23 exit; 24 } 25 } 26 //输出公众平台返回给用户的信息 27 public function responseMsg() 28 { 29 //get post data, May be due to the different environments 30 //相当于$_POST 31 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 32 33 //extract post data 34 if (!empty($postStr)){ 35 /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection, 36 the best way is to check the validity of xml by yourself */ 37 //只解析XML数据的主体部分,防止xxe攻击 38 libxml_disable_entity_loader(true); 39 //解析XML数据 40 $postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA); 41 //获取手机用户的OPenID 42 $fromUsername = $postObj->FromUserName; 43 //开发者微信号 44 $toUsername = $postObj->ToUserName; 45 //发送文本信息的关键字 46 $keyword = trim($postObj->Content); 47 //发送消息的类型 48 $type = $postObj->MsgType; 49 50 $time = time(); 51 //发送文本信息的字符串模板 52 $textTpl = "<xml> 53 <ToUserName><![CDATA[%s]]></ToUserName> 54 <FromUserName><![CDATA[%s]]></FromUserName> 55 <CreateTime>%s</CreateTime> 56 <MsgType><![CDATA[%s]]></MsgType> 57 <Content><![CDATA[%s]]></Content> 58 <FuncFlag>0</FuncFlag> 59 </xml>"; 60 //音乐消息的模板 61 $musicTpl = "<xml> 62 <ToUserName><![CDATA[%s]]></ToUserName> 63 <FromUserName><![CDATA[%s]]></FromUserName> 64 <CreateTime>%s</CreateTime> 65 <MsgType><![CDATA[%s]]></MsgType> 66 <Music> 67 <Title><![CDATA[%s]]></Title> 68 <Description><![CDATA[%s]]></Description> 69 <MusicUrl><![CDATA[%s]]></MusicUrl> 70 <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> 71 72 </Music> 73 </xml>"; 74 //发送图文消息 75 $newsTpl="<xml> 76 <ToUserName><![CDATA[%s]]></ToUserName> 77 <FromUserName><![CDATA[%s]]></FromUserName> 78 <CreateTime>%s</CreateTime> 79 <MsgType><![CDATA[%s]]></MsgType> 80 <ArticleCount>%s</ArticleCount> 81 <Articles> 82 %s 83 </Articles> 84 </xml> "; 85 if($type == ‘text‘){ 86 if(!empty( $keyword )) 87 { 88 // if($keyword == ‘音乐‘){ 89 // $msgType = "music"; 90 // $title = "See You Again"; 91 // $description=‘速度与激情7 原声大碟‘; 92 // $music_url=‘http://www.yyzljg.com/wechat/music.mp3‘; 93 // $high_url=‘http://www.yyzljg.com/wechat/music.mp3‘; 94 // //格式化字符串 95 // $resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $msgType,$title,$description,$music_url,$high_url); 96 // echo $resultStr; 97 // } 98 if($keyword==‘音乐‘){ 99 $msgType=‘music‘; 100 $title=‘冰雪奇缘主题曲‘; 101 $description=‘原声大碟‘; 102 $music_url=‘http://www.yyzljg.com/wechat/music.mp3‘; 103 $high_url=‘http://www.yyzljg.com/wechat/music.mp3‘; 104 //格式化字符串 105 $resultStr = sprintf($musicTpl, $fromUsername, $toUsername, $time, $msgType,$title,$description,$music_url,$high_url); 106 echo $resultStr; 107 } 108 if($keyword == ‘单图文‘){ 109 $msgType=‘news‘; 110 $counts=1; 111 $contentStr="<item> 112 <Title><![CDATA[大家一起学习微信开发]]></Title> 113 <Description><![CDATA[愿每天的你都是开心的!]]></Description> 114 <PicUrl><![CDATA[http://ibeliveone.applinzi.com/1.jpg]]></PicUrl> 115 <Url><![CDATA[http://ibeliveone.applinzi.com/1.jpg]]></Url> 116 </item>"; 117 118 //格式化字符串 119 $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, $msgType,$counts,$contentStr); 120 echo $resultStr; 121 } 122 if($keyword == ‘多图文‘){ 123 $msgType=‘news‘; 124 $counts=4; 125 $contentStr=‘‘; 126 for($i=1;$i<=4;$i++){ 127 $contentStr.="<item> 128 <Title><![CDATA[大家一起学习微信开发]]></Title> 129 <Description><![CDATA[愿每天的你都是开心的!]]></Description> 130 <PicUrl><![CDATA[http://ibeliveone.applinzi.com/{$i}.jpg]]></PicUrl> 131 <Url><![CDATA[http://ibeliveone.applinzi.com/{$i}.jpg]]></Url> 132 </item>"; 133 } 134 //格式化字符串 135 $resultStr = sprintf($newsTpl, $fromUsername, $toUsername, $time, $msgType,$counts,$contentStr); 136 echo $resultStr; 137 } 138 139 //定义发送消息的类型 140 $msgType = "text"; 141 //公众平台发送给用户的信息 142 $contentStr = "欢迎关注我的微信公众平台!"; 143 //格式化字符串 144 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 145 echo $resultStr;die; 146 147 148 }else{ 149 echo "Input something..."; 150 } 151 }elseif($type == ‘image‘){ 152 //定义发送消息的类型 153 $msgType = "text"; 154 //公众平台发送给用户的信息 155 $contentStr = "客官,您发送的美女好漂亮啊!"; 156 //格式化字符串 157 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 158 echo $resultStr; 159 die; 160 }elseif($type == ‘voice‘){ 161 //定义发送消息的类型 162 $msgType = "text"; 163 //公众平台发送给用户的信息 164 $contentStr = "客官,您的声音好动听啊!"; 165 //格式化字符串 166 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 167 echo $resultStr; 168 die; 169 }elseif($type == ‘video‘){ 170 //定义发送消息的类型 171 $msgType = "text"; 172 //公众平台发送给用户的信息 173 $contentStr = "客官,您分享的片片不是高清滴呦!"; 174 //格式化字符串 175 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 176 echo $resultStr; 177 die; 178 }else{ 179 //定义发送消息的类型 180 $msgType = "text"; 181 //公众平台发送给用户的信息 182 $contentStr = "客官,我书读的少,不知道你想要什么服务,回复关键字有惊喜:‘音乐‘,‘单图文‘,‘多图文‘"; 183 //格式化字符串 184 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); 185 echo $resultStr; 186 die; 187 } 188 189 190 }else { 191 echo "客官,我书读的少,不知道你想要什么服务,回复关键字有惊喜:‘音乐‘,‘单图文‘,‘多图文‘"; 192 exit; 193 } 194 } 195 196 private function checkSignature() 197 { 198 // you must define TOKEN by yourself 199 if (!defined("TOKEN")) { 200 throw new Exception(‘TOKEN is not defined!‘); 201 } 202 203 $signature = $_GET["signature"]; 204 $timestamp = $_GET["timestamp"]; 205 $nonce = $_GET["nonce"]; 206 207 $token = TOKEN; 208 $tmpArr = array($token, $timestamp, $nonce); 209 // use SORT_STRING rule 210 sort($tmpArr, SORT_STRING); 211 $tmpStr = implode( $tmpArr ); 212 $tmpStr = sha1( $tmpStr ); 213 214 if( $tmpStr == $signature ){ 215 return true; 216 }else{ 217 return false; 218 } 219 } 220 } 221 222 ?>