<?php
class Wechat {
/**
* 微信推送過來的數(shù)據(jù)或響應(yīng)數(shù)據(jù)
* @var array
*/
private $data = array();
/**
* 構(gòu)造方法,用于實(shí)例化微信SDK
* @param string $token 微信開放平臺(tái)設(shè)置的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){
}
}
}
/**
* 獲取微信推送的數(shù)據(jù)
* @return array 轉(zhuǎn)換為數(shù)組后的數(shù)據(jù)
*/
public function request(){
return $this->data;
}
/**
* * 響應(yīng)微信發(fā)送的信息(自動(dòng)回復(fù))
* @param string $to 接收用戶名
* @param string $from 發(fā)送者用戶名
* @param array $content 回復(fù)信息,文本信息為string類型
* @param string $type 消息類型
* @param string $flag 是否新標(biāo)剛接受到的信息
* @return string XML字符串
*/
public function response($content, $type = 'text', $flag = 0){
/* 基礎(chǔ)數(shù)據(jù) */
$this->data = array(
'ToUserName' => $this->data['FromUserName'],
'FromUserName' => $this->data['ToUserName'],
'CreateTime' => time(),
'MsgType' => $type,
);
/* 添加類型數(shù)據(jù) */
$this->$type($content);
/* 添加狀態(tài) */
$this->data['FuncFlag'] = $flag;
/* 轉(zhuǎn)換數(shù)據(jù)為XML */
$xml = new SimpleXMLElement('<xml></xml>');
$this->data2xml($xml, $this->data);
exit($xml->asXML());
}
/**
* 回復(fù)文本信息
* @param string $content 要回復(fù)的信息
*/
private function text($content){
$this->data['Content'] = $content;
}
/**
* 回復(fù)音樂信息
* @param string $content 要回復(fù)的音樂
*/
private function music($music){
list(
$music['Title'],
$music['Description'],
$music['MusicUrl'],
$music['HQMusicUrl']
) = $music;
$this->data['Music'] = $music;
}
/**
* 回復(fù)圖文信息
* @param string $news 要回復(fù)的圖文內(nèi)容
*/
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調(diào)新聞
}
$this->data['ArticleCount'] = count($articles);
$this->data['Articles'] = $articles;
}
/**
* 數(shù)據(jù)XML編碼
* @param object $xml XML對象
* @param mixed $data 數(shù)據(jù)
* @param string $item 數(shù)字索引時(shí)的節(jié)點(diǎn)名稱
* @return string
*/
private function data2xml($xml, $data, $item = 'item') {
foreach ($data as $key => $value) {
/* 指定默認(rèn)的數(shù)字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));
}
}
}
}
/**
* 對數(shù)據(jù)進(jìn)行簽名認(rèn)證,確保是微信發(fā)送的數(shù)據(jù)
* @param string $token 微信開放平臺(tái)設(shè)置的TOKEN
* @return boolean true-簽名正確,false-簽名錯(cuò)誤
*/
private function auth($token){
if(empty($_GET['signature'])) return;
/* 獲取數(shù)據(jù) */
$data = array($_GET['timestamp'], $_GET['nonce'], $token);
$sign = $_GET['signature'];
/* 對數(shù)據(jù)進(jìn)行字典排序 */
sort($data,SORT_STRING);
/* 生成簽名 */
$signature = sha1(implode($data));
return $signature === $sign;
}
}
更多信息請查看IT技術(shù)專欄