轉自:http://www.cnblogs.com/txw1958/p/wechat-tutorial.htmlphp
關鍵字:微信公衆平臺開發
做者:方倍工做室html
在這篇微信公衆平臺開發教程中,咱們假定你已經有了PHP語言程序、MySQL數據庫、計算機網絡通信、及HTTP/XML/CSS/JS等基礎。git
咱們將使用微信公衆帳號方倍工做室做爲講解的例子,二維碼見底部。程序員
本系列教程將引導你完成以下任務:web
第一章 申請服務器資源sql
建立新浪雲計算應用數據庫
申請帳號json
咱們使用SAE新浪雲計算平臺做爲服務器資源,而且申請PHP環境+MySQL數據庫做爲程序運行環境。
申請地址爲:api
直接點擊上述網址,能夠看到右上角微博登陸的連接。
點擊進入以後,使用新浪微博帳號登陸
登陸以後,按照提示註冊我的信息便可。
建立新應用 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
回到首頁,在菜單頂部選擇 控制檯 ,再選擇 雲應用SAE 。
進入SAE應用列表
點擊下側的建立新應用,這時會彈出提示, 禁止放置違法違規內容,點擊繼續建立,彈出以下窗口。
選擇一個未使用的appid,若是總是已經被使用不知道該什麼好,就填寫你的QQ號或者手機號吧。
填寫二級域名AppID、應用名稱、驗證碼,開發語言選擇PHP5.3,所有應用和框架下面選擇第一個【PHP 空應用】。而後點擊左下方的建立應用
應用建立成功。並自動跳轉到應用列表中,能夠看到已經有剛纔建立的1354386063這個應用。
建立數據庫
點擊剛纔建立的應用名稱,進入應用主頁。
在左側的數據庫服務中找到MySQL
點擊進入MySQL類型選擇,這裏選擇獨享型MySQL
在建立獨享型MySQL中,使用微型配置,而後點擊「確認初始化」
底部將顯示任務進度。
等任務完成以後,再點擊銷燬MySQL按鈕,
這樣建立並銷燬一次,能夠多得到200雲豆。之後使用的時候,可使用免費的共享型MySQL或者使用收費但更穩定強大的獨享型MySQL。
建立版本 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
點擊剛纔建立的應用名稱,進入應用主頁。
點擊左側的應用管理下面的代碼管理,
在代碼管理中,選擇使用SVN託管的方式,不要使用git的方式。
跳轉到代碼管理
點擊右側的「建立版本」
版本號默認爲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()){ header('content-type:text'); 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已經上傳成功,雙擊能夠查看編輯裏面的代碼
新浪雲應用的建立就成功了。
實名認證
新浪SAE要求用戶上傳身份證進行實名認證才能夠正常使用,在左側菜單列表中能夠找到「實名認證」這一標籤可進行實名認證操做。實名認證過程是免費的。認證之後每個月免費有5G的流量。認證審覈須要1~3個工做日。
來不及準備身份證照片的話能夠先繼續下面的內容,改天再來進行實名認證。但在使用過程當中會受點影響。
若是不進行實名認證,SAE會在回覆的內容中會帶上干擾的html內容信息,從而致使Token驗證失敗或者該公衆號暫時沒法提供服務,請稍後再試。
實名認證須要填的信息以下
實名認證成功後,將以下圖所示。
充值(本步驟可選擇性進行)
新浪雲SAE實行的是配額免費+超額付費的方式,相關標準請查看SAE價格體系介紹。初期對於大部分用戶來講免費配額已夠用,若是您未來使用量比較大建議預先至少充值100元得到10000雲豆,以避免超額後應用被禁用而影響業務。
第二章 啓用開發模式
微信公衆平臺開發模式
高級功能
微信公衆平臺地址: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上。
在公衆帳號中使用的命令以下:
在你的公衆帳號輸入相應的命令,實現效果相似以下所示:
第五章 小結
總的來講,經過本教程,你獲得瞭如下收穫:
接下來該作什麼呢?你能夠學習開發一些基礎的經常使用功能,推薦:方倍工做室 編寫,機械工業出版社 出版的《微信公衆平臺開發最佳實踐 第2版》,裏面包含不少php開發技巧、數據庫使用、及近30項微信公衆平臺實用功能或技術 。
點擊圖標購買:
學習完這一層次以後,你能夠開始本身勝任一箇中小型的微信公衆平臺帳號功能的開發了。
若是你沒有PHP及Mysql方面的開發基礎,咱們也建議你購買《PHP和MySQL Web開發(原書第4版)》,該書被評爲「PHP和MySQL程序員的最佳參考書」,
點擊圖標購買
捐贈咱們
方倍工做室一直在致力於幫助開發人員更加快速方便的進行微信公衆平臺的開發,若是您對咱們的成果表示認同而且以爲對你有所幫助,歡迎您對咱們捐贈^_^。
原文:http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
============================================