轉自博客園:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html

這是一篇關於介紹如何進行微信公衆號開發的,轉載自http://www.cnblogs.com/txw1958/p/wechat-tutorial.html,還沒仔細看,沒有經過我自己的驗證。待我有空再照着申請一個,到時候發現問題再改。下面是原文:

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

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

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

  1. 創建新浪雲計算平臺應用
  2. 啓用微信公衆平臺開發模式
  3. 瞭解數據收發原理及消息格式
  4. 開發實現微信天氣預報功能

 

第一章 申請服務器資源

創建新浪雲計算應用

申請賬號

我們使用SAE新浪雲計算平臺作爲服務器資源,並且申請PHP環境+MySQL數據庫作爲程序運行環境。
申請地址:http://sae.sina.com.cn/ ,使用新浪微博賬號可以直接登錄SAE。

 

實名認證

新浪SAE要求用戶上傳身份證進行實名認證纔可以正常使用,在“我的賬號”下面可以找到“實名認證”這一標籤可進行實名認證操作。實名認證過程是免費的
不進行實名認證將無法繼續下面的教程,並且會導致Token驗證失敗或無法正常接收回復消息。
實名認證成功後,將如下圖所示。

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

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

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

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

填寫二級域名AppID、應用名稱、驗證碼,開發語言選擇PHP5.3,全部應用和框架下面選擇第一個【PHP 空應用】。然後點擊左下方的創建應用

 

應用創建成功。並自動跳轉到應用列表中,可以看到已經有剛纔創建的1354386063這個應用。

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

點擊剛纔創建的應用名稱,進入應用主頁。

點擊左側的應用管理下面的代碼管理

 

跳轉到代碼管理

點擊右側的

版本號默認爲1,點擊創建,有時會彈出安全登錄,需要輸入安全密碼,如果不知道或者忘記了,就點裏面的找回密碼,重新設置一下。:

驗證通過之後,如下所示

到這裏,就成功創建了一個域名URL爲 http://1354386063.sinaapp.com/ 的應用了,記住你的這個URL,後面將會用到。

 原文:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html 

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

下述代碼是一個微信接口文件,看不懂沒有關係,你可以暫時不用弄明白它的意思。

如果想弄明白,可以購買《微信公衆平臺開發最佳實踐》,在該書中第25頁~第27頁有詳細講解。

複製代碼
<?php
/*
    方倍工作室 http://www.cnblogs.com/txw1958/
    CopyRight 2013 www.doucube.com  All Rights Reserved
*/

define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

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)){
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $fromUsername = $postObj->FromUserName;
            $toUsername = $postObj->ToUserName;
            $keyword = trim($postObj->Content);
            $time = time();
            $textTpl = "<xml>
                        <ToUserName><![CDATA[%s]]></ToUserName>
                        <FromUserName><![CDATA[%s]]></FromUserName>
                        <CreateTime>%s</CreateTime>
                        <MsgType><![CDATA[%s]]></MsgType>
                        <Content><![CDATA[%s]]></Content>
                        <FuncFlag>0</FuncFlag>
                        </xml>";
            if($keyword == "?" || $keyword == "?")
            {
                $msgType = "text";
                $contentStr = date("Y-m-d H:i:s",time());
                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                echo $resultStr;
            }
        }else{
            echo "";
            exit;
        }
    }
}
?>
複製代碼

我們將使用上述代碼與微信公衆平臺對接。

將上述代碼用專業的軟件存爲utf-8格式的index.php文件後再使用WinRAR壓縮爲index.zip,

或者直接下載方倍工作室已經壓縮好的index.zip文件。點此進入下載

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

再選擇上傳代碼包,點擊上傳文件,選擇剛纔的index.zip文件,點擊上傳,上傳成功後中間是一個綠色的橫條,如下所示

如果沒有綠色的橫條,表示上傳失敗,需要重試。可以考慮在Chrome瀏覽器下重試一下。

點擊編輯代碼按鈕,

 有時候需要輸入自己的安全密碼,如果不記得了就點擊“找回密碼”。

安全驗證成功後繼續之前的操作。

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

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

 

第二章 啓用開發模式

微信公衆平臺開發模式

高級功能

微信公衆平臺地址:https://mp.weixin.qq.com 

登錄微信公衆平臺後臺,在左側列表中最下方,找到“開發者中心”,點擊進入

進入服務器配置填寫框。

點擊“修改配置”按鈕

