這篇文章主要介紹了php微信公眾平臺開發類,實例分析了針對微信消息的響應、回復、編碼等相關技巧,非常具有實用價值,需要的朋友可以參考下
本文實例講述了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(!emptyempty($_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(emptyempty($_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程序設計有所幫助。
新聞熱點
疑難解答