在這篇微信公眾平臺(tái)開發(fā)教程中,我們假定你已經(jīng)有了PHP語言程序、MySQL數(shù)據(jù)庫、計(jì)算機(jī)網(wǎng)絡(luò)通訊、及HTTP/XML/CSS/JS等基礎(chǔ)。
我們將使用微信公眾賬號(hào)方倍工作室作為講解的例子,二維碼見底部。
本系列教程將引導(dǎo)你完成如下任務(wù):
創(chuàng)建新浪云計(jì)算平臺(tái)應(yīng)用
啟用微信公眾平臺(tái)開發(fā)模式
基礎(chǔ)接口消息及事件
微信公眾平臺(tái)PHP SDK
微信公眾平臺(tái)開發(fā)模式原理
開發(fā)天氣預(yù)報(bào)功能
第一章 申請(qǐng)服務(wù)器資源
創(chuàng)建新浪云計(jì)算應(yīng)用
申請(qǐng)賬號(hào)
我們使用SAE新浪云計(jì)算平臺(tái)作為服務(wù)器資源,并且申請(qǐng)PHP環(huán)境+MySQL數(shù)據(jù)庫作為程序運(yùn)行環(huán)境。
申請(qǐng)地址:http://sae.sina.com.cn/ ,使用新浪微博賬號(hào)可以直接登錄SAE,登錄后SAE將贈(zèng)送500個(gè)免費(fèi)云豆。
創(chuàng)建新應(yīng)用
登錄后點(diǎn)擊頂部【我的首頁 】
點(diǎn)擊下側(cè)的創(chuàng)建新應(yīng)用,這時(shí)會(huì)彈出提示, 禁止放置違法違規(guī)內(nèi)容,點(diǎn)擊繼續(xù)創(chuàng)建,彈出如下窗口。
選擇一個(gè)未使用的appid,如果老是已經(jīng)被使用不知道該什么好,就填寫你的QQ號(hào)或者手機(jī)號(hào)吧。
填寫二級(jí)域名AppID、應(yīng)用名稱、驗(yàn)證碼,開發(fā)語言選擇PHP,應(yīng)用類型選擇web應(yīng)用。然后點(diǎn)擊創(chuàng)建應(yīng)用
應(yīng)用創(chuàng)建成功。并自動(dòng)跳轉(zhuǎn)到應(yīng)用列表中,可以看到已經(jīng)有剛才創(chuàng)建的CCTV-7
選擇CCTV-7右側(cè)的應(yīng)用管理 下面的代碼管理 ,
跳轉(zhuǎn)到代碼管理
點(diǎn)擊右側(cè)的
![微信公眾平臺(tái)開發(fā)入門教程](http://m.gooddi.cn/file/upload/201509/22/23-33-02-83-1.jpg)
版本號(hào)默認(rèn)為1,點(diǎn)擊創(chuàng)建,成功后如下圖所示:
到這里,就成功創(chuàng)建了一個(gè)域名URL為 http://cctv7.sinaapp.com/ 的應(yīng)用了。
上傳代碼 http://www.cnblogs.com/txw1958/p/wechat-tutorial.html
將以下代碼復(fù)制下來,另存為index.php。必須使用專業(yè)的開發(fā)編輯軟件操作,例如Notepad++,不要使用Windows自帶的記事本等。
<?php 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); $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; } } } ?>
然后將index.php文件壓縮成ZIP格式,注意不能用RAR格式
這樣會(huì)生成一個(gè)index.zip的文件?;蛘咧苯酉螺d方倍已經(jīng)壓縮好的zip文件 點(diǎn)此下載
在代碼管理界面中,選擇操作按鈕。
選擇上傳代碼包。
點(diǎn)擊上傳文件,選擇剛才壓縮好的index.zip文件,點(diǎn)擊上傳,上傳成功后如下所示
點(diǎn)擊操作按鈕下的代碼編輯,
我們可以看到index.php已經(jīng)上傳成功,雙擊可以查看編輯里面的代碼
新浪云應(yīng)用的創(chuàng)建就成功了。
第二章 啟用開發(fā)模式
微信公眾平臺(tái)開發(fā)模式
高級(jí)功能
微信公眾平臺(tái)地址:https://mp.weixin.qq.com
登錄微信公眾平臺(tái)后臺(tái),選擇高級(jí)功能,進(jìn)入后就看到兩種模式
我們需要先關(guān)閉編輯模式。點(diǎn)擊編輯模式的進(jìn)入
滑動(dòng)關(guān)閉
開發(fā)模式
進(jìn)入開發(fā)模式里面
點(diǎn)擊成為開發(fā)者
彈出URL和Token填寫框
此處的URL為上篇中介紹的云應(yīng)用的域名,而Token在index.php中定義為weixin。提交后提示你已成為開發(fā)者。
再滑動(dòng)右上角啟用按鈕。
恭喜,你成功啟用開發(fā)模式。
自動(dòng)回復(fù)
在上面的例子中,實(shí)現(xiàn)了一個(gè)發(fā)送“?”就能回復(fù)當(dāng)前時(shí)間的功能。
效果如下:
至此,你的微信公眾平臺(tái)賬號(hào)已經(jīng)實(shí)現(xiàn)自動(dòng)回復(fù)了。
第三章 基礎(chǔ)接口消息及事件
所有賬號(hào)在申請(qǐng)之后,都將獲得基礎(chǔ)接口的權(quán)限,基礎(chǔ)接口中將包括接收用戶消息,向用戶回復(fù)消息,接受事件推送等三種服務(wù)。
接收用戶消息
目前普通用戶能向公眾賬號(hào)推送五種格式的消息:文本(包括表情)、語音、圖片、視頻、位置、鏈接。
下面就這五種分別詳解如下:
1. 文本(包括表情)
發(fā)送文本及表情
2. 圖片
發(fā)送圖片
3. 語音
發(fā)送語音
4. 視頻
發(fā)送視頻
5. 位置
發(fā)送位置
6. 鏈接
發(fā)送鏈接
向用戶回復(fù)消息
目前普通公眾賬號(hào)能向用戶推送六種格式的消息:文本、圖文、音樂、圖片、語音、視頻。其中圖文消息包括單條圖文消息和多條圖文消息,展示方式有一點(diǎn)點(diǎn)不同。
下面就這幾種分別詳解如下:【圖片、語音、視頻由于需要用到和高級(jí)接口相關(guān)的media_id,在本教程中暫不討論?!?/div>
1. 文本消息格式
回復(fù)文本
2. 圖文消息格式
2.1 單條圖文消息
回復(fù)單條圖文
2.2 多圖文消息
回復(fù)多圖文
3. 音樂消息
回復(fù)音樂消息
接收事件推送
目前用戶在關(guān)注和取消關(guān)注,以及點(diǎn)擊菜單的時(shí)候會(huì)自動(dòng)向公眾平臺(tái)發(fā)送事件推送消息:
1. 關(guān)注事件
![微信公眾平臺(tái)開發(fā)入門教程](http://m.gooddi.cn/file/upload/201509/22/23-33-02-18-1.jpg)
第四章 微信公眾平臺(tái)PHP SDK
方倍工作室開發(fā)了微信公眾平臺(tái)的PHPSDK,集成了目前所有消息及事件的接收及發(fā)送,代碼如下:
<?php define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) { $wechatObj->responseMsg(); }else{ $wechatObj->valid(); } class wechatCallbackapiTest { //驗(yàn)證消息 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; } } //響應(yīng)消息 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 = "歡迎關(guān)注方倍工作室 "; $content .= (!empty($object->EventKey))?("\n來自二維碼場(chǎng)景 ".str_replac("qrscene_","",$obje ct->EventKey)):""; break; case "unsubscribe": $content = "取消關(guān)注"; break; case "SCAN": $content = "掃描場(chǎng)景 ".$object->EventKey; break; case "CLICK": switch ($object->EventKey) { case "COMPANY": $content = "方倍工作室提供互聯(lián)網(wǎng)相關(guān)產(chǎn)品與服務(wù)。"; break; default: $content = "點(diǎn)擊菜單:".$object->EventKey; break; } break; case "LOCATION": $content = "上傳位置:緯度 ".$object->Latitude.";經(jīng)度 ".$object->Longitude; break; case "VIEW": $content = "跳轉(zhuǎn)鏈接 ".$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 = "這是個(gè)文本消息"; break; case "圖文": case "單圖文": $content = array(); $content[] = array("Title"=>"單圖文標(biāo)題", "Description"=>"單圖文內(nèi)容", "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標(biāo)題", "Description"=>"", "PicUrl"=>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>"多圖文2標(biāo)題", "Description"=>"", "PicUrl"=>"http://d.hiphotos.bdimg.com/wisegame/pic/item/f3529822720e0cf3ac9f1ada0846f21fbe09aaa3.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); $content[] = array("Title"=>"多圖文3標(biāo)題", "Description"=>"", "PicUrl"=>"http://g.hiphotos.bdimg.com/wisegame/pic/item/18cb0a46f21fbe090d338acc6a600c338644adfd.jpg", "Url" =>"http://m.cnblogs.com/?u=txw1958"); break; case "音樂": $content = array("Title"=>"最炫民族風(fēng)", "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; } //接收?qǐng)D片消息 private function receiveImage($object) { $content = array("MediaId"=>$object->MediaId); $result = $this->transmitImage($object, $content); return $result; } //接收位置消息 private function receiveLocation($object) { $content = "你發(fā)送的是位置,緯度為:".$object->Location_X.";經(jīng)度為:".$object->Location_Y.";縮放級(jí)別為:".$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 = "你發(fā)送的是鏈接,標(biāo)題為:".$object->Title.";內(nèi)容為:".$object->Description.";鏈接地址為:".$object->Url; $result = $this->transmitText($object, $content); return $result; } //回復(fù)文本消息 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; } //回復(fù)圖片消息 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; } //回復(fù)語音消息 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; } //回復(fù)視頻消息 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; } //回復(fù)圖文消息 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; } //回復(fù)音樂消息 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'], $m usicArray['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."\r\n", FILE_APPEND); } } } ?>
使用第一章同樣方法,將上述代碼另存為index.php,壓縮成index.zip,或者直接點(diǎn)擊下載,上傳到SAE,你的公眾賬號(hào)就能接收及回復(fù)所有消息類型及事件通知了。
在公眾賬號(hào)中回復(fù)以下文字,你將得到和上一章一樣的回復(fù)內(nèi)容。
文本 圖文 多圖文 音樂 時(shí)間
還可以嘗試以下操作,體驗(yàn)一下其他消息
發(fā)送一張圖片給公眾賬號(hào) 發(fā)送一段語音給公眾賬號(hào) 發(fā)送一段視頻給公眾賬號(hào) 發(fā)送位置信息給公眾賬號(hào) 發(fā)送收藏中的鏈接給公眾賬號(hào)
第五章 微信公眾平臺(tái)開發(fā)模式原理分析
在體驗(yàn)了上一節(jié)的各種功能之后,我們只是知其然,這一節(jié)里面,將介紹在上面的基礎(chǔ)上介紹微信公眾平臺(tái)收發(fā)消息機(jī)制及原理,這是知其所以然。
開發(fā)模式成為開發(fā)者時(shí)的消息校驗(yàn)原理
在開發(fā)者首次提交驗(yàn)證申請(qǐng)時(shí),微信服務(wù)器將發(fā)送GET請(qǐng)求到填寫的URL上,并且?guī)纤膫€(gè)參數(shù)(signature、timestamp、nonce、echostr),開發(fā)者通過對(duì)簽名(即signature)的效驗(yàn),來判斷此條消息的真實(shí)性。
此后,每次開發(fā)者接收用戶消息的時(shí)候,微信也都會(huì)帶上前面三個(gè)參數(shù)(signature、timestamp、nonce)訪問開發(fā)者設(shè)置的URL,開發(fā)者依然通過對(duì)簽名的效驗(yàn)判斷此條消息的真實(shí)性。效驗(yàn)方式與首次提交驗(yàn)證申請(qǐng)一致。
參數(shù) 描述 signature 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請(qǐng)求中的timestamp參數(shù)、nonce參數(shù)。 timestamp 時(shí)間戳 nonce 隨機(jī)數(shù) echostr 隨機(jī)字符串
開發(fā)者通過檢驗(yàn)signature對(duì)請(qǐng)求進(jìn)行校驗(yàn)(下面有校驗(yàn)方式)。若確認(rèn)此次GET請(qǐng)求來自微信服務(wù)器,請(qǐng)?jiān)瓨臃祷豦chostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
加密/校驗(yàn)流程如下:
1. 將token、timestamp、nonce三個(gè)參數(shù)進(jìn)行字典序排序
2. 將三個(gè)參數(shù)字符串拼接成一個(gè)字符串進(jìn)行sha1加密
3. 開發(fā)者獲得加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
啟用接口是由代碼中的checkSignature()函數(shù)來實(shí)現(xiàn)校驗(yàn)的。如果對(duì)這一原理難以理解,可以暫時(shí)不用深究,繼續(xù)看下面。
成為開發(fā)者后消息收發(fā)時(shí)的原理
再來看下這個(gè)圖,當(dāng)用戶發(fā)送一個(gè)“?”時(shí),系統(tǒng)回復(fù)了一個(gè)時(shí)間
這一原理的消息流程圖如下所示。
從上圖可以看出,用戶在發(fā)送一個(gè)?后,微信服務(wù)器將組裝一個(gè)消息發(fā)送給我們自己的服務(wù)器,自己的服務(wù)器然后回復(fù)一個(gè)時(shí)間,并且將該時(shí)間也按一定的規(guī)則組裝,回復(fù)給公眾賬號(hào),公眾賬號(hào)再回復(fù)給用戶,在這個(gè)收發(fā)過程中,發(fā)送方和接收方進(jìn)行了調(diào)換(ToUserName和FromUserName值互換),收發(fā)都是以xml格式在后臺(tái)進(jìn)行傳輸?shù)模?/div>
所以掌握各種消息類型的收發(fā)就是進(jìn)行微信公眾平臺(tái)開發(fā)的基礎(chǔ) !
下面對(duì)前面所述的各種消息類型講解其XML數(shù)據(jù)包的格式。
各種收發(fā)消息的XML數(shù)據(jù)包分析
接收消息
1. 文本(包括表情)
發(fā)送文本及表情
文字后臺(tái)格式:
<xml> <ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName> <FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_ruZGsfk]]></FromUserName> <CreateTime>1359028446</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[測(cè)試文字]]></Content> <MsgId>5836982729904121631</MsgId></xml>
表情后臺(tái)格式
<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 消息接收方微信號(hào),一般為公眾平臺(tái)賬號(hào)微信號(hào) FromUserName 消息發(fā)送方微信號(hào) CreateTime 消息創(chuàng)建時(shí)間 MsgType 消息類型;文本消息為text Content 消息內(nèi)容 MsgId 消息ID號(hào)
可以看出,文本和表情的消息類型均為文本
2. 圖片
發(fā)送圖片
樂發(fā)網(wǎng)超市批發(fā)網(wǎng)提供超市貨源信息,超市采購進(jìn)貨渠道。超市進(jìn)貨網(wǎng)提供成都食品批發(fā),日用百貨批發(fā)信息、微信淘寶網(wǎng)店超市采購信息和超市加盟信息.打造國(guó)內(nèi)超市采購商與批發(fā)市場(chǎng)供應(yīng)廠商搭建網(wǎng)上批發(fā)市場(chǎng)平臺(tái),是全國(guó)批發(fā)市場(chǎng)行業(yè)中電子商務(wù)權(quán)威性網(wǎng)站。
本文內(nèi)容整合網(wǎng)站:百度百科、知乎、淘寶平臺(tái)規(guī)則
本文來源: 微信公眾平臺(tái)開發(fā)入門教程