此處的URL爲上篇中介紹的雲應用的域名,而Token在index.php中定義爲weixin。EncodingAESKey則不用填,點擊“隨機生成”讓自動生成一個,消息加解密方式選擇“明文模式”,然後點擊“提交”按鈕。

 

在彈出的提示框中,點擊“確定”

配置修改後如圖所示,再點擊“啓用”按鈕

詢問“是否確定開啓服務器配置”,點擊“確定”

如果提示“token驗證失敗”,可以先重次幾次,微信服務器有時候不穩定。並確保你的SAE已經上傳身份證通過實名認證!

如果還是失敗,請先用微信調試器測試一下url和token是否正確,點此查看詳細測試方法

成功啓用後如圖。

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

 

自動回覆

在上面的例子中,實現了一個發送“?”就能回覆當前時間的功能。
效果如下:

至此,你的微信公衆平臺賬號已經實現自動回覆了。 

 

第三章 數據收發原理及消息數據格式

 

★ 本章是理論部分,初學者會比較難以理解,不用太過追究。

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

在開發者首次提交驗證申請時,微信服務器將發送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_d035bb259cf5]]></ToUserName>
    <FromUserName><![CDATA[owEUGj4BW8yeWRvyEERiVGKwAF1Q]]></FromUserName>
    <CreateTime>1364883809</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <MediaId><![CDATA[JfmCezZ3Cwp0FwUvMADwwhvp-XScuvpictubpw0c6ALyA8tj3HLU4PoXzMpIY72P]]></MediaId>
    <Format><![CDATA[amr]]></Format>
    <MsgId>5862131322594912688</MsgId>
</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]]></FromUserName>
<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值對應

 

 

 第四章 實現天氣預報功能

 

這一章裏,我們來實現微信上的天氣預報功能,我們使用方倍工作室的天氣預報接口,其接口爲

http://apix.sinaapp.com/weather/

這個接口的參數appkey爲公衆號原始id,參數city爲城市名

例如,查詢深圳的天氣預報時,將city值做urlencode,最終訪問的url爲

http://apix.sinaapp.com/weather/?appkey=trialuser&city=%E6%B7%B1%E5%9C%B3

返回的內容如下

複製代碼
[
    {
        "Title": "深圳天氣預報",
        "Description": "",
        "PicUrl": "",
        "Url": ""
    },
    {
        "Title": "【實況】溫度18℃ 溼度59%% 東北風2級 發佈時間:08:55",
        "Description": "",
        "PicUrl": "",
        "Url": ""
    },
    {
        "Title": "【舒適】建議着長袖T恤、襯衫加單褲等服裝。年老體弱者宜着針織長袖襯衫、馬甲和長褲。",
        "Description": "",
        "PicUrl": "",
        "Url": ""
    },
    {
        "Title": "11月19日 週三 晴 23℃~17℃ 無持續風向 微風 日出日落:06:38~17:39",
        "Description": "",
        "PicUrl": "http://discuz.comli.com/weixin/weather/icon/d00.jpg",
        "Url": ""
    },
    {
        "Title": "11月20日 週四 多雲 25℃~17℃ 無持續風向 微風 日出日落:06:39~17:38",
        "Description": "",
        "PicUrl": "http://discuz.comli.com/weixin/weather/icon/d01.jpg",
        "Url": ""
    },
    {
        "Title": "11月21日 週五 多雲 26℃~18℃ 無持續風向 微風 日出日落:06:40~17:38",
        "Description": "",
        "PicUrl": "http://discuz.comli.com/weixin/weather/icon/d01.jpg",
        "Url": ""
    }
]
複製代碼

我們在微信中調用這一接口來獲取天氣預報信息,實現代碼如下

複製代碼
<?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"];
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if($tmpStr == $signature){
            echo $echoStr;
            exit;
        }
    }

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

            $result = "";
            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)
    {
        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)
    {
        if (!isset($content) || empty($content)){
            return "";
        }
        $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)
    {
      
    }
}
?>
複製代碼

上述代碼的下載地址爲 http://pan.baidu.com/s/1gdsyHWJ,同樣的方法,可將代碼上傳到SAE上。

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

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

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

 

 

第五章 小結

 

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

  • 1. 你通過本教程得到了一個免費的新浪雲計算空間,雲計算哦
  • 2. 你成功啓用了開發模式,並且實現了時間的自動回覆
  • 3. 你瞭解了微信公衆平臺開發的原理,並且熟悉了各種消息及發送是怎麼一回事
  • 4. 你使用方倍工作室的天氣預報接口,實現了一個微信公衆平臺上的天氣預報功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章