php微信公眾平臺交互與接口詳解
本文分為三大部分為大家進(jìn)行介紹,具體內(nèi)容如下
1、微信用戶、微信服務(wù)器和后臺服務(wù)器的交互
例:微信用戶向公眾號發(fā)送一條文本消息,這條消息會首先傳給微信服務(wù)器,微信服務(wù)器處理這條信息并將其以xml數(shù)據(jù)格式傳遞給后臺服務(wù)器,后臺服務(wù)器接受到數(shù)據(jù)后會對數(shù)據(jù)進(jìn)行處理,再響應(yīng)數(shù)據(jù)以xml數(shù)據(jù)格式傳遞給微信服務(wù)器,微信服務(wù)器再響應(yīng)到用戶微信界面。
微信用戶與微信后臺服務(wù)器之間的交互過程就是數(shù)據(jù)傳遞過程,只不過需要需要通過微信服務(wù)器這個(gè)中轉(zhuǎn)站。
那么微信服務(wù)器這個(gè)中轉(zhuǎn)站到底有什么用?
對xml數(shù)據(jù)進(jìn)行加工包裝后展現(xiàn)在手機(jī)屏幕上。我們接受的圖文消息,如下:
單圖文:

多圖文

你會發(fā)現(xiàn)微信上幾乎所有的圖文都是這種格式,板式、大小都是一樣,這就是經(jīng)過微信服務(wù)器包裝后的結(jié)果。
2、交互的數(shù)據(jù)類型
微信用戶可以發(fā)送的數(shù)據(jù)類型
1、文本型(text)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>";
2、語音(voice)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <Format><![CDATA[amr]]></Format> <MsgId>5836982871638042400</MsgId> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> <Recognition><![CDATA[]]></Recognition>//recognition表示語音識別的結(jié)果 </xml>
3、圖片( img)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/L4qjYtOibummHn90t1mnaibYiaR8ljyicF3MW7XX3BLp1qZgUb7CtZ0D]]></PicUrl> <MsgId>5836982871638042400</MsgId> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> </xml>
每一條消息傳給微信服務(wù)器后都會被標(biāo)記一個(gè)MsgId,上傳的圖片、視頻、語音等也會被標(biāo)記一個(gè)mediaId。
4、視頻(video)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[vedio]]></MsgType> <MsgId>5836982871638042400</MsgId> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> <ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzI clCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediald>;//視頻靜止時(shí)顯示那張圖片地址 </xml>
5、地理位置消息(location)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[location]]></MsgType> <MsgId>5836982871638042400</MsgId> <Location_X>22.539968</Location_X> <Location_Y>113.954980</Location_Y> <Scale>16</Scale> <Label><![CDATA[中國廣東省深圳市南山區(qū)深南大道9001號 郵政編碼: 518053]]></Label> </xml>
6、鏈接消息(link)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[link]]></MsgType> <MsgId>5836982871638042400</MsgId> <Title><![CDATA[微信公眾平臺開發(fā)者的江湖]]></Title> <Description><![CDATA[陳坤的微信公眾號這段時(shí)間大火,大家...]]></Description> <Url><![CDATA[http://www.cnblogs.com/txw1958/]]></Url> <MsgId>5839907284805129867</MsgId> </xml>
后臺服務(wù)器響應(yīng)的消息類型
1、文本型(text)
2、語音(voice)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MsgId>5836982871638042400</MsgId> <Voice> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> </Voice> </xml>
3、圖片( img)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[image]]></MsgType> <MsgId>5836982871638042400</MsgId> <Image> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> </Image> </xml>
4、視頻(video)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[vedio]]></MsgType> <MsgId>5836982871638042400</MsgId> <video> <MediaId><![CDATA[PGKsO3LAgbVTsFYO7FGu51KUYa07D0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]></MediaId> <ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzI clCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]></ThumbMediald>;//視頻靜止時(shí)顯示那張圖片地址 </video> </xml>
5、音樂(music)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MsgId>5836982871638042400</MsgId> <Music> <Title><![CDATA[最炫民族風(fēng)]]></Title> <Description><![CDATA[鳳凰傳奇]]></Description> <MusicUrl><![CDATA[http://zj189.cn/zj/download/music/zxmzf.mp3]]></MusicUrl> <HQMusicUrl><![CDATA[http://zj189.cn/zj/dodownload/music/zxmzf.mp3]]></HQMusicUrl> </Music> </xml>
6、圖文(news)
<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[news]]></MsgType> <MsgId>5836982871638042400</MsgId> <Content><![CDATA[]]></Content> <ArticleCount>%s</ArticleCount> <Articles> <item> <Title><![CDATA[ 【深圳】實(shí)況 溫度:6℃ 濕度:62﹪ 風(fēng)速:東北風(fēng)2級]]></Title> <Description><![CDATA[]]></Description> <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl> <Url><![CDATA[]]></Url> </item> <item> <Title><![CDATA[ 【深圳】實(shí)況 溫度:6℃ 濕度:62﹪ 風(fēng)速:東北風(fēng)2級]]></Title> <Description><![CDATA[]]></Description> <PicUrl><![CDATA[http://www.doucube.com/weixin/weather/icon/banner.jpg]]></PicUrl> <Url><![CDATA[]]></Url> </item> </Articles> </xml>
上面代碼在數(shù)據(jù)填寫方面只做參照。以上代碼在需要的時(shí)候調(diào)用即可,這里只是為大家展現(xiàn)以下數(shù)據(jù)格式。
CDATA是一個(gè)標(biāo)記,被其標(biāo)記的文本數(shù)據(jù)中不會被xml解析器進(jìn)行解析。一個(gè) CDATA 部件以"
ToUserName 接收方帳號
FromUserName 發(fā)送方帳號
CreateTime 發(fā)送事件
MsgType 數(shù)據(jù)類型
Content 文本內(nèi)容
ArticleCount 圖文數(shù)量
MsgId 數(shù)據(jù)id
MediaId 媒介id
Title 標(biāo)題
Description 描述
MusicUrl 音樂連接地址
HQMusicUrl 高品質(zhì)音樂連接地址
2、具體的交互步驟即代碼
在上一章圖2中,我們?yōu)闇y試號定義了url和token。url就是與微信服務(wù)器進(jìn)行通信的后臺服務(wù)器地址,而token一個(gè)相當(dāng)于一個(gè)令牌。微信服務(wù)器與后臺服務(wù)器進(jìn)行通信時(shí)會出示該令牌,如果后臺服務(wù)器發(fā)現(xiàn)微信服務(wù)器與自己攜帶的令牌相同才會進(jìn)行通信,不相同則拒絕通信 。這個(gè)過程叫做token驗(yàn)證(這個(gè)令牌不是token的值)。
上面比較形象的說話,下面我通過代碼來解釋
例如:url為http://weixinceshi111111.applinzi.com/index2.php
token:weixin
index2.php代碼
<?php
//
// 響應(yīng)用戶消息
// 微信公眾賬號響應(yīng)給用戶的不同消息類型
//微信服務(wù)器要和后臺服務(wù)器進(jìn)行通信首先要進(jìn)行token驗(yàn)證,微信會通過get方式發(fā)送signature(微信加密簽名)、nonce(隨機(jī)數(shù))、timestamp(時(shí)間戳)、echostr(隨機(jī)字符串)。后臺服務(wù)器獲取之后會將timestamp、nonce與自身定義的TOKEN按照一定的順序拼接成字符串,通過shal加密后獲得的結(jié)果與signature進(jìn)行對比,如果相同則把echostr返回給微信服務(wù)器。 表示驗(yàn)證成功。
header("content-type:text;charset=utf8");
define("TOKEN", "weixin");
//token驗(yàn)證是通過get傳輸數(shù)據(jù),微信用戶發(fā)送的數(shù)據(jù)通過post方式發(fā)送。先進(jìn)行g(shù)et請求,再進(jìn)行post請求。
$wechatObj = new wechatCallbackapiTest();
//判斷是get請求還是post請求。$_GET['echostr']如果存在,表示是進(jìn)行token驗(yàn)證的get請求。反之是傳輸數(shù)據(jù)的post請求。
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();//響應(yīng)數(shù)據(jù)
}else{
$wechatObj->valid();//響應(yīng)
}
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);//對數(shù)組中的元素進(jìn)行排序
$tmpStr = implode($tmpArr);//將數(shù)組中的元素連接成一個(gè)字符串
$tmpStr = sha1($tmpStr);//對字符串進(jìn)行加密操作。
if($tmpStr == $signature){
return true;
}else{
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];//獲取發(fā)送過來的數(shù)據(jù)。
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', );//把xml字符串載入到一個(gè)SimpleXMLelement對象中。simplexml_load_string()是一種xml解析器。
$RX_TYPE = trim($postObj->MsgType);//trim去掉字符串兩端kongge。
//用戶發(fā)送的消息類型判斷
switch ($RX_TYPE)
{
case "text":
$result = $this->receiveText($postObj);
break;
case "image":
$result = $this->receiveImage($postObj);
break;
case "voice":
$result = $this->receiveVoice($postObj);
break;
case "video":
$result = $this->receiveVideo($postObj);
break;
default:
$result = "unknow msg type: ".$RX_TYPE;
break;
}
echo $result;
}else {
echo "";
exit;
}
}
private function receiveText($object)
{
$keyword = trim($object->Content);
if($keyword == "文本"){
//回復(fù)文本消息
$content = "這是個(gè)文本消息";
$result = $this->transmitText($object, $content);
}
else if($keyword == "圖文" || $keyword == "單圖文"){
//回復(fù)單圖文消息
$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");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "多圖文"){
//回復(fù)多圖文消息
$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");
$result = $this->transmitNews($object, $content);
}
else if($keyword == "音樂"){
//回復(fù)音樂消息
$content = array("Title"=>"最炫民族風(fēng)",
"Description"=>"歌手:鳳凰傳奇",
"MusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3",
"HQMusicUrl"=>"http://121.199.4.61/music/zxmzf.mp3");
$result = $this->transmitMusic($object, $content);
}
return $result;
}
private function receiveImage($object)
{
//回復(fù)圖片消息
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitImage($object, $content);;
return $result;
}
private function receiveVoice($object)
{
//回復(fù)語音消息
$content = array("MediaId"=>$object->MediaId);
$result = $this->transmitVoice($object, $content);;
return $result;
}
private function receiveVideo($object)
{
//回復(fù)視頻消息
$content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
$result = $this->transmitVideo($object, $content);;
return $result;
}
/*
* 回復(fù)文本消息,將要回復(fù)的xml消息進(jìn)行包裝。
*/
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);//sprintf()這個(gè)函數(shù)的作用還是比較有意思的,可以搜索看看。
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, $arr_item)
{
if(!is_array($arr_item))
return;
$itemTpl = " <item>
<Title><![CDATA[%s]]></Title>
<Description><![CDATA[%s]]></Description>
<PicUrl><![CDATA[%s]]></PicUrl>
<Url><![CDATA[%s]]></Url>
</item>
";
$item_str = "";
foreach ($arr_item 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($arr_item));
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'], $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;
}
}
?>
3.接口
3.1 接口是什么
接口就相當(dāng)于一個(gè)工具,具備特定的功能。比如你在建造房子的時(shí)候需要在墻上鉆孔,你就會使用鉆機(jī)工具來鉆孔。從調(diào)來工具到鉆孔完成,你要完成插電、校準(zhǔn)、鉆孔等一系列步驟,最終實(shí)現(xiàn)你的目標(biāo)。鉆機(jī)就是我們的接口,插電、校準(zhǔn)、鉆孔就是我們調(diào)用工具完成目的步驟。
微信的創(chuàng)建菜單接口舉例。
調(diào)用接口的步驟:
1、獲得微信菜單接口的連接地址,通過curl函數(shù)與這個(gè)接口建立對話。
2、把創(chuàng)建菜單數(shù)據(jù)發(fā)送給這個(gè)接口。
接口調(diào)用完成,這個(gè)接口會自動把這些數(shù)據(jù)進(jìn)行處理并在微信公眾好頁面生成菜單。
微信接口的調(diào)用方式請看下一章:微信公眾平臺開發(fā)(三):微信高級接口的調(diào)用。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ThinkPHP后臺首頁index使用frameset時(shí)的注意事項(xiàng)分析
這篇文章主要介紹了ThinkPHP后臺首頁index使用frameset時(shí)的注意事項(xiàng),需要的朋友可以參考下2014-08-08
phpstudy2018 訪問目錄服務(wù)權(quán)限問題
今天小編在更新phpstudy2018,安裝后訪問路徑出現(xiàn),下面通過本文給大家簡單介紹下,感興趣的朋友跟隨腳本之家小編一起看看吧2018-03-03
AJAX PHP無刷新form表單提交的簡單實(shí)現(xiàn)(推薦)
下面小編就為大家?guī)硪黄狝JAX PHP無刷新form表單提交的簡單實(shí)現(xiàn)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能
關(guān)鍵字加亮可以更好的幫助閱讀,本篇文章主要PHP實(shí)現(xiàn)多關(guān)鍵字加亮功能,具有一定的參考價(jià)值,有需要的可以看一下。2016-10-10
php實(shí)現(xiàn)微信公眾號企業(yè)轉(zhuǎn)賬功能
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)微信公眾號企業(yè)轉(zhuǎn)賬功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
phpexcel導(dǎo)入excel數(shù)據(jù)使用方法實(shí)例
phpexcel導(dǎo)入excel數(shù)據(jù)使用方法,大家參考使用吧2013-12-12

