ThinkWechat.php類文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 <?php class Wechat { /** * 微信推送過來的數據或響應數據 * @var array */ private $data = array(); /** * 構造方法,用於實例化微信SDK * @param string $token 微信開放平台設置的TOKEN */ public function __construct($token) { $this->auth($token) || exit; if(!empty($_GET['echostr'])){ exit($_GET['echostr']); } else { try { $xml = file_get_contents("php://input"); $xml = new SimpleXMLElement($xml); $xml || exit; foreach ($xml as $key => $value) { $this->data[$key] = strval($value); } }catch(Exception $e){ } } } /** * 獲取微信推送的數據 * @return array 轉換為數組後的數據 */ public function request(){ return $this->data; } /** * * 響應微信發送的信息(自動回復) * @param string $to 接收用戶名 * @param string $from 發送者用戶名 * @param array $content 回復信息,文本信息為string類型 * @param string $type 消息類型 * @param string $flag 是否新標剛接受到的信息 * @return string XML字符串 */ public function response($content, $type = 'text', $flag = 0){ /* 基礎數據 */ $this->data = array( 'ToUserName' => $this->data['FromUserName'], 'FromUserName' => $this->data['ToUserName'], 'CreateTime' => time(), 'MsgType' => $type, ); /* 添加類型數據 */ $this->$type($content); /* 添加狀態 */ $this->data['FuncFlag'] = $flag; /* 轉換數據為XML */ $xml = new SimpleXMLElement('<xml></xml>'); $this->data2xml($xml, $this->data); exit($xml->asXML()); } /** * 回復文本信息 * @param string $content 要回復的信息 */ private function text($content){ $this->data['Content'] = $content; } /** * 回復音樂信息 * @param string $content 要回復的音樂 */ private function music($music){ list( $music['Title'], $music['Description'], $music['MusicUrl'], $music['HQMusicUrl'] ) = $music; $this->data['Music'] = $music; } /** * 回復圖文信息 * @param string $news 要回復的圖文內容 */ private function news($news){ $articles = array(); foreach ($news as $key => $value) { list( $articles[$key]['Title'], $articles[$key]['Description'], $articles[$key]['PicUrl'], $articles[$key]['Url'] ) = $value; if($key >= 9) { break; } //最多只允許10調新聞 } $this->data['ArticleCount'] = count($articles); $this->data['Articles'] = $articles; } /** * 數據XML編碼 * @param object $xml XML對象 * @param mixed $data 數據 * @param string $item 數字索引時的節點名稱 * @return string */ private function data2xml($xml, $data, $item = 'item') { foreach ($data as $key => $value) { /* 指定默認的數字key */ is_numeric($key) && $key = $item; /* 添加子元素 */ if(is_array($value) || is_object($value)){ $child = $xml->addChild($key); $this->data2xml($child, $value, $item); } else { if(is_numeric($value)){ $child = $xml->addChild($key, $value); } else { $child = $xml->addChild($key); $node = dom_import_simplexml($child); $node->appendChild($node->ownerDocument->createCDATASection($value)); } } } } /** * 對數據進行簽名認證,確保是微信發送的數據 * @param string $token 微信開放平台設置的TOKEN * @return boolean true-簽名正確,false-簽名錯誤 */ private function auth($token){ if(empty($_GET['signature'])) return; /* 獲取數據 */ $data = array($_GET['timestamp'], $_GET['nonce'], $token); $sign = $_GET['signature']; /* 對數據進行字典排序 */ sort($data,SORT_STRING); /* 生成簽名 */ $signature = sha1(implode($data)); return $signature === $sign; } }