微信公众号三方平台开发【代微信公众号接收消息事件并响应】

今天要讲的是代微信公众号接收消息并进行回复,这里要用到的就是咱们之前在微信公众号三方平台开发【帐号注册、平台创建】里写到的“公众号消息与事件接收URL”,在接收的目标方法里,我们首先要获取到微信推送过来post数据(xml格式),然后对其进行解密操作,从而得到消息内容。

这里我们会用到微信公众号三方平台开发【component_verify_ticket篇】里同样的解密方法进行数据的加解密操作,如下:

require_once(dirname(__FILE__).'/wxBizMsgCrypt.php');
//encodingAesKey和token均为申请三方平台是所填写的内容
$encodingAesKey = '公众号消息加解密Key';
$token = '公众号消息校验Token';
$appId = '三方平台appid';
$timeStamp = empty ( $_GET ['timestamp'] ) ? "" : trim ($_GET ['timestamp'] );
$nonce = empty ( $_GET ['nonce'] ) ? "" : trim ( $_GET['nonce'] );
$msg_sign = empty ( $_GET ['msg_signature'] ) ? "" : trim( $_GET ['msg_signature'] );
$pc = new \WXBizMsgCrypt ( $token, $encodingAesKey, $appId );
//获取到微信推送过来post数据(xml格式)
$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
$msg = '';
$errCode= $pc->decryptMsg($msg_sign, $timeStamp, $nonce, $postArr,$msg);

解密后,当$errCode返回值为0时,代表解密成功,下一步我们就需要对消息进行解析处理:

$postObj =simplexml_load_string($msg,'SimpleXMLElement',LIBXML_NOCDATA);

然后,根据不同的消息类型做出相应的回复,当消息类型为“event”且为用户关注事件时,微信公众号给用户自动回复一个文本消息:

if (strtolower($postObj -> MsgType) == 'event'){   
         //如果是关注subscribe事件
         if(strtolower($postObj->Event == 'subscribe')){
                   $public_name= strval($postObj->ToUserName);
                   $map['public_name']=$public_name;
                   $cont =M('Subscribe')->where($map)->find();
                  //回复用户消息
                   $content =$cont['content'];
                   responseText($postObj,$content);
         }
}

根据关键字回复图文消息:

if(strtolower($postObj -> MsgType) == 'text' &&trim($postObj->Content)=='图文'){
    //这一步可从数据库中查询得到
    $arr = array(
            array(
                    'title'=> 'test1',
                    'description'=> 'test1',
                    'picUrl'=>'http://mmbiz.qpic.cn/mmbiz/mLiaE7fSUysSbbqzicX2LVsLL1HsXMRV0m6uicfiaSX9Aic43BA5vnpFOBMWAoEuaVDicoOX4HzGT8OT5QK6DRs14VkQ/0',
                    'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPAYtneMxKyhWy52ytbUZfOJzFEHMDqmYTQLQWrkrSRky&appmsgid=10000002&itemidx=1&sign=99baf31f45e2357af575c63b5b303b6a#wechat_redirect',
            ),
            array(
                    'title'=> 'test2',
                    'description'=> 'test2',
                    'picUrl'=> 'http://mmbiz.qpic.cn/mmbiz_jpg/mLiaE7fSUysTFDEZQTOvXleYwYqFN1JeLwM66Zg7dHjK3aHQxdVtwGTJgzuKJRuZCBHljIvVLkvZ2CADJ6paJYQ/0?wx_fmt=jpeg',
                    'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPDXw5wcPw4rpHzkwOv4U7kDY1V%2BUUirAB0C9oEEsX5HQB8Uv1Ut2zj3buNkRPh6KNYWVyTaxebMkb8IcD9FjNbpcqY0mdRbCxRnbIjtmNBd37cKXm3Egbo1KWdkSEy5NZg%3D%3D&chksm=315123030626aa15c3e454afbd931ec3458149b13370999b16bc72b876326977e7d68b406a8c#rd',
            )
    );
    responseNews($postObj,$arr);
    }

其他关键字回复:

