php微信公众平台开发类实例

2015 年 5 月 17 日3170

本文实例讲述了php微信公众平台开发类。分享给大家供大家参考。具体分析如下:

ThinkWechat.php类文件如下:





<?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;



}



}

希望本文所述对大家的php程序设计有所帮助。

如果您喜欢本文请分享给您的好友,谢谢!

0 0