本节书摘来自华章出版社《微信公众平台开发最佳实践》一 书中的第3章,第3.1节,作者:方倍工作室,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
第3章 基 础 接 口
基础接口是微信公众账号在申请后就默认拥有而不需要通过微信认证获得的接口。微信公众平台开发者中心启用之后,需要使用基础接口实现基本消息的接收与发送。基础接口包括三个主要的部分:接收用户消息,发送被动响应消息,接收事件推送消息。本章将介绍这三个部分是如何实现的。
3.1 接收用户消息
微信公众账号能够接收用户发送的六种格式的消息:文本(包括表情)、图片、语音、视频、地理位置、链接。下面将分别介绍这六种消息。
3.1.1 文本消息
用户向微信公众账号发送文本消息的示例如图3-1所示。
用户发送文本消息时,微信公众账号接收到的XML数据格式如下所示:
<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>```
用户发送的文本消息的参数及描述如表3-1所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/30b5023f90f46c2ca2aa5bcb23b987dfbb81d72f.png" width="" height="">
</div>
####3.1.2 图片消息
用户向微信公众账号发送图片消息的示例如图3-2所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/4ca8680b910d0e600117d0f85744f5b498eab289.png" width="" height="">
</div>
用户发送图片消息时,微信公众账号接收到的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[PGKsO3LAgbVTsFYO7FGu51KUYa07D
0C_Nozz2fn1z6VYtHOsF59PTFl0vagGxkVH]]>`
用户发送图片消息的参数及描述如表3-2所示。
3.1.3 语音消息
用户向微信公众账号发送语音消息的示例如图3-3所示。
用户发送语音消息时,微信公众账号接收到的XML数据格式如下所示:
<xml>
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]></FromUserName>
<CreateTime>1359028025</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[hGm9wmKth8RO_tuv5k9fJkSbovXWzZ
VYwG2jSsL7ukCqq6q1SiLzYnFEngFNUijs]]></MediaId>
<Format><![CDATA[amr]]></Format>
<MsgId>5836980921722890003</MsgId>
<Recognition><![CDATA[]]></Recognition>
</xml>```
用户发送语音消息的参数及描述如表3-3所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/bc9b8b4915eb20983b5184732d830ba369a269e7.png" width="" height="">
</div>
####3.1.4 视频消息
用户向微信公众账号发送视频消息的示例如图3-4所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/e59d3fb62c47745e4e4104628c3e64f1767775a5.png" width="" height="">
</div>
用户发送视频消息时,微信公众账号接收到的XML数据格式如下所示:
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]>
<CreateTime>1359028186</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[DBVFRIj29LB2hxuYpc0R6VLyxwgyCH
ZPbRj_IIs6YaGhutyXUKtFSDcSCPeoqUYr]]>
<ThumbMediaId><![CDATA[mxUJ5gcCeesJwx2T9qsk62YzI
clCP_HnRdfTQcojlPeT2G9Q3d22UkSLyBFLZ01J]]>
<MsgId>5836981613212624665</MsgId>
用户发送视频消息的参数及描述如表3-4所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/49a817be659a338d6a671b1c1608f5d4b27596be.png" width="" height="">
</div>
####3.1.5 地理位置消息
用户向微信公众账号发送地理位置消息的示例如图3-5所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/beaa7aae2fb63c1d09f95861fc0aa580d9afb711.png" width="" height="">
</div>
用户发送地理位置消息时,微信公众账号接收到的XML数据格式如下所示:
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjqASyTPnxRmpS9O_
ruZGsfk]]>
<CreateTime>1359036619</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>22.539968</Location_X>
<Location_Y>113.954980</Location_Y>
<Scale>16</Scale>
<Label><![CDATA[中国广东省深圳市南山区深南大道9001号
邮政编码: 518053]]>
<MsgId>5837017832671832047</MsgId>
`
用户发送地理位置消息的参数及描述如表3-5所示。
3.1.6 链接消息
用户向微信公众账号发送链接消息的示例如图3-6所示。
用户发送链接消息时,微信公众账号接收到的XML数据格式如下所示:
<xml>
<ToUserName><![CDATA[gh_680bdefc8c5d]]></ToUserName>
<FromUserName><![CDATA[oIDrpjl2LYdfTAM-oxDgB4XZ
cnc8]]></FromUserName>
<CreateTime>1359709372</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[微信公众平台开发者的江湖]]></Title>
<Description><![CDATA[陈坤的微信公众号这段时间大火,大家...]]></Description>
<Url><![CDATA[http://www.cnblogs.com/txw1958/]]></Url>
<MsgId>5839907284805129867</MsgId>
</xml> ```
用户发送的链接消息的参数及描述如表3-6所示。
<div style="text-align: center"><img src="https://yqfile.alicdn.com/2dfbbe59908e3344d57a154ea05955c30eafb0a2.png" width="" height="">
</div>
####3.1.7 案例
前面的章节已经介绍了各种基础消息,本节将用代码实现上面的各种消息类型并且做出相应的回复处理。代码如下所示:.
<?php
//
// 接收用户消息
// 微信公众账号接收到用户的消息类型判断
//
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
$wechatObj->responseMsg();
}else{
$wechatObj->valid();
}
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);
$RX_TYPE = trim($postObj->MsgType);
//用户发送的消息类型判断
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;
case "location"://位置消息
$result = $this->receiveLocation($postObj);
break;
case "link": //链接消息
$result = $this->receiveLink($postObj);
break;
default:
$result = "unknow msg type: ".$RX_TYPE;
break;
}
echo $result;
}else {
echo "";
exit;
}
}
/*
* 接收文本消息
*/
private function receiveText($object)
{
$content = "你发送的是文本,内容为:".$object->Content;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 接收图片消息
*/
private function receiveImage($object)
{
$content = "你发送的是图片,地址为:".$object->PicUrl;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 接收语音消息
*/
private function receiveVoice($object)
{
$content = "你发送的是语音,媒体ID为:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 接收视频消息
*/
private function receiveVideo($object)
{
$content = "你发送的是视频,媒体ID为:".$object->MediaId;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 接收位置消息
*/
private function receiveLocation($object)
{
$content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 接收链接消息
*/
private function receiveLink($object)
{
$content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->
Description.";链接地址为:".$object->Url;
$result = $this->transmitText($object, $content);
return $result;
}
/*
* 回复文本消息
*/
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;
}
}
?>`
在responseMsg()方法中,先提取消息类型$postObj->MsgType,从而实现各种消息类型的分离。在类wechatCallbackapiTest中,为每种消息类型定义了接收方法函数。在每个方法里面,返回消息的主要特征值,组成文本消息作为内容回复。