$public_name= strval($postObj->ToUserName);
$keyword = strval(trim($postObj-> Content));
$log['public_name']=$public_name;
$log['keyword'] =array('like','%'.$keyword.'%');
$con =M('Keyword')->where($log)->select();
foreach ($con as $vo=> $k){
        $conn=$con[$vo]['content'];
}
if($conn){
        $content =$conn;
}else{
         $lg['public_name']=$public_name;
         $lg['keyword']='';
         $con =M('Keyword')->where($lg)->select();
          foreach($con as $vo => $k){
                   $conn=$con[$vo]['content'];
          }
           $content =$conn;
}
      responseText($postObj,$content);

以上用到的responseText()、responseNews()鉴于代码模块化,而且方便复用,所以单独用方法写出,其他不多说了,具体见代码:

1)回复文本消息
function responseText($postObj,$content){
    $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';
    $res =sprintf($template,$toUser,$fromUser,$time,$msgType,$content);
    $encodingAesKey = '公众号消息加解密Key';
    $token ='公众号消息校验Token';
    $appId = '三方平台appid';
    $pc = new \WXBizMsgCrypt ($token, $encodingAesKey, $appId );
    $encryptMsg = '';
    $errCode =$pc->encryptMsg($res,$_GET ['timestamp'], $_GET ['nonce'], $encryptMsg);
    if($errCode ==0){
            $res = $encryptMsg;
    }
    echo $res;
        }
2)回复图文消息
function responseNews($postObj,$arr){
    $toUser     = $postObj -> FromUserName;
    $fromUser   = $postObj -> ToUserName;
    $template  ="<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[%s]]></MsgType>
            <ArticleCount>".count($arr)."</ArticleCount>
            <Articles>";
    foreach($arr as $k=>$v){
            $template.="<item>
            <Title><![CDATA[".$v['title']."]]></Title>
            <Description><![CDATA[".$v['description']."]]></Description>
            <PicUrl><![CDATA[".$v['picUrl']."]]></PicUrl>
            <Url><![CDATA[".$v['url']."]]></Url>
            </item>";
    }
    $template.="</Articles>
            </xml>";
    $time     = time();
    $msgType  = 'news';
    $res =sprintf($template,$toUser,$fromUser,$time,$msgType);
    $encodingAesKey = '公众号消息加解密Key';
    $token ='公众号消息校验Token';
    $appId = '三方平台appid';
    $pc = new \WXBizMsgCrypt ($token, $encodingAesKey, $appId );
    $encryptMsg = '';
    $errCode =$pc->encryptMsg($res,$_GET ['timestamp'], $_GET ['nonce'], $encryptMsg);
    if($errCode ==0){
            $res = $encryptMsg;
    }
    echo $res;
        }
需要注意的是,在代微信公众号实现其功能的时候,接收的消息都需要解密,对回复的内容也必须进行加密再进行回复。
接收消息事件完整代码:
public function reponseMsg(){
require_once(dirname(__FILE__).'/wxBizMsgCrypt.php');
//encodingAesKey和token均为申请三方平台是所填写的内容
$encodingAesKey = '公众号消息加解密Key';
$token = '公众号消息校验Token';
$appId = '三方平台appid';
$timeStamp = empty ($_GET ['timestamp'] ) ? "" : trim ( $_GET ['timestamp'] );
$nonce = empty ( $_GET['nonce'] ) ? "" : trim ( $_GET ['nonce'] );
$msg_sign = empty ($_GET ['msg_signature'] ) ? "" : trim ( $_GET ['msg_signature'] );
$pc = new\WXBizMsgCrypt ( $token, $encodingAesKey, $appId );
//获取到微信推送过来post数据(xml格式)
$postArr =$GLOBALS['HTTP_RAW_POST_DATA'];
$msg = '';
$errCode =$pc->decryptMsg($msg_sign, $timeStamp, $nonce, $postArr,$msg);
if($errCode == 0){
        //处理消息类型,并设置回复类型和内容
        $postObj =simplexml_load_string($msg,'SimpleXMLElement',LIBXML_NOCDATA);
        //判断该数据包是否是订阅(用户关注)的事件推送
        if(strtolower($postObj -> MsgType) == 'event'){   
                //如果是关注subscribe事件
                if(strtolower($postObj->Event == 'subscribe')){
                        $public_name= strval($postObj->ToUserName);
                        $map['public_name']=$public_name;
                         $cont= M('Subscribe')->where($map)->find();
                         //回复用户消息
                         $content= $cont['content'];
                         responseText($postObj,$content);
               }
         }
        //用户发送某一图文关键字的时候,回复图文消息
        if(strtolower($postObj-> MsgType) == 'text' && trim($postObj->Content)=='图文'){
                //这一步可从数据库中查询得到
                $arr= array(
                        array(
                                'title'=> 'test1',
                                'description'=> 'test1',
                                'picUrl'=>'http://mmbiz.qpic.cn/mmbiz/mLiaE7fSUysSbbqzicX2LVsLL1HsXMRV0m6uicfiaSX9Aic43BA5vnpFOBMWAoEuaVDicoOX4HzGT8OT5QK6DRs14VkQ/0',
                                'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPAYtneMxKyhWy52ytbUZfOJzFEHMDqmYTQLQWrkrSRky&appmsgid=10000002&itemidx=1&sign=99baf31f45e2357af575c63b5b303b6a#wechat_redirect',
                        ),
                        array(
                                'title'=> 'test2',
                                'description'=> 'test2',
                                'picUrl'=> 'http://mmbiz.qpic.cn/mmbiz_jpg/mLiaE7fSUysTFDEZQTOvXleYwYqFN1JeLwM66Zg7dHjK3aHQxdVtwGTJgzuKJRuZCBHljIvVLkvZ2CADJ6paJYQ/0?wx_fmt=jpeg',
                                'url'=>'https://mp.weixin.qq.com/s?__biz=MjM5NzY4MDc0MA==&tempkey=mKI6U0rlJZofvceyQdxTPDXw5wcPw4rpHzkwOv4U7kDY1V%2BUUirAB0C9oEEsX5HQB8Uv1Ut2zj3buNkRPh6KNYWVyTaxebMkb8IcD9FjNbpcqY0mdRbCxRnbIjtmNBd37cKXm3Egbo1KWdkSEy5NZg%3D%3D&chksm=315123030626aa15c3e454afbd931ec3458149b13370999b16bc72b876326977e7d68b406a8c#rd',
                        )
                );
                responseNews($postObj,$arr);
                }else{
                        //当微信用户发送关键字,公众号回复对应内容
                        $public_name=strval($postObj->ToUserName);
                        $keyword= strval(trim($postObj -> Content));
                        $log['public_name']=$public_name;
                        $log['keyword']= array('like','%'.$keyword.'%');
                        $con= M('Keyword')->where($log)->select();
                        foreach($con as $vo => $k){
                                $conn=$con[$vo]['content'];
                        }
                        if($conn){
                                $content= $conn;
                        }else{
                                $lg['public_name']=$public_name;
                                $lg['keyword']='';
                                $con= M('Keyword')->where($lg)->select();
                                foreach($con as $vo => $k){
                                $conn=$con[$vo]['content'];
                        }
                        $content= $conn;
                }
                responseText($postObj,$content);
        }
}
            }
接收消息事件并响应
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 经过之前系列内容过后,接下来的代微信公众号实现业务部分跟微信公众号开发业务逻辑一样,所以公众号其他业务功能部分后面...
    袁小威阅读 6,744评论 23 6
  • 1、开启公众号开发者模式 公众平台的技术文档目的为了简明扼要的交代接口的使用,语句难免苦涩难懂,甚至对于不同的读者...
    good7758阅读 1,497评论 0 1
  • 一、公众号介绍 微信公众号分类 订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证前后都是每天只可以群发一条消息...
    小花的胖次阅读 6,377评论 3 37
  • 往事不再回首 早已逝成如故 那春不再长情 那冬却已寒心 何所故兮夕 何为夜长吟
    xxlj阅读 174评论 0 1
  • 一、顺序结构 代码在执行过程中如果没有控制语句,代码就会一句一句的执行下去,直到结束。 二、选择结...
    坚持也是一种成功阅读 660评论 1 5