功能
当开发者在微信开放平台启用了服务器配置后,在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息,处理自己的业务逻辑。
接收事件推送
1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送
返回示例
<xml>
<ToUserName>< ![CDATA[toUser] ]></ToUserName> //开发者微信号
<FromUserName>< ![CDATA[FromUser] ]></FromUserName> //openid
<CreateTime>123456789</CreateTime> //消息创建时间
<MsgType>< ![CDATA[event] ]></MsgType> //消息类型
<Event>< ![CDATA[subscribe] ]></Event> //事件类型
</xml>
代码逻辑
用户在公众内触发特殊事件或者向公众号内发送信息,微信会将主要参数和用户的openid以xml格式发送到开发者配置的服务器中,开发者根据参数处理自己的业务逻辑并返回给微信xml数据,用来回复用户。
//配置服务器
public function serverMenu(){
if(!isset($_GET["echostr"])){
$this->responseMsg(); //接收事件推送
}else{
$this->valid(); //配置服务器
}
}
//事件消息
private function responseMsg(){
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //获取微信服务器返回的xml数据
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); //把xml数据转为对象
//getLogs('',$postStr); //调试开启查看参数
if (!empty($postStr)) {
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE) {
case "event":
$content = $this->receiveEvent($postObj);
break;
case "text":
$content = '您好!';//这里是向关注者发送的提示信息(设置自动回复)
break;
case "image":
break;
case "voice":
break;
case "video":
break;
case "shortvideo":
break;
case "location":
break;
case "link":
break;
}
$result = $this->transmitText($postObj,$content);
echo $result;
} else {
}
exit;
}
//特殊事件
private function receiveEvent($object){
$content = "";
switch (strtolower($object->Event)){
case "subscribe":
$content = '';//这里是首次关注发送的提示信息
break;
case "unsubscribe":
$content = "";
break;
case "click":
if($object->EventKey=='ACTIVE_URL'){ //底部菜单自己设置的type为CLICK的key值
$content = '';
}
break;
case "scan":
$scene_id = $object->EventKey;
break;
case "location":
break;
}
return $content;
}
//消息推送
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>
<FuncFlag>0</FuncFlag>
</xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); //sprintf() 函数把格式化的字符串写入变量中(%s占位符)
return $result;
}
注意事项
微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。
附上连接
微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454