程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 微信公眾平台開發入門教程

微信公眾平台開發入門教程

編輯:更多關於編程

      在這篇微信公眾平台開發教程中,我們假定你已經有了PHP語言程序、MySQL數據庫、計算機網絡通訊、及HTTP/XML/CSS/JS等基礎。

      我們將使用微信公眾賬號方倍工作室作為講解的例子,二維碼見底部。

      本系列教程將引導你完成如下任務:

      創建新浪雲計算平台應用

      啟用微信公眾平台開發模式

      基礎接口消息及事件

      微信公眾平台PHP SDK

      微信公眾平台開發模式原理

      開發天氣預報功能

      第一章 申請服務器資源

      創建新浪雲計算應用

      申請賬號

      我們使用SAE新浪雲計算平台作為服務器資源,並且申請PHP環境+MySQL數據庫作為程序運行環境。

      申請地址:http://sae.sina.com.cn/ ,使用新浪微博賬號可以直接登錄SAE,登錄後SAE將贈送500個免費雲豆。

      創建新應用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

      登錄後點擊頂部【我的首頁

      點擊下側的創建新應用,這時會彈出提示, 禁止放置違法違規內容,點擊繼續創建,彈出如下窗口。

      選擇一個未使用的appid,如果老是已經被使用不知道該什麼好,就填寫你的QQ號或者手機號吧。

      填寫二級域名AppID、應用名稱、驗證碼,開發語言選擇PHP,應用類型選擇web應用。然後點擊創建應用

      應用創建成功。並自動跳轉到應用列表中,可以看到已經有剛才創建的CCTV-7

      創建版本 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

      選擇CCTV-7右側的應用管理 下面的代碼管理

      跳轉到代碼管理

    點擊右側的

      版本號默認為1,點擊創建,成功後如下圖所示:

      到這裡,就成功創建了一個域名URL為 http://cctv7.sinaapp.com/ 的應用了。

    上傳代碼 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

    將以下代碼復制下來,另存為index.php。必須使用專業的開發編輯軟件操作,例如Notepad++,不要使用Windows自帶的記事本等。

    復制代碼
    <?php /*     方倍工作室 http://www.cnblogs.com/txw1958/     CopyRight 2013 www.doucube.com  All Rig hts Reserved */
    
    define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (isset($_GET['echostr'])) {     $we chatObj->valid(); }else{     $wechatObj->responseMsg(); }  class wechatCallbackapiTest {     public func tion valid()     {         $echoStr = $_GET["echostr"];         if($this->checkSignature()){             echo $ech oStr;             exit;         }     }      private function checkSignature()     {         $signature = $_GET["sign
    ature"];         $timestamp = $_GET["timestamp"];         $nonce = $_GET["nonce"];          $token = TO KEN;         $tmpArr = array($token, $timestamp, $nonce);         sort($tmpArr);         $tmpStr = impl ode( $tmpArr );         $tmpStr = sha1( $tmpStr );          if( $tmpStr == $signature ){             retu rn true;         }else{             return false;         }     }      public function responseMsg()     {         $po stStr = $GLOBALS["HTTP_RAW_POST_DATA"];          if (!empty($postStr)){             $postObj = simpl exml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);             $fromUsername = $p ostObj->FromUserName;             $toUsername = $postObj->ToUserName;             $keyword = tri m($postObj->Content);             $time = time();             $textTpl = "<xml>                         <ToUser Name><![CDATA[%s]]></ToUserName>                         <FromUserName><![CDATA[%s]]></From UserName>                         <CreateTime>%s</CreateTime>                         <MsgType><![CDAT A[%s]]></MsgType>                         <Content><![CDATA[%s]]></Content>                         <Func Flag>0</FuncFlag>                         </xml>";             if($keyword == "?" || $keywo rd == "?")             {                 $msgType = "text";                 $contentStr = date("Y-m-d H
    :i:s",time());                 $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $m sgType, $contentStr);                 echo $resultStr;             }         }else{             echo "";             e xit;         }     } } ?>
    復制代碼

    然後將index.php文件壓縮成ZIP格式,注意不能用RAR格式

      這樣會生成一個index.zip的文件。或者直接下載方倍已經壓縮好的zip文件 點此下載

      在代碼管理界面中,選擇操作按鈕。

      選擇上傳代碼包。

      點擊上傳文件,選擇剛才壓縮好的index.zip文件,點擊上傳,上傳成功後如下所示

      點擊操作按鈕下的代碼編輯,

      我們可以看到index.php已經上傳成功,雙擊可以查看編輯裡面的代碼

      新浪雲應用的創建就成功了。

      第二章 啟用開發模式

      微信公眾平台開發模式

      高級功能

      微信公眾平台地址:https://mp.weixin.qq.com

      登錄微信公眾平台後台,選擇高級功能,進入後就看到兩種模式

      我們需要先關閉編輯模式。點擊編輯模式的進入

      滑動關閉

      開發模式

      進入開發模式裡面

      點擊成為開發者

      彈出URL和Token填寫框

      此處的URL為上篇中介紹的雲應用的域名,而Token在index.php中定義為weixin。提交後提示你已成為開發者。

      再滑動右上角啟用按鈕。

      恭喜,你成功啟用開發模式。

      自動回復

      在上面的例子中,實現了一個發送“?”就能回復當前時間的功能。

      效果如下:

      至此,你的微信公眾平台賬號已經實現自動回復了。

      第三章 基礎接口消息及事件

      所有賬號在申請之後,都將獲得基礎接口的權限,基礎接口中將包括接收用戶消息,向用戶回復消息,接受事件推送等三種服務。

      接收用戶消息

      目前普通用戶能向公眾賬號推送五種格式的消息:文本(包括表情)、語音、圖片、視頻、位置、鏈接。

      下面就這五種分別詳解如下:

      1. 文本(包括表情)

      發送文本及表情

      2. 圖片

      發送圖片

      3. 語音

      發送語音

      4. 視頻

      發送視頻

      5. 位置

      發送位置

      6. 鏈接

      發送鏈接

      向用戶回復消息

      目前普通公眾賬號能向用戶推送六種格式的消息:文本、圖文、音樂、圖片、語音、視頻。其中圖文消息包括單條圖文消息和多條圖文消息,展示方式有一點點不同。

      下面就這幾種分別詳解如下:【圖片、語音、視頻由於需要用到和高級接口相關的media_id,在本教程中暫不討論。】

      1. 文本消息格式

      回復文本

      2. 圖文消息格式

      2.1 單條圖文消息

      回復單條圖文

      2.2 多圖文消息

      回復多圖文

      3. 音樂消息

      回復音樂消息

      接收事件推送

      目前用戶在關注和取消關注,以及點擊菜單的時候會自動向公眾平台發送事件推送消息:

      1. 關注事件

      第四章 微信公眾平台PHP SDK

    方倍工作室開發了微信公眾平台的PHPSDK,集成了目前所有消息及事件的接收及發送,代碼如下:

    <?php
    /*
        方倍工作室 
        http://www.cnblogs.com/txw1958/
        CopyRight 2014 All Rights Reserved
    */
    
    define("TOKEN", "weixin");
    
    $wechatObj = new wechatCallbackapiTest();
    if (!isset($_GET['echostr'])) {
        $wechatObj->responseMsg();
    }else{
        $wechatObj->valid();
    }
    
    class wechatCallbackapiTest
    {
        //驗證消息
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        //檢查簽名
        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr, SORT_STRING);
            $tmpStr = implode($tmpArr);
            $tmpStr = sha1($tmpStr);
    
            if($tmpStr == $signature){
                return true;
            }else{
                return false;
            }
        }
    
        //響應消息
        public function responseMsg()
        {
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            if (!empty($postStr)){
                $this->logger("R ".$postStr);
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $RX_TYPE = trim($postObj->MsgType);
    
                switch ($RX_TYPE)
                {
                    case "event":
                        $result = $this->receiveEvent($postObj);
                        break;
                    case "text":
                        $result = $this->receiveText($postObj);
                        break;
                    case "image":
                        $result = $this->receiveImage($postObj);
                        break;
                    case "location":
                        $result = $this->receiveLocation($postObj);
                        break;
                    case "voice":
                        $result = $this->receiveVoice($postObj);
                        break;
                    case "video":
                        $result = $this->receiveVideo($postObj);
                        break;
                    case "link":
                        $result = $this->receiveLink($postObj);
                        break;
                    default:
                        $result = "unknown msg type: ".$RX_TYPE;
                        break;
                }
                $this->logger("T ".$result);
                echo $result;
            }else {
                echo "";
                exit;
            }
        }
    
        //接收事件消息
        private function receiveEvent($object)
        {
            $content = "";
            switch ($object->Event)
            {
                case "subscribe":
                    $content = "歡迎關注方倍工作室 ";
                    $content .= (!empty($object->EventKey))?("n來自二維碼場景 ".str_replace("qrscene_","",$object->EventKey)):"";
                    break;
                case "unsubscribe":
                    $content = "取消關注";
                    break;
                case "SCAN":
                    $content = "掃描場景 ".$object->EventKey;
                    break;
                case "CLICK":
                    switch ($object->EventKey)
                    {
                        case "COMPANY":
                            $content = "方倍工作室提供互聯網相關產品與服務。";
                            break;
                        default:
                            $content = "點擊菜單:".$object->EventKey;
                            break;
                    }
                    break;
                case "LOCATION":
                    $content = "上傳位置:緯度 ".$object->Latitude.";經度 ".$object->Longitude;
                    break;
                case "VIEW":
                    $content = "跳轉鏈接 ".$object->EventKey;
                    break;
                default:
                    $content = "receive a new event: ".$object->Event;
                    break;
            }
            $result = $this->transmitText($object, $content);
            return $result;
        }
    
        //接收文本消息
        private function receiveText($object)
        {
            switch ($object->Content)
            {
                case "文本":
                    $content = "這是個文本消息";
                    break;
                case "圖文":
                case "單圖文":
                    $content = array();
                    $content[] = array("Title"=>"單圖文標題",  "Description"=>"單圖文內容", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                    break;
                case "多圖文":
                    $content = array();
                    $content[] = array("Title"=>"多圖文1標題", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                    $content[] = array("Title"=>"多圖文2標題", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                    $content[] = array("Title"=>"多圖文3標題", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958");
                    break;
                case "音樂":
                    $content = array("Title"=>"最炫民族風", "Description"=>"歌手:鳳凰傳奇", "MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3", "HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
                    break;
                default:
                    $content = date("Y-m-d H:i:s",time());
                    break;
            }
            if(is_array($content)){
                if (isset($content[0]['PicUrl'])){
                    $result = $this->transmitNews($object, $content);
                }else if (isset($content['MusicUrl'])){
                    $result = $this->transmitMusic($object, $content);
                }
            }else{
                $result = $this->transmitText($object, $content);
            }
            return $result;
        }
    
        //接收圖片消息
        private function receiveImage($object)
        {
            $content = array("MediaId"=>$object->MediaId);
            $result = $this->transmitImage($object, $content);
            return $result;
        }
    
        //接收位置消息
        private function receiveLocation($object)
        {
            $content = "你發送的是位置,緯度為:".$object->Location_X.";經度為:".$object->Location_Y.";縮放級別為:".$object->Scale.";位置為:".$object->Label;
            $result = $this->transmitText($object, $content);
            return $result;
        }
    
        //接收語音消息
        private function receiveVoice($object)
        {
            if (isset($object->Recognition) && !empty($object->Recognition)){
                $content = "你剛才說的是:".$object->Recognition;
                $result = $this->transmitText($object, $content);
            }else{
                $content = array("MediaId"=>$object->MediaId);
                $result = $this->transmitVoice($object, $content);
            }
    
            return $result;
        }
    
        //接收視頻消息
        private function receiveVideo($object)
        {
            $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
            $result = $this->transmitVideo($object, $content);
            return $result;
        }
    
        //接收鏈接消息
        private function receiveLink($object)
        {
            $content = "你發送的是鏈接,標題為:".$object->Title.";內容為:".$object->Description.";鏈接地址為:".$object->Url;
            $result = $this->transmitText($object, $content);
            return $result;
        }
    
        //回復文本消息
        private function transmitText($object, $content)
        {
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    </xml>";
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
            return $result;
        }
    
        //回復圖片消息
        private function transmitImage($object, $imageArray)
        {
            $itemTpl = "<Image>
        <MediaId><![CDATA[%s]]></MediaId>
    </Image>";
    
            $item_str = sprintf($itemTpl, $imageArray['MediaId']);
    
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
    $item_str
    </xml>";
    
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
            return $result;
        }
    
        //回復語音消息
        private function transmitVoice($object, $voiceArray)
        {
            $itemTpl = "<Voice>
        <MediaId><![CDATA[%s]]></MediaId>
    </Voice>";
    
            $item_str = sprintf($itemTpl, $voiceArray['MediaId']);
    
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    $item_str
    </xml>";
    
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
            return $result;
        }
    
        //回復視頻消息
        private function transmitVideo($object, $videoArray)
        {
            $itemTpl = "<Video>
        <MediaId><![CDATA[%s]]></MediaId>
        <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
    </Video>";
    
            $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);
    
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    $item_str
    </xml>";
    
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
            return $result;
        }
    
        //回復圖文消息
        private function transmitNews($object, $newsArray)
        {
            if(!is_array($newsArray)){
                return;
            }
            $itemTpl = "    <item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
        </item>
    ";
            $item_str = "";
            foreach ($newsArray as $item){
                $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
            }
            $newsTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>%s</ArticleCount>
    <Articles>
    $item_str</Articles>
    </xml>";
    
            $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
            return $result;
        }
    
        //回復音樂消息
        private function transmitMusic($object, $musicArray)
        {
            $itemTpl = "<Music>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <MusicUrl><![CDATA[%s]]></MusicUrl>
        <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
    </Music>";
    
            $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);
    
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[music]]></MsgType>
    $item_str
    </xml>";
    
            $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
            return $result;
        }
    
        //日志記錄
        private function logger($log_content)
        {
            if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
                sae_set_display_errors(false);
                sae_debug($log_content);
                sae_set_display_errors(true);
            }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
                $max_size = 10000;
                $log_filename = "log.xml";
                if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
                file_put_contents($log_filename, date('H:i:s')." ".$log_content."rn", FILE_APPEND);
            }
        }
    }
    ?>
    

     

    使用第一章同樣方法,將上述代碼另存為index.php,壓縮成index.zip,或者直接點擊下載,上傳到SAE,你的公眾賬號就能接收及回復所有消息類型及事件通知了。

    在公眾賬號中回復以下文字,你將得到和上一章一樣的回復內容。

    文本 圖文 多圖文 音樂 時間

    還可以嘗試以下操作,體驗一下其他消息

    發送一張圖片給公眾賬號 發送一段語音給公眾賬號 發送一段視頻給公眾賬號 發送位置信息給公眾賬號 發送收藏中的鏈接給公眾賬號  

      第五章 微信公眾平台開發模式原理分析

      在體驗了上一節的各種功能之後,我們只是知其然,這一節裡面,將介紹在上面的基礎上介紹微信公眾平台收發消息機制及原理,這是知其所以然。

      開發模式成為開發者時的消息校驗原理

      在開發者首次提交驗證申請時,微信服務器將發送GET請求到填寫的URL上,並且帶上四個參數(signature、timestamp、nonce、echostr),開發者通過對簽名(即signature)的效驗,來判斷此條消息的真實性。

      此後,每次開發者接收用戶消息的時候,微信也都會帶上前面三個參數(signature、timestamp、nonce)訪問開發者設置的URL,開發者依然通過對簽名的效驗判斷此條消息的真實性。效驗方式與首次提交驗證申請一致。

    參數 描述 signature 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 timestamp 時間戳 nonce 隨機數 echostr 隨機字符串

      開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成為開發者成功,否則接入失敗。

      加密/校驗流程如下:

      1. 將token、timestamp、nonce三個參數進行字典序排序

      2. 將三個參數字符串拼接成一個字符串進行sha1加密

      3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信

      啟用接口是由代碼中的checkSignature()函數來實現校驗的。如果對這一原理難以理解,可以暫時不用深究,繼續看下面。

      成為開發者後消息收發時的原理

      再來看下這個圖,當用戶發送一個“?”時,系統回復了一個時間

      這一原理的消息流程圖如下所示。

      從上圖可以看出,用戶在發送一個?後,微信服務器將組裝一個消息發送給我們自己的服務器,自己的服務器然後回復一個時間,並且將該時間也按一定的規則組裝,回復給公眾賬號,公眾賬號再回復給用戶,在這個收發過程中,發送方和接收方進行了調換(ToUserName和FromUserName值互換),收發都是以xml格式在後台進行傳輸的,

      所以掌握各種消息類型的收發就是進行微信公眾平台開發的基礎 !

      下面對前面所述的各種消息類型講解其XML數據包的格式。

      各種收發消息的XML數據包分析

      接收消息

      1. 文本(包括表情)

      發送文本及表情

    文字後台格式:

    復制代碼
    <xml>
     <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
     <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
     <CreateTime>1359028446</CreateTime>
     <MsgType><![CDATA[text]]></MsgType>
     <Content><![CDATA[測試文字]]></Content>
     <MsgId>5836982729904121631</MsgId>
    </xml>
    復制代碼

    表情後台格式

    復制代碼
    <xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
    <CreateTime>1359044526</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[/::)/::~/::B/::|/:8-)]]></Content>
    <MsgId>5837051792978241864</MsgId>
    </xml>
    復制代碼

    XML格式講解

    ToUserName 消息接收方微信號,一般為公眾平台賬號微信號 FromUserName 消息發送方微信號 CreateTime 消息 創建時間 MsgType 消息類型;文本消息為text Content 消息內容 MsgId 消息ID號

    可以看出,文本和表情的消息類型均為文本

      2. 圖片

      發送圖片

     

     

    後台格式:


    <xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
    <CreateTime>1359028479</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
    <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
    <MsgId>5836982871638042400</MsgId>
    <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId>
    </xml>

    XML格式講解

    ToUserName 消息接收方微信號,一般為公眾平台賬號微信號 FromUserName 消息發送方微信號 CreateTime 消息創建時間 MsgType 消息類型;圖片消息為image PicUrl 圖片鏈接地址,可以用HTTP GET獲取 MsgId 消息ID號

    3. 語音
    發送語音

    後台格式:


    <xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
    <CreateTime>1359028479</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
    <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0DxqYFI4uAQH1FWs3hUicpibjF0pOqLEQyDMlg/0]]></PicUrl>
    <MsgId>5836982871638042400</MsgId>
    <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId>
    </xml>

    XML格式講解


    ToUserName 消息接收方微信號,一般為公眾平台賬號微信號 FromUserName 消息發送方微信號 CreateTime 消息創建時間 MsgType 消息類型;語音消息為voice MediaId 媒體ID Format 語音格式,這裡為amr MsgId 消息ID號

    附:AMR接口簡介 全稱Adaptive Multi-Rate,主要用於移動設備的音頻,壓縮比比較大,但相對其他的壓縮格式質量比較差,由於多用於人聲,通話,效果還是很不錯的。

    4. 視頻

    發送視頻

    後台格式:


    xml><ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
    <CreateTime>1359028186</CreateTime>
    <MsgType><![CDATA[video]]></MsgType>
    <MediaId><![CDATA[DBVFRIj29LB2hxuYpc0R6VLyxwgyCHZPbRj_IIs6YaGhutyXUKtFSDcSCPeoqUYr]]></MediaId>
    <ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzIclCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediaId>
    <MsgId>5836981613212624665</MsgId>
    </xml>

    XML格式講解


    ToUserName 消息接收方微信號,一般為公眾平台賬號微信號 FromUserName 消息發送方微信號 CreateTime 消息創建時間 MsgType 消息類型;視頻消息為video MediaId 媒體ID ThumbMediaId 媒體縮略ID? MsgId 消息ID號

    5. 位置

    發送位置

    後台格式:


    <xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
    <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FLACFromUserName>
    <CreateTime>1359036619</CreateTime>
    <MsgType><![CDATA[location]]></MsgType>
    <Location_X>22.539968</Location_X>
    <Location_Y>113.954980</Location_Y>
    <Scale>16</Scale>
    <Label><![CDATA[中國廣東省深圳市南山區華僑城深南大道9789號 郵政編碼: 518057]]></Label>
    <MsgId>5837017832671832047</MsgId>
    </xml>

    XML格式講解


     ToUserName 消息接收方微信號,一般為公眾平台賬號微信號  FromUserName 消息發送方微信號  CreateTime 消息創建時間  MsgType 消息類型,地理位置為location  Location_X 地理位置緯度  Location_Y 地理位置經度  Scale 地圖縮放大小  Label 地理位置信息  MsgId 消息ID號

    6. 鏈接

    發送鏈接

    後台格式:


    <xml>
    <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName> 
    <FromUserName><![CDATA[oIDrpjl2LYdfTAM-oxDgB4XZcnc8]]></FromUserName> 
    <CreateTime>1359709372</CreateTime> 
    <MsgType><![CDATA[link]]></MsgType> 
    <Title><![CDATA[微信公眾平台開發者的江湖]]></Title> 
    <Description><![CDATA[陳坤的微信公眾號這段時間大火,大家..]]></Description> 
    <Url><![CDATA[http://israel.duapp.com/web/photo.php]]></Url> 
    <MsgId>5839907284805129867</MsgId> 
    </xml> 

    XML格式講解


     ToUserName 消息接收方微信號,一般為公眾平台賬號微信號  FromUserName 消息發送方微信號  CreateTime 消息創建時間  MsgType 消息類型,鏈接為link  Title 圖文消息標題  Description 圖文消息描述  Url 點擊圖文消息跳轉鏈接  MsgId 消息ID號

     

    發送消息

    只介紹三種格式的消息:文本、圖文、音樂。其中圖文消息包括單條圖文消息和多條圖文消息,展示方式有一點點不同。

    1. 文本消息格式
    回復文本

    後台格式:


    <xml>
    <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
    <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
    <CreateTime>1359036631</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[【深圳】天氣實況 溫度:27℃ 濕度:59% 風速:東北風3級 11月03日 周日 27℃~23℃ 小雨 東北風4-5級 11月04日 周一 26℃~21℃ 陣雨 微風 11月05日 周二 27℃~22℃ 陰 微風]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>

    XML格式講解

     FromUserName 消息發送方  ToUserName 消息接收方  CreateTime 消息創建時間  MsgType 消息類型,文本消息必須填寫text  Content 消息內容,大小限制在2048字節,字段為空為不合法請求  FuncFlag 星標字段

     
    2. 圖文消息格式
    2.1 單條圖文消息
    回復單條圖文


    後台格式:


    <xml>
        <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
        <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
        <CreateTime>1359011899</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <Content><![CDATA[]]></Content>
        <ArticleCount>1</ArticleCount>
        <Articles>
            <item>
                <Title><![CDATA[[蘋果產品信息查詢]]></Title>
                <Description><![CDATA[序列號:USE IMEI NUMBER IMEI號:358031058974471 設備名稱:iPhone 5C 設備顏色: 設備容量: 激活狀態:已激活 電話支持:未過期[2014-01-13] 硬件保修:未過期[2014-10-14] 生產工廠:中國]]>
        </Description>
                <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
        </Articles>
        <FuncFlag>0</FuncFlag>
    </xml>

    2.2 多圖文消息

    回復多圖文

    後台數據格式


    <xml>
        <ToUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></ToUserName>
        <FromUserName><![CDATA[gh_680bdefc8c5d]]></FromUserName>
        <CreateTime>1359011829</CreateTime>
        <MsgType><![CDATA[news]]></MsgType>
        <Content><![CDATA[]]></Content>
        <ArticleCount>5</ArticleCount>
        <Articles>
            <item>
                <Title><![CDATA[【深圳】天氣實況 溫度:3℃ 濕度:43﹪ 風速:西南風2級]]></Title>
                <Description><![CDATA[]]></Description>
    <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
            <item>
                <Title><![CDATA[06月24日 周四 2℃~-7℃ 晴 北風3-4級轉東南風小於3級]]></Title>
                <Description><![CDATA[]]></Description>
                <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
            <item>
                <Title><![CDATA[06月25日 周五 -1℃~-8℃ 晴 東南風小於3級轉東北風3-4級]]></Title>
                <Description><![CDATA[]]></Description>
        <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d00.gif]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
            <item>
                <Title><![CDATA[06月26日 周六 -1℃~-7℃ 多雲 東北風3-4級轉東南風小於3級]]></Title>
                <Description><![CDATA[]]></Description>
    <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
            <item>
                <Title><![CDATA[06月27日 周日 0℃~-6℃ 多雲 東南風小於3級轉東北風3-4級]]></Title>
                <Description><![CDATA[]]></Description>
    <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/d01.gif]]></PicUrl>
                <Url><![CDATA[]]></Url>
            </item>
        </Articles>
        <FuncFlag>0</FuncFlag>
    </xml>

    XML格式講解


    FromUserName 消息發送方  ToUserName 消息接收方  CreateTime 消息創建時間  MsgType 消息類型,圖文消息必須填寫news  Content 消息內容,圖文消息可填空  ArticleCount 圖文消息個數,限制為10條以內  Articles 多條圖文消息信息,默認第一個item為大圖   Title 圖文消息標題   Description 圖文消息描述   PicUrl 圖片鏈接,支持JPG、PNG格式,較好的效果為大圖640*320,小圖80*80   Url 點擊圖文消息跳轉鏈接 FuncFlag 星標字段

     3. 音樂消息

    回復音樂消息

    後台格式:


    <xml>
        <ToUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></ToUserName>
        <FromUserName><![CDATA[gh_b629c48b653e]]></FromUserName>
        <CreateTime>1372310544</CreateTime>
        <MsgType><![CDATA[music]]></MsgType>
        <Music>
            <Title><![CDATA[最炫民族風]]></Title>
            <Description><![CDATA[鳳凰傳奇]]></Description>
            <MusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl>
            <HQMusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></HQMusicUrl>
        </Music>
        <FuncFlag>0</FuncFlag>
    </xml>

    XML格式講解


    ToUserName     接收方帳號(收到的OpenID) FromUserName     開發者微信號 CreateTime     消息創建時間 MsgType          消息類型,此處為music     Title       音樂標題     Description 音樂描述     MusicUrl     音樂鏈接     HQMusicUrl     高質量音樂鏈接,WIFI環境優先使用該鏈接播放音樂 FuncFlag     位0x0001被標志時,星標剛收到的消息。
    復制代碼

     

    事件消息類型

    目前用戶在關注和取消關注,以及點擊菜單的時候會自動向公眾平台發送事件推送消息:

    1. 關注事件


    <xml>
        <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
        <FromUserName><![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]></FromUserName>
        <CreateTime>1372307736</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[subscribe]]></Event>
        <EventKey><![CDATA[]]></EventKey>
    </xml>

    2. 取消關注事件


    <xml>
        <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
        <FromUserName><![CDATA[ollB4jqgdO_cRnVXk_wRnSywgtQ8]]></FromUserName>
        <CreateTime>1372309890</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[unsubscribe]]></Event>
        <EventKey><![CDATA[]]></EventKey>
    </xml>

    3. 菜單點擊事件


    <xml>
        <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
        <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName>
        <CreateTime>1377886191</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[CLICK]]></Event>
        <EventKey><![CDATA[天氣深圳]]></EventKey>
    </xml>

    XML格式講解

    ToUserName     接收方微信號 FromUserName 發送方微信號,若為普通用戶,則是一個OpenID CreateTime     消息創建時間 MsgType     消息類型,event Event     事件類型,subscribe(訂閱)、unsubscribe(取消訂閱)、CLICK(自定義菜單點擊事件) EventKey 事件KEY值,與自定義菜單接口中KEY值對應

     

     

    第六章 開發天氣預報功能

     

    這一章裡,我們來快速開發天氣預報功能、我們使用方倍工作室的相應接口來實現。下面代碼實現了這樣該功能。


    <?php /*     方倍工作室     CopyRight 2014 All Rights Reserved */
    
    define("TOKEN", "weixin");  $wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) {     $wechatObj->responseMsg(); }else{     $wechatObj->valid(); }  class wechatCallbackapiTest {     public function valid()     {         $echoStr = $_GET["echostr"];         if($this->checkSignature()){             echo $echoStr;             exit;         }     }      private function checkSignature()     {         $signature = $_GET["signature"];         $timestamp = $_GET["timestamp"];         $nonce = $_GET["nonce"];         $token = TOKEN;         $tmpArr = array($token, $timestamp, $nonce);         sort($tmpArr, SORT_STRING);         $tmpStr = implode($tmpArr);         $tmpStr = sha1($tmpStr);          if($tmpStr == $signature){             return true;         }else{             return false;         }     }      public function responseMsg()     {         $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];         if (!empty($postStr)){             $this->logger("R ".$postStr);             $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);             $RX_TYPE = trim($postObj->MsgType);              switch ($RX_TYPE)             {                 case "event":
                        $result = $this->receiveEvent($postObj);                     break;                 case "text":
                        $result = $this->receiveText($postObj);                     break;             }             $this->logger("T ".$result);             echo $result;         }else {             echo "";             exit;         }     }      private function receiveEvent($object)     {         $content = "";         switch ($object->Event)         {             case "subscribe":
                    $content = "歡迎關注方倍工作室 ";                 break;         }         $result = $this->transmitText($object, $content);         return $result;     }      private function receiveText($object)     {         $keyword = trim($object->Content);$url = "http://apix.sinaapp.com/weather/?appkey=".$object->ToUserName."&city=".urlencode($keyword);          $output = file_get_contents($url);         $content = json_decode($output, true);          $result = $this->transmitNews($object, $content);         return $result;     }      private function transmitText($object, $content)     {         $textTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>";         $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);         return $result;     }      private function transmitNews($object, $newsArray)     {         if(!is_array($newsArray)){             return;         }         $itemTpl = "    <item>         <Title><![CDATA[%s]]></Title>         <Description><![CDATA[%s]]></Description>         <PicUrl><![CDATA[%s]]></PicUrl>         <Url><![CDATA[%s]]></Url>     </item> ";         $item_str = "";         foreach ($newsArray as $item){             $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);         }         $newsTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <Content><![CDATA[]]></Content> <ArticleCount>%s</ArticleCount> <Articles> $item_str</Articles> </xml>";          $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));         return $result;     }      private function logger($log_content)     {            } } ?>

    在公眾賬號中使用的命令如下:

    1. 發送城市名稱,如“深圳”,可以查詢該城市的天氣

    在你的公眾賬號輸入相應的命令,實現效果類似如下所示:

     

     

    第七章 小結

     

    總的來說,通過本教程,你得到了以下收獲:

    • 1. 你通過本教程得到了一個免費的雲計算空間
    • 2. 你成功啟用了開發模式,並且實現了時間的自動回復
    • 3. 你非常快速地就體驗了各種消息接收及發送,比方倍當年自己摸索所用的時間短了很多
    • 4. 你了解了微信公眾平台開發的原理,並且熟悉了各種消息及發送是怎麼一回事
    • 5. 你使用方倍工作室的接口,成功的開發了你的第一個微信公眾平台功能——天氣預報。
    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved