sq.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <?php
  2. /*
  3. 方倍工作室 http://www.cnblogs.com/txw1958/
  4. CopyRight 2014 All Rights Reserved
  5. */
  6. //echo "success";
  7. define("TOKEN", "eqcxcx");
  8. define("AppID", "wxd6972323f37bfdf0");//Appsecret
  9. define("Appsecret", "e7c30a645edec78aa64d30a92024237b");
  10. define("EncodingAESKey", "53o42sbbzslie4tjbll3ta5zlwe11rrk53o42sbbzsl");
  11. require_once('php/wxBizMsgCrypt.php');
  12. $wechatObj = new wechatCallbackapiTest();
  13. if (!isset($_GET['echostr'])) {
  14. $wechatObj->responseMsg();
  15. }else{
  16. $wechatObj->valid();
  17. }
  18. class wechatCallbackapiTest
  19. {
  20. //验证签名
  21. public function valid()
  22. {
  23. $echoStr = $_GET["echostr"];
  24. $signature = $_GET["signature"];
  25. $timestamp = $_GET["timestamp"];
  26. $nonce = $_GET["nonce"];
  27. $tmpArr = array(TOKEN, $timestamp, $nonce);
  28. sort($tmpArr);
  29. $tmpStr = implode($tmpArr);
  30. $tmpStr = sha1($tmpStr);
  31. if($tmpStr == $signature){
  32. // echo $echoStr;
  33. exit;
  34. }
  35. }
  36. //响应消息
  37. public function responseMsg()
  38. {
  39. $timestamp = $_GET['timestamp'];
  40. $nonce = $_GET["nonce"];
  41. $msg_signature = $_GET['msg_signature'];
  42. $encrypt_type = (isset($_GET['encrypt_type']) && ($_GET['encrypt_type'] == 'aes')) ? "aes" : "raw";
  43. $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
  44. if (!empty($postStr)){
  45. //解密
  46. if ($encrypt_type == 'aes'){
  47. $pc = new WXBizMsgCrypt(TOKEN, EncodingAESKey, AppID);
  48. $this->logger(" D \r\n".$postStr);
  49. $decryptMsg = ""; //解密后的明文
  50. $errCode = $pc->DecryptMsg($msg_signature, $timestamp, $nonce, $postStr, $decryptMsg);
  51. $postStr = $decryptMsg;
  52. }
  53. $this->logger(" R \r\n".$postStr);
  54. $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
  55. $RX_TYPE = trim($postObj->MsgType);
  56. $ComponentVerifyTicket = trim($postObj->ComponentVerifyTicket);
  57. $this->logger(" T: \r\n".$ComponentVerifyTicket);
  58. if($ComponentVerifyTicket<>''){//保存即可.
  59. $res=file_put_contents("json/VerifyTicket.json", $ComponentVerifyTicket);
  60. if (ob_get_level() == 0) ob_start();
  61. ob_implicit_flush(true);
  62. ob_clean();
  63. header("Content-type: text/plain");
  64. #log_msg(headers_list());
  65. echo("success");
  66. ob_flush();
  67. flush();
  68. ob_end_flush();
  69. die();
  70. exit();
  71. $data_string='{
  72. "component_appid":"'.AppID.'" ,
  73. "component_appsecret": "'.Appsecret.'",
  74. "component_verify_ticket": "'.$ComponentVerifyTicket.'"
  75. }';
  76. // $bbb = http_post_data("https://api.weixin.qq.com/cgi-bin/component/api_component_token", $data_string);
  77. $this->logger(" B \r\n".$bbb);
  78. // exit;
  79. //echo "sucsess";
  80. }
  81. //消息类型分离
  82. switch ($RX_TYPE)
  83. {
  84. case "event":
  85. $result = $this->receiveEvent($postObj);
  86. break;
  87. case "text":
  88. $result = $this->receiveText($postObj);
  89. break;
  90. }
  91. $this->logger(" Re: \r\n".$RX_TYPE.$result);
  92. //加密
  93. if ($encrypt_type == 'aes'){
  94. $encryptMsg = ''; //加密后的密文
  95. $errCode = $pc->encryptMsg($result, $timeStamp, $nonce, $encryptMsg);
  96. $result = $encryptMsg;
  97. $this->logger(" E \r\n".$result);
  98. }
  99. echo $result;
  100. }else {
  101. echo "";
  102. exit;
  103. }
  104. }
  105. //接收事件消息
  106. private function receiveEvent($object)
  107. {
  108. $content = "";
  109. switch ($object->Event)
  110. {
  111. case "subscribe":
  112. $content = "欢迎关注方倍工作室 ";
  113. break;
  114. }
  115. $result = $this->transmitText($object, $content);
  116. return $result;
  117. }
  118. //接收文本消息
  119. private function receiveText($object)
  120. {
  121. $keyword = trim($object->Content);
  122. if (strstr($keyword, "文本")){
  123. $content = "这是个文本消息";
  124. }else if (strstr($keyword, "单图文")){
  125. $content = array();
  126. $content[] = array("Title"=>"单图文标题", "Description"=>"单图文内容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
  127. }else if (strstr($keyword, "图文") || strstr($keyword, "多图文")){
  128. $content = array();
  129. $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
  130. $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
  131. $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
  132. }else if (strstr($keyword, "音乐")){
  133. $content = array();
  134. $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
  135. }else{
  136. $content = date("Y-m-d H:i:s",time())."\n".$object->FromUserName."\n技术支持 方倍工作室";
  137. }
  138. if(is_array($content)){
  139. if (isset($content[0])){
  140. $result = $this->transmitNews($object, $content);
  141. }else if (isset($content['MusicUrl'])){
  142. $result = $this->transmitMusic($object, $content);
  143. }
  144. }else{
  145. $result = $this->transmitText($object, $content);
  146. }
  147. return $result;
  148. }
  149. //回复文本消息
  150. private function transmitText($object, $content)
  151. {
  152. $xmlTpl = "<xml>
  153. <ToUserName><![CDATA[%s]]></ToUserName>
  154. <FromUserName><![CDATA[%s]]></FromUserName>
  155. <CreateTime>%s</CreateTime>
  156. <MsgType><![CDATA[text]]></MsgType>
  157. <Content><![CDATA[%s]]></Content>
  158. </xml>";
  159. $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), $content);
  160. return $result;
  161. }
  162. //回复图文消息
  163. private function transmitNews($object, $newsArray)
  164. {
  165. if(!is_array($newsArray)){
  166. return;
  167. }
  168. $itemTpl = " <item>
  169. <Title><![CDATA[%s]]></Title>
  170. <Description><![CDATA[%s]]></Description>
  171. <PicUrl><![CDATA[%s]]></PicUrl>
  172. <Url><![CDATA[%s]]></Url>
  173. </item>
  174. ";
  175. $item_str = "";
  176. foreach ($newsArray as $item){
  177. $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
  178. }
  179. $xmlTpl = "<xml>
  180. <ToUserName><![CDATA[%s]]></ToUserName>
  181. <FromUserName><![CDATA[%s]]></FromUserName>
  182. <CreateTime>%s</CreateTime>
  183. <MsgType><![CDATA[news]]></MsgType>
  184. <ArticleCount>%s</ArticleCount>
  185. <Articles>
  186. $item_str </Articles>
  187. </xml>";
  188. $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
  189. return $result;
  190. }
  191. //回复音乐消息
  192. private function transmitMusic($object, $musicArray)
  193. {
  194. $itemTpl = "<Music>
  195. <Title><![CDATA[%s]]></Title>
  196. <Description><![CDATA[%s]]></Description>
  197. <MusicUrl><![CDATA[%s]]></MusicUrl>
  198. <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
  199. </Music>";
  200. $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
  201. $xmlTpl = "<xml>
  202. <ToUserName><![CDATA[%s]]></ToUserName>
  203. <FromUserName><![CDATA[%s]]></FromUserName>
  204. <CreateTime>%s</CreateTime>
  205. <MsgType><![CDATA[music]]></MsgType>
  206. $item_str
  207. </xml>";
  208. $result = sprintf($xmlTpl, $object->FromUserName, $object->ToUserName, time());
  209. return $result;
  210. }
  211. //日志记录
  212. public function logger($log_content)
  213. {
  214. if(isset($_SERVER['HTTP_APPNAME'])){ //SAE
  215. sae_set_display_errors(false);
  216. sae_debug($log_content);
  217. sae_set_display_errors(true);
  218. }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
  219. $max_size = 500000;
  220. $log_filename = "log_wx.xml";
  221. if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
  222. file_put_contents($log_filename, date('Y-m-d H:i:s').$log_content."\r\n", FILE_APPEND);
  223. }
  224. }
  225. public function getToken($appid,$appsecret,$jsonid){
  226. $file = file_get_contents("json/{$jsonid}_token.json",true);
  227. $result = json_decode($file,true);
  228. if (time() > $result['expires']){
  229. $data = array();
  230. $data['access_token'] = getNewToken($appid,$appsecret);
  231. $data['expires']=time()+7200;
  232. $jsonStr = json_encode($data);
  233. $fp = fopen("json/{$jsonid}_token.json", "w");
  234. fwrite($fp, $jsonStr);
  235. fclose($fp);
  236. return $data['access_token'];
  237. }else{
  238. return $result['access_token'];
  239. }
  240. }
  241. public function getNewToken($appid,$appsecret){
  242. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
  243. $access_token_Arr = https_request($url);
  244. return $access_token_Arr['access_token'];
  245. }
  246. public function https_request ($url){
  247. $ch = curl_init();
  248. curl_setopt($ch, CURLOPT_URL, $url);
  249. curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  250. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  251. $out = curl_exec($ch);
  252. curl_close($ch);
  253. return json_decode($out,true);
  254. }
  255. public function http_post_data($url, $data_string) {
  256. $ch = curl_init();
  257. curl_setopt($ch, CURLOPT_POST, 1);
  258. curl_setopt($ch, CURLOPT_URL, $url);
  259. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
  260. curl_setopt($ch, CURLOPT_HTTPHEADER, array(
  261. 'Content-Type: application/json; charset=utf-8',
  262. 'Content-Length: ' . strlen($data_string))
  263. );
  264. ob_start();
  265. curl_exec($ch);
  266. $return_content = ob_get_contents();
  267. //echo $return_content."<br>";
  268. ob_end_clean();
  269. $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  270. // return array($return_code, $return_content);
  271. return $return_content;
  272. }
  273. }
  274. ?>