新用户关注微信公众平台,将产生一个订阅事件,即subscribe事件,默认代码中没有对这一事件进行相应回复处理。
在新用户关注公众平台后,可能想知道该平台提供了哪些功能,以及怎样使用该平台,通俗一点讲就是该平台的“使用说明书”。例如下图两个服务号的处理:
微信目前提供了五种消息类型,分别为:
文本消息(text);
图片消息(image);
地理位置消息(location);
链接消息(link);
事件推送(event);接收到消息后,首先需要对消息类型做出判断,然后再针对不同类型的消息做出处理。在事件推送中,事件类型又分为三种,subscribe(订阅)、unsubscribe(取消订阅)、CLICK(自定义菜单点击事件),还需要再加一次判断;判断为subscribe事件后,根据设定好的欢迎消息,回复给用户。
代码实现代码如下:
<?php
$testObj = new Test();
if(!empty($_GET['echostr'])){
//验证配置信息
$testObj->valid();
}else{
//如果不是验证就不会有echostr这个参数
$testObj->responseMsg();
}
exit;
class Test
{
/**
* 绑定url、token信息
*/
public function valid(){
$echoStr = $_GET["echostr"];
if ($this->checkSignature()) {
ob_clean();
echo $echoStr;
}
exit();
}
/**
* 检查签名,确保请求是从微信发过来的
*/
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = "lingsg";//与在微信配置的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(){
//验证签名
if ($this->checkSignature()){
//获取到关注事件推送的XML数据
$postArr = $GLOBALS["HTTP_RAW_POST_DATA"];
$postObj = simplexml_load_string( $postArr );
//判断:消息类型是否是 事件推送
if( strtolower( $postObj->MsgType ) == 'event' ){
//判断:事件类型是否是 订阅(subscribe)
if( strtolower( $postObj->Event == 'subscribe' ) ){
$toUser = $postObj->FromUserName;
$fromUser = $postObj->ToUserName;
$time = time();
$msgType = 'text';
$content = '微信公众号:'.$fromUser.",\n你的微信openid是:".$toUser;
$template = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
$info = sprintf( $template, $toUser, $fromUser, $time, $msgType, $content );
echo $info;
}
}
}
}
}
?>
推送信息: