封装weixin.class.php

一、封装weixin.class.php

由于微信公众平台的通信使用的是特定格式的XML数据,每次接受和回复都要去做一大堆的数据处理。

我们就考虑在这个基础上做一次封装,weixin.class.php,代码如下:

<?phpclass Weixin{	public $token = '';//token	public $debug =  false;//是否debug的状态标示,方便我们在调试的时候记录一些中间数据	public $setFlag = false;	public $msgtype = 'text';	//('text','image','location')	public $msg = array();	public function __construct($token,$debug)	{		$this->token = $token;		$this->debug = $debug;	}
     //获得用户发过来的消息(消息内容和消息类型  )	public function getMsg()	{		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];		if ($this->debug) {                        $this->write_log($postStr);		}		if (!empty($postStr)) {			$this->msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);			$this->msgtype = strtolower($this->msg['MsgType']);		}	}
     //回复文本消息	public function makeText($text='')	{		$CreateTime = time();		$FuncFlag = $this->setFlag ? 1 : 0;		$textTpl = "<xml>			<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>			<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>			<CreateTime>{$CreateTime}</CreateTime>			<MsgType><![CDATA[text]]></MsgType>			<Content><![CDATA[%s]]></Content>			<FuncFlag>%s</FuncFlag>			</xml>";		return sprintf($textTpl,$text,$FuncFlag);	}
     //根据数组参数回复图文消息	public function makeNews($newsData=array())	{		$CreateTime = time();		$FuncFlag = $this->setFlag ? 1 : 0;		$newTplHeader = "<xml>			<ToUserName><![CDATA[{$this->msg['FromUserName']}]]></ToUserName>			<FromUserName><![CDATA[{$this->msg['ToUserName']}]]></FromUserName>			<CreateTime>{$CreateTime}</CreateTime>			<MsgType><![CDATA[news]]></MsgType>			<Content><![CDATA[%s]]></Content>			<ArticleCount>%s</ArticleCount><Articles>";		$newTplItem = "<item>			<Title><![CDATA[%s]]></Title>			<Description><![CDATA[%s]]></Description>			<PicUrl><![CDATA[%s]]></PicUrl>			<Url><![CDATA[%s]]></Url>			</item>";		$newTplFoot = "</Articles>			<FuncFlag>%s</FuncFlag>			</xml>";		$Content = '';		$itemsCount = count($newsData['items']);		$itemsCount = $itemsCount < 10 ? $itemsCount : 10;//微信公众平台图文回复的消息一次最多10条		if ($itemsCount) {			foreach ($newsData['items'] as $key => $item) {				if ($key<=9) {					$Content .= sprintf($newTplItem,$item['title'],$item['description'],$item['picurl'],$item['url']);				}			}		}		$header = sprintf($newTplHeader,$newsData['content'],$itemsCount);		$footer = sprintf($newTplFoot,$FuncFlag);		return $header . $Content . $footer;	}	public function reply($data)	{		if ($this->debug) {                	$this->write_log($data);		}		echo $data;	}	public function valid()	{		if ($this->checkSignature()) {			if( $_SERVER['REQUEST_METHOD']=='GET' )			{				echo $_GET['echostr'];				exit;			}		}else{			write_log('认证失败');			exit;		}	}	private function checkSignature()	{		$signature = $_GET["signature"];		$timestamp = $_GET["timestamp"];		$nonce = $_GET["nonce"];		$tmpArr = array($this->token, $timestamp, $nonce);		sort($tmpArr);		$tmpStr = implode( $tmpArr );		$tmpStr = sha1( $tmpStr );		if( $tmpStr == $signature ){			return true;		}else{			return false;		}	}
    private function write_log($log){
       //这里是你记录调试信息的地方  请自行完善   以便中间调试
    }}?>

 二、调用weixin.class.php

把你的微信公众平台主接口文件(如前面定义的http://www.yourdomain.com/weixin.php)中,修改代码为:

 

include_once('weixin.class.php');//引用刚定义的微信消息处理类
define("TOKEN", "mmhelper");
define('DEBUG', true);$weixin = new Weixin(TOKEN,DEBUG);//实例化$weixin->getMsg();$type = $weixin->msgtype;//消息类型$username = $weixin->msg['FromUserName'];//哪个用户给你发的消息,这个$username是微信加密之后的,但是每个用户都是一一对应的if ($type==='text') {	if ($weixin->msg['Content']=='Hello2BizUser') {//微信用户第一次关注你的账号的时候,你的公众账号就会受到一条内容为'Hello2BizUser'的消息		$reply = $weixin->makeText('欢迎你关注妈妈助手哦,屌丝');	}else{//这里就是用户输入了文本信息		$keyword = $weixin->msg['Content'];   //用户的文本消息内容                include_once("chaxun.php");//文本消息 调用查询程序                  $chaxun= new chaxun(DEBUG,$keyword,$username);                $results['items'] =$chaxun->search();//查询的代码          	                $reply = $weixin->makeNews($results);	}}elseif ($type==='location') {      //用户发送的是位置信息  稍后的文章中会处理                  }elseif ($type==='image') {      //用户发送的是图片 稍后的文章中会处理}elseif ($type==='voice') {           //用户发送的是声音 稍后的文章中会处理}$weixin->reply($reply);

 

 三、查询代码

还需要将数据库里面的查询结果格式化为特定的形式

 

public function search(){       $record=array();  //定义返回结果的数组       $list = $this->search($this->keyword);//普通的根据关键词查询数据库的操作  代码就不用分享了    if(is_array($list)&&!empty($list)){             	               foreach($list as $msg){                 $record[]=array(//以下代码,将数据库中查询返回的数组格式化为微信返回消息能接收的数组形式,即title、description、picurl、url 详见微信官方的文档描述					'title' =>$msg['title'],					'description' =>$msg['discription'],					'picurl' => $msg['pic_url'],					'url' =>$msg['url']				);
        }
    }
    return $record;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值