php 微信消息接口

其實消息接口原理   就是微信  請求你後臺寫的地址接口簽名驗證   然後就可以操作了
<?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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章