溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php中微信公眾平臺交互與接口的示例分析

發(fā)布時間:2021-09-01 10:50:14 來源:億速云 閱讀:125 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹php中微信公眾平臺交互與接口的示例分析,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體內(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ù)器這個中轉(zhuǎn)站。

那么微信服務(wù)器這個中轉(zhuǎn)站到底有什么用?
對xml數(shù)據(jù)進(jìn)行加工包裝后展現(xiàn)在手機(jī)屏幕上。我們接受的圖文消息,如下:

單圖文:

php中微信公眾平臺交互與接口的示例分析

多圖文

php中微信公眾平臺交互與接口的示例分析

你會發(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)記一個MsgId,上傳的圖片、視頻、語音等也會被標(biāo)記一個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>;//視頻靜止時顯示那張圖片地址
</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[陳坤的微信公眾號這段時間大火,大家...]]></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>;//視頻靜止時顯示那張圖片地址
</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[ 【深圳】實況 溫度: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[ 【深圳】實況 溫度: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ù)填寫方面只做參照。以上代碼在需要的時候調(diào)用即可,這里只是為大家展現(xiàn)以下數(shù)據(jù)格式。
CDATA是一個標(biāo)記,被其標(biāo)記的文本數(shù)據(jù)中不會被xml解析器進(jìn)行解析。一個 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一個相當(dāng)于一個令牌。微信服務(wù)器與后臺服務(wù)器進(jìn)行通信時會出示該令牌,如果后臺服務(wù)器發(fā)現(xiàn)微信服務(wù)器與自己攜帶的令牌相同才會進(jìn)行通信,不相同則拒絕通信 。這個過程叫做token驗證(這個令牌不是token的值)。
上面比較形象的說話,下面我通過代碼來解釋
例如:url為http://weixinceshi111111.applinzi.com/index2.php
token:weixin
index2.php代碼

<?php
//
// 響應(yīng)用戶消息
// 微信公眾賬號響應(yīng)給用戶的不同消息類型
//微信服務(wù)器要和后臺服務(wù)器進(jìn)行通信首先要進(jìn)行token驗證,微信會通過get方式發(fā)送signature(微信加密簽名)、nonce(隨機(jī)數(shù))、timestamp(時間戳)、echostr(隨機(jī)字符串)。后臺服務(wù)器獲取之后會將timestamp、nonce與自身定義的TOKEN按照一定的順序拼接成字符串,通過shal加密后獲得的結(jié)果與signature進(jìn)行對比,如果相同則把echostr返回給微信服務(wù)器。 表示驗證成功。
header("content-type:text;charset=utf8");
define("TOKEN", "weixin");
//token驗證是通過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驗證的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ù)組中的元素連接成一個字符串
 $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字符串載入到一個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 = "這是個文本消息";
 $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()這個函數(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)于一個工具,具備特定的功能。比如你在建造房子的時候需要在墻上鉆孔,你就會使用鉆機(jī)工具來鉆孔。從調(diào)來工具到鉆孔完成,你要完成插電、校準(zhǔn)、鉆孔等一系列步驟,最終實現(xiàn)你的目標(biāo)。鉆機(jī)就是我們的接口,插電、校準(zhǔn)、鉆孔就是我們調(diào)用工具完成目的步驟。

微信的創(chuàng)建菜單接口舉例。

調(diào)用接口的步驟:
1、獲得微信菜單接口的連接地址,通過curl函數(shù)與這個接口建立對話。
2、把創(chuàng)建菜單數(shù)據(jù)發(fā)送給這個接口。
接口調(diào)用完成,這個接口會自動把這些數(shù)據(jù)進(jìn)行處理并在微信公眾好頁面生成菜單。

以上是“php中微信公眾平臺交互與接口的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI