微信公众号三方平台开发【代微信公众号接收消息事件并响应】
今天要讲的是代微信公众号接收消息并进行回复,这里要用到的就是咱们之前在微信公众号三方平台开发【帐号注册、平台创建】里写到的“公众号消息与事件接收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);
}
}
}
微信公众号三方平台开发【代微信公众号接收消息事件并响应】相关推荐
- 微信公众号三方平台开发【全网发布及全网发布接入检测】
经过之前系列内容过后,接下来的代微信公众号实现业务部分跟微信公众号开发业务逻辑一样,所以公众号其他业务功能部分后面我会单独整理一套相关内容,今天,咱们就来说说微信第三方平台开发的最后一步-- 全网发布 ...
- 微信公众号三方平台开发【帐号注册、平台创建】
上一期咱们简单介绍了一下什么是公众号第三方平台,今天咱们讲具体如何操作来创建属于你自己的微信第三方平台. [注册] 首先当然是移步前往微信开放平台注册开发者帐号啦~注册传送门 进去后,会看到如下图页面 ...
- 微信公众号三方平台开发【获取授权方的授权信息以及基本信息】
今天开始之前,先对上期的内容做一个小的补充,第三方平台在开发(即待全网发布)模式下,用来测试的微信公众号必须为第二期里说到的"授权测试公众号列表"(即测试白名单)里填写的微信公众号 ...
- 微信公众号三方平台开发【pre_auth_code篇】
今天,给大家讲的是进入授权页需要的一个重要参数,预授权码. 预授权码(即pre_auth_code)是在微信公众号给第三方平台授权时,用来安全验证的,有效时间为20分钟(之前文档说的有效期为10分钟, ...
- 微信开放平台 公众号第三方平台开发 教程一 平台介绍
教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 ...
- 微信开放平台公众号第三方平台开发 教程一 平台介绍
微信现在火,火的如火如荼,给我们这些第三方的开发者带来了不少机会,相信现在有不少人在基于微信的公众平台在做二次开发,接下来会一系列的文章来介绍微信的另一种开发模式- 基于微信开发平台的公众号第 ...
- 微信公众号第三方平台开发PYTHON教程 PART 2
github地址:cppfun@wechat-open-third-party-dev 微信公众号第三方平台开发python教程 Part 1 这一节肯定是在第一节的基础上,如果你没有看过第一节,可能 ...
- 公众号第三方平台开发 - 教程五 代公众号发起网页授权源码
教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 ...
- 微信公众开放平台开发01---微信公众平台介绍,以及开发准备
微信公众开放平台开发01---微信公众平台介绍,以及开发准备 技术qq交流群:JavaDream:251572072 部分内容收集于网络: 1.先分享一份源码: 微信公众开放平台开发 -智能机器人ja ...
最新文章
- python dataframe 分位数_Python pandas.DataFrame.quantile函数方法的使用
- 关于学习Python的一点学习总结(19->if及相关的符号运算)
- Error creating bean with name 'messageSource' defi
- 史上最全,100+大数据开源处理工具汇总
- UVa 122 Trees on the level
- CSS实现的阴影效果
- 关于Angular Component changeDetection策略设置成OnPush的一个单元测试局限性
- Java面向对象——基础3 其他关键字
- php mysql 验证码代码_PHP_PHP 验证码的实现代码,checkcode.php 生成验证码图片, - phpStudy...
- 使用青云主机的GPU主机教程(不完整版)
- dataguard 下主备 online redo 与 standby redo log resize 重建
- ArcGIS水文分析实战教程(13)流域提取流程
- php screw.so扩展下载,CentOS下安装php加解密工具php
- JAVA等差素数列蓝桥杯_等差素数列(2017蓝桥杯,二题 )
- VMware ESXi-虚拟化平台的搭建
- 【工业互联网】工业互联网平台是什么、干什么用、谁来建、瓶颈有哪些、跨行业跨领域工业互联网平台怎么建?...
- html5简单拼图游戏,HTML5拼图游戏
- 2017-2018 中国人工智能产业路线图
- CAN总线与CANOPEN协议入门
- BitLocker上锁