公众号关注/订阅事件-微信公众号开发
微信公众号开发之关注事件(订阅事件),当我们启用开发者设置后,微信本身的消息回复将无法使用,那么在用户关注我们公众号的时候就没有任何反馈了, 对用户体验是非常不友好的。下面教大家如果做关注事件,既用户关注公众号,系统给用户一个反馈。
一、公众号要求
1、认证
认证是指每年向腾讯提交认证资质(300元认证费的那个东西);
2、订阅号(企业)、服务号
类型可在登录公众号后右上角查看;
3、具备开发资质
会编写代码,或拥有开发技术人员;
4、拥有服务器
能够运行的服务器(配置无要求);
二、开发步骤
1、配置服务器
登录公众号、点击左侧“开发“->”基本设置”,填写“服务器配置”,填写服务器地址、令牌、加密方式;
2、校验token
关于如何进行token验证,请阅读:微信公众号token验证
3、判断请求类型
三、实例代码
token验证
/** * 服务器token校验 */ public function token() { //获得参数 signature nonce token timestamp echostr $nonce = input('get.nonce'); $token = 'shenlin'; $timestamp = input('get.timestamp'); $echostr = input('get.echostr'); $signature = input('get.signature'); //形成数组,然后按字典序排序 $array = [$nonce, $timestamp, $token]; sort($array); //拼接成字符串,sha1加密 ,然后与signature进行校验 $str = sha1(implode($array)); if($str == $signature && $echostr) { //第一次接入weixin api接口的时候 echo $echostr; exit; } else { $this->reponseMsg(); } }
事件推送代码:
/** * 接收事件推送并回复 */ public function reponseMsg() { //1.获取到微信推送过来post数据(xml格式) $postArr = file_get_contents("php://input"); //2.处理消息类型,并设置回复类型和内容 $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 = 'news'; $ArticleCount = 1; $Title = '我是图文内容的标题'; $Description = '我是图文内容的简介'; $PicUrl = '我是图文内容的封面路径'; $Url = '我是图文内容的链接地址'; $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <ArticleCount>%s</ArticleCount> <Articles> <item> <Title><![CDATA[%s]]></Title> <Description><![CDATA[%s]]></Description> <PicUrl><![CDATA[%s]]></PicUrl> <Url><![CDATA[%s]]></Url> </item> </Articles> </xml>"; $info = sprintf($template, $toUser, $fromUser, $time, $msgType, $ArticleCount, $Title, $Description, $PicUrl, $Url); echo $info; } } //如果是发送文本消息,则返回此消息 if(strtolower($postObj->MsgType) == 'text') { $template = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[%s]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $fromUser = $postObj->ToUserName; $toUser = $postObj->FromUserName; $time = time(); $msgType = 'text'; echo sprintf($template, $toUser, $fromUser, $time, $msgType, '发送的信息是:'.$postObj->Content); } }
后续将继续更新,敬请期待!