參考微信公眾平臺開發(fā)者文檔
https://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
- 下載示例代碼
- 將示例代碼通過FTP傳至自己的服務器
- 配置域名和Token(我這里是dandan)
- 隨機生成EncodingAESKey
- 驗證
新定義一個方法
public function index(){
if (isset($_GET['echostr'])){
$this->valid();
} else {
$this->responseMsg();
}
注釋掉
//$wechatObj->valid();
新加一行
$wechatObj->index();
開發(fā)者文檔->消息管理->被動回復消息
微信的示例代碼里面自帶了一個回復文本消息的XML數(shù)據(jù)包
if(!empty( $keyword ))
{
$msgType = "text";
$contentStr = "Welcome to wechat world!";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
示例代碼改到這一步的話碰酝,你發(fā)送任意一個字符給公眾號吼鱼,他都會回復你
Welcome to wechat world雄卷!
對比一下文本消息满哪、圖片消息啃勉,語音消息的數(shù)據(jù)包結(jié)構(gòu)
文本消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>
圖片消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
語音消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<Voice>
<MediaId><![CDATA[media_id]]></MediaId>
</Voice>
</xml>
可以發(fā)現(xiàn)MsgType代表的就是消息類型罕拂,語音消息和圖片消息都有一個MediaID仰剿。
圖片、語音另绩、音樂儒陨、還有視頻花嘶。這些都屬于媒體,上傳到微信服務器后都會生成一個MediaID蹦漠,相當于每個文件的"身份證"椭员。
微信的示例代碼中沒有回復圖片消息和語音消息的數(shù)據(jù)包,所以需要導入笛园。
$imgTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>";
$voiceTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>
</xml>";
還有一個就是默認的示例代碼中沒有消息類型拆撼,所以需要添加一個變量。
$type = $postObj->MsgType;
然后用If 語句判斷消息類型做出相應的回復喘沿。
- 用戶發(fā)送文本消息回復給用戶 文本消息+'用戶發(fā)送的文本'。
用戶發(fā)送圖片消息回復給用戶同一張圖片竭贩。
-
用戶發(fā)送語音消息回復給用戶同樣的語音消息蚜印。
if($type == 'text') { $str = '文本消息' . $keyword; $MsgType = 'text'; $echo = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str); }else if ($type == 'image'){ $MsgType = 'image'; $echo = sprintf($imgTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId); }else if ($type =='voice'){ $MsgType = 'voice'; $echo = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId); }
這里要注意的是sprintf()里面需要交換fromUsername和toUsername的順序,其他的變量順序不能顛倒留量,如果顛倒則公眾號無法正痴常回復。因為fromUsername既代表用戶發(fā)給你楼熄,也代表你發(fā)送給用戶忆绰,toUsername同理,微信里面還有很多東西可以去嘗試比如語音識別接口等等可岂。
完整代碼如下
<?php
/**
* wechat php test
*/
//define your token
define("TOKEN", "dandan");
$wechatObj = new wechatCallbackapiTest();
//$wechatObj->valid();
$wechatObj->index();
class wechatCallbackapiTest
{
public function index(){
if (isset($_GET['echostr'])){
$this->valid();
} else {
$this->responseMsg();
}
}
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$type = $postObj->MsgType;
$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>";
$imgTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Image>
<MediaId><![CDATA[%s]]></MediaId>
</Image>
</xml>";
$voiceTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Voice>
<MediaId><![CDATA[%s]]></MediaId>
</Voice>
</xml>";
if($type == 'text') {
$str = '文本消息' . $keyword;
$MsgType = 'text';
$echo = sprintf($textTpl,$fromUsername,$toUsername,$time,$MsgType,$str);
}else if ($type == 'image'){
$MsgType = 'image';
$echo = sprintf($imgTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
}else if ($type =='voice'){
$MsgType = 'voice';
$echo = sprintf($voiceTpl,$fromUsername,$toUsername,$time,$MsgType,$postObj->MediaId);
}
echo $echo;
}else {
echo "";
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;
}
}
}
?>