微信事件推送及消息回复接口编写

简介:本文主要介绍微信公众号消息推送的原来,php接受消息推送后如何验证消息签名,验证通过后如何回复用户信息

微信事件推送是指用户在关注取消关注我们的公众号或者在公众号中给我们发消息时微信给我们服务器推送相关事件。微信推送的url是我们在微信公众号设置的事件推送url。处理事件的代码如下:

<?php
namespace app\wechat\controller\v1;
class Noticle{    
      public function index()
    {        
          //获取微信推送的数据
        $signature = $_GET['signature'];        
             $array = [            
                      'nonce'=>$_GET['nonce'],            
                      'timestamp'=>$_GET['timestamp'],            
                      'token'=>''     //自己在微信配置的token值
        ];        
            //将数组进行字典序排序
        sort($array);        
            //将数组拼接成字符串后进行shal加密
        $shal_str = sha1(implode($array));        
            //验证签名是否正确
        $echostr = $_GET['echostr'];        
            if($shal_str==$signature && $echostr){            
                  //接入微信api是验证其合法性
            echo $_GET['echostr'];
        }else{  //接入成功后微信其他事件推送的post数据中没有echostr
            $this->reponseMsg();
        }
    }    
      //接受事件推送并回复
    public function reponseMsg(){        
            //获取微信推送的post数据(xml格式)
        $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];        
            //将xml解析为对象
        $postObj = simplexml_load_string($postArr);        
            //判断事件类型
        if(strtolower($postObj->MsgType == 'event')){ //订阅事件
            if(strtolower($postObj->Event == 'subscribe')){ //关注事件
                //回复用户数据
                $toUser = $postObj->FromUserName;                
                        $fromUser = $postObj->toUserName;                
                        $time = time();                
                        $msgType = 'text';                
                        $content = '欢迎关注我们的微信公众号';                
                        $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime><![CDATA[%s]]></CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <content><![CDATA[%s]]></content>
                            </xml>";                
                        $info = sprintf($template,$toUser,$fromUser,$time,$msgType,$content);                
                        echo $info;
            }
        }
    }
}
编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1