其實消息接口原理 就是微信 請求你後臺寫的地址接口簽名驗證 然後就可以操作了
<?php /** * 微信公衆平臺PHP-SDK, 官方API部分 * @author dodge * @link https://github.com/dodgepudding/wechat-php-sdk * @version 1.1 * usage: * $options = array( * 'token'=>'tokenaccesskey' //填寫你設定的key * ); * $weObj = new Wechat1($options); * $weObj->valid(); * $type = $weObj->getRev()->getRevType(); * switch($type) { * case Wechat::MSGTYPE_TEXT: * $weObj->text("hello, I'm wechat")->reply(); * exit; * break; * case Wechat::MSGTYPE_EVENT: * .... * break; * case Wechat::MSGTYPE_IMAGE: * ... * break; * default: * $weObj->text("help info")->reply(); * } */ namespace Com\Wechat; class Wechat1 { const MSGTYPE_TEXT = 'text'; const MSGTYPE_IMAGE = 'image'; const MSGTYPE_LOCATION = 'location'; const MSGTYPE_LINK = 'link'; const MSGTYPE_EVENT = 'event'; const MSGTYPE_MUSIC = 'music'; const MSGTYPE_NEWS = 'news'; private $token; private $_msg; private $_funcflag = false; private $_receive; public $debug = false; private $_logcallback; public function __construct($options) { $this->token = isset($options['token'])?$options['token']:''; $this->debug = isset($options['debug'])?$options['debug']:false; $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false; } /** * For weixin server validation */ private function checkSignature() { $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = $this->token; $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr ); if( $tmpStr == $signature ){ return true; }else{ return false; } } /** * For weixin server validation * @param bool $return 是否返回 */ public function valid($return=false) { $echoStr = isset($_GET["echostr"]) ? $_GET["echostr"]: ''; if ($return) { if ($echoStr) { if ($this->checkSignature()) return $echoStr; else return false; } else return $this->checkSignature(); } else { if ($echoStr) { if ($this->checkSignature()) file_put_contents(__DIR__.'/log.log', date("Y-m-d H:i:s"). " " . $echoStr.PHP_EOL, FILE_APPEND | LOCK_EX); else file_put_contents(__DIR__.'/log.log', date("Y-m-d H:i:s"). " " . 'no access1'.PHP_EOL, FILE_APPEND | LOCK_EX); } else { if ($this->checkSignature()) return true; else file_put_contents(__DIR__.'/log.log', date("Y-m-d H:i:s"). " " . 'no access2'.PHP_EOL, FILE_APPEND | LOCK_EX); } } return false; } /** * 設置發送消息 * @param array $msg 消息數組 * @param bool $append 是否在原消息數組追加 */ public function Message($msg = '',$append = false){ if (is_null($msg)) { $this->_msg =array(); }elseif (is_array($msg)) { if ($append) $this->_msg = array_merge($this->_msg,$msg); else $this->_msg = $msg; return $this->_msg; } else { return $this->_msg; } } public function setFuncFlag($flag) { $this->_funcflag = $flag; return $this; } /** * 獲取微信服務器發來的信息 */ public function getRev() { $postStr = file_get_contents("php://input"); file_put_contents(__DIR__.'/log.log', date("Y-m-d H:i:s"). " " . '收到的xml:'.$postStr.PHP_EOL, FILE_APPEND | LOCK_EX); if (!empty($postStr)) { $this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); } return $this; } /** * 獲取消息發送者 */ public function getRevFrom() { if ($this->_receive) return $this->_receive['FromUserName']; else return false; } /** * 獲取消息接受者 */ public function getRevTo() { if ($this->_receive) return $this->_receive['ToUserName']; else return false; } /** * 獲取接收消息的類型 */ public function getRevType() { if (isset($this->_receive['MsgType'])) return $this->_receive['MsgType']; else return false; } /** * 獲取消息ID */ public function getRevID() { if (isset($this->_receive['MsgId'])) return $this->_receive['MsgId']; else return false; } /** * 獲取消息發送時間 */ public function getRevCtime() { if (isset($this->_receive['CreateTime'])) return $this->_receive['CreateTime']; else return false; } /** * 獲取接收消息內容正文 */ public function getRevContent(){ if (isset($this->_receive['Content'])) return $this->_receive['Content']; else return false; } /** * 獲取接收消息圖片 */ public function getRevPic(){ if (isset($this->_receive['PicUrl'])) return $this->_receive['PicUrl']; else return false; } /** * 獲取接收消息鏈接 */ public function getRevLink(){ if (isset($this->_receive['Url'])){ return array( 'url'=>$this->_receive['Url'], 'title'=>$this->_receive['Title'], 'description'=>$this->_receive['Description'] ); } else return false; } /** * 獲取接收地理位置 */ public function getRevGeo(){ if (isset($this->_receive['Location_X'])){ return array( 'x'=>$this->_receive['Location_X'], 'y'=>$this->_receive['Location_Y'], 'scale'=>$this->_receive['Scale'], 'label'=>$this->_receive['Label'] ); } else return false; } /** * 獲取接收事件推送 */ public function getRevEvent(){ if (isset($this->_receive['Event'])){ return array( 'event'=>$this->_receive['Event'], 'key'=>$this->_receive['EventKey'], ); } else return false; } public static function xmlSafeStr($str) { return ''.preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/",'',$str).''; } /** * 數據XML編碼 * @param mixed $data 數據 * @return string */ public static function data_to_xml($data) { $xml = ''; foreach ($data as $key => $val) { is_numeric($key) && $key = "item id=\"$key\""; $xml .= "<$key>"; $xml .= ( is_array($val) || is_object($val)) ? self::data_to_xml($val) : self::xmlSafeStr($val); list($key, ) = explode(' ', $key); $xml .= "$key>"; } return $xml; } /** * XML編碼 * @param mixed $data 數據 * @param string $root 根節點名 * @param string $item 數字索引的子節點名 * @param string $attr 根節點屬性 * @param string $id 數字索引子節點key轉換的屬性名 * @param string $encoding 數據編碼 * @return string */ public function xml_encode($data, $root='xml', $item='item', $attr='', $id='id', $encoding='utf-8') { if(is_array($attr)){ $_attr = array(); foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml .= "<{$root}{$attr}>"; $xml .= self::data_to_xml($data, $item, $id); $xml .= "{$root}>"; return $xml; } /** * 設置回覆消息 * Examle: $obj->text('hello')->reply(); * @param string $text */ public function text($text='') { $FuncFlag = $this->_funcflag ? 1 : 0; $msg = array( 'ToUserName' => $this->getRevFrom(), 'FromUserName'=>$this->getRevTo(), 'MsgType'=>self::MSGTYPE_TEXT, 'Content'=>$text, 'CreateTime'=>time(), 'FuncFlag'=>$FuncFlag ); $this->Message($msg); return $this; } /** * 設置回覆音樂 * @param string $title * @param string $desc * @param string $musicurl * @param string $hgmusicurl */ public function music($title,$desc,$musicurl,$hgmusicurl='') { $FuncFlag = $this->_funcflag ? 1 : 0; $msg = array( 'ToUserName' => $this->getRevFrom(), 'FromUserName'=>$this->getRevTo(), 'CreateTime'=>time(), 'MsgType'=>self::MSGTYPE_MUSIC, 'Music'=>array( 'Title'=>$title, 'Description'=>$desc, 'MusicUrl'=>$musicurl, 'HQMusicUrl'=>$hgmusicurl ), 'FuncFlag'=>$FuncFlag ); $this->Message($msg); return $this; } /** * 設置回覆圖文 * @param array $newsData * 數組結構: * array( * [0]=>array( * 'Title'=>'msg title', * 'Description'=>'summary text', * 'PicUrl'=>'http://www.domain.com/1.jpg', * 'Url'=>'http://www.domain.com/1.html' * ), * [1]=>.... * ) */ public function news($newsData=array()) { $FuncFlag = $this->_funcflag ? 1 : 0; $count = count($newsData); $msg = array( 'ToUserName' => $this->getRevFrom(), 'FromUserName'=>$this->getRevTo(), 'MsgType'=>self::MSGTYPE_NEWS, 'CreateTime'=>time(), 'ArticleCount'=>$count, 'Articles'=>$newsData, 'FuncFlag'=>$FuncFlag ); $this->Message($msg); return $this; } /** * * 回覆微信服務器, 此函數支持鍊師操作 * Example: $this->text('msg tips')->reply(); * @param string $msg 要發送的信息, 默認取$this->_msg * @param bool $return 是否返回信息而不拋出到瀏覽器 默認:否 */ public function reply($msg=array(),$return = false) { if (empty($msg)) $msg = $this->_msg; $xmldata= $this->xml_encode($msg); file_put_contents(__DIR__.'/log.log', date("Y-m-d H:i:s"). " " . '回覆的xml:'.$xmldata.PHP_EOL, FILE_APPEND | LOCK_EX); if ($return) return $xmldata; else echo $xmldata; } }
查看原文:http://newmiracle.cn/?p=2176