最基本的微信后台需要实现两个功能,第一,通过开发者模式的验证,第二,对用户发来的消息进行回复。
一,开发者模式的验证时容易出的错
1.TOKEN定义,与微信验证是保持一致。如下所示:
define(“TOKEN”, “weixin”);
2.验证函数valid()中需要在回复时设置header,有些网上给出的代码没有设置,导致出错。
二,对用户发来的消息进行回复
微信用户发来的信息有很多类型,主要是两大类,普通型和事件型。
普通型
1 文本消息
2 图片消息
3 语音消息
4 视频消息
5 小视频消息
6 地理位置消息
7 链接消息
事件型
1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送
以上各种消息发来的格式可以参看
http://mp.weixin.qq.com/wiki/17/fc9a27730e07b9126144d9c96eaf51f9.html
http://mp.weixin.qq.com/wiki/14/f79bdec63116f376113937e173652ba2.html
以下代码中,responseMsg()中提取了发来的消息中的MsgType字段,此字段对应用户发来消息的类型,根据类型的不同对其进行处理和回复。
<?php
define("TOKEN", "weixin");//设置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()){
header('content-type:text');//有些网上给出的代码没有header设置,导致验证失败
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;
}
}
//响应消息
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 "event"://事件
$result = $this->receiveEvent($postObj);
break;
case "text"://文本
$result = $this->receiveText($postObj);
break;
default:
$result = "new type";
break;
}
echo $result;
}else {
echo "";
exit;
}
}
//接收事件消息
private function receiveEvent($object)
{
$content = "";
switch ($object->Event)
{
case "subscribe"://关注事件
$content = "欢迎关注";
break;
case "unsubscribe"://取消关注
$content = "取消关注";
break;
default:
$content = "receive a new event: ".$object->Event;
break;
}
if (is_array($content)){
$result = $this->transmitNews($object, $content);
}else{
$result = $this->transmitText($object, $content);
}
return $result;
}
//接收文本消息
private function receiveText($object)
{
$keyword = trim($object->Content);
switch ($keyword){
case "测试":
$result = $this->transmitText($object, "你输入了测试");
break;
default:
$result = $this->transmitText($object, "你没有输入测试");
break;
}
return $result;
}
//回复文本消息
private function transmitText($postObj, $content)
{
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$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>";
$msgType = "text";
$result= sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $content);
return $result;
}
}
?>