当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
目录
// 上传回复文本信息到数据库
public function addtext(){
$keyword = I('post.keyword');
$text = I('post.content');
$replytext = array();
if (!empty($keyword) && !empty($text)){
$mp = getCurrentMp();
$mp_id = $mp['id'];
$data2['mp_id'] = $mp_id;
$data1['text'] = $text;
$data2['type'] = 'text';
$data2['keyword'] = $keyword;
M('mp_reply_text')->add($data1);
$map['text']=$text;
$rt = M('mp_reply_text')->where($map)->find();
$data2['reply_id'] = $rt['reply_id'];
M('mp_rule')->add($data2);
$this->ajaxReturn(array('msg'=>'上传成功!','url'=>'replytext'));
}else{
$this->ajaxReturn(array('msg'=>$ret));
}
}
// 关键字回复图片
public function addimage(){
$mp = $this->mp;
$url = I('post.url');
$file = realpath('.' . $url);
include APP_PATH . 'LaneWeChat/lanewechat.php';
// 获取access_token
$access_token = getAccess_token();
// 上传永久url
$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";
$data['media'] = '@' . $file;
$ret = Curl::callWebServer($url,$data,'post',true,false);
// print_r($arr);
// $this->ajaxReturn($ret);
// print_r($ret);
$reply_id = M('mp_reply_image')->add($ret);
$arr = array();
$arr['type'] = 'image';
$arr['keyword'] = I('post.keyword');
$arr['mp_id'] = $mp['id'];
$arr['reply_id'] = $reply_id;
$result = M('mp_rule')->add($arr);
if($result){
$this->ajaxReturn(array('msg'=>"上传成功"));
}else{
$this->ajaxReturn(array('msg'=>$result));
}
}
3 回复图文消息
// 回复图文信息
public function addNews(){
$mp = $this->mp;
$url = I('post.url');
$file = realpath('.' . $url);
include APP_PATH . 'LaneWeChat/lanewechat.php';
// 获取access_token
$access_token = getAccess_token();
// 上传永久
$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";
$data['media'] = '@' . $file;
$ret = Curl::callWebServer($url,$data,'post',true,false);
// print_r($ret);
// exit;
$arr['title'] = I('post.title');
$arr['description'] = I('post.content');
$arr['picurl'] = $ret['url'];
$arr['url'] = I('post.content_source_url');
// print_r($arr);
// exit;
$reply_id = M('mp_reply_news')->add($arr);
$arr1['mp_id'] = $mp['id'];
$arr1['reply_id'] = $reply_id;
$arr1['keyword'] = I('post.keyword');
$arr1['type'] = "news";
$result = M('mp_rule')->add($arr1);
if($result){
$this->ajaxReturn(array('msg'=>'提交成功!'));
}else{
$this->ajaxReturn(array('msg'=>$result));
}
}
// 上传图片
public function upload(){
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 设置附件上传类型
$upload->rootPath = './Uploads/'; // 设置附件上传根目录
$upload->savePath = ''; // 设置附件上传(子)目录
// 上传文件
$info = $upload->uploadOne($_FILES['file']);
if(!$info) {// 上传错误提示错误信息
$this->ajaxReturn(array('code'=>1,'msg'=>$upload->getError()));
}else{// 上传成功
// $this->success('上传成功!');
$file = '/Uploads/' . $info['savepath'] . $info['savename'];
$this->ajaxReturn(array('code'=>0,'msg'=>"上传成功",'url'=>$file));
}
}
以上是被动回复控制器的方法,除此之外还要判断下被动信息是文本、图片还是图文,做出判断之后再回复相应信息。
//判断
public static function text(&$request){
// $content = '收到文本消息';
// return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
// 获取发送请求的公众号
$mpid = $_GET['id'];
$content = $request['content'];
$where['mpid'] = $mpid;
$where['keyword'] = $content;
// 查询发送过来的关键字的
$data = M('mp_rule')->where($where)->find();
if($data){
$reply_id = $data['reply_id'];
$type = $data['type'];
if($type == "text"){
$reply = M('mp_reply_text')->find($reply_id);
$reply_text = $reply['content'];
return ResponsePassive::text($request['fromusername'], $request['tousername'], $reply_text);
}else if($type == "image"){
$reply = M('mp_reply_image')->find($reply_id);
if($reply){
$media_id = $reply['media_id'];
return ResponsePassive::image($request['fromusername'], $request['tousername'], $media_id);
}else{
$reply_text = "出错啦...";
return ResponsePassive::text($request['fromusername'], $request['tousername'], $reply_text);
}
}else if($type == "news"){
$reply = M('mp_reply_news')->find($reply_id);
if($reply){
$item[] = ResponsePassive::newsItem($reply['title'], $reply['description'], $reply['picurl'],$reply['url']);
return ResponsePassive::news($request['fromusername'], $request['tousername'], $item);
}else{
$reply_text = "出错啦...";
return ResponsePassive::text($request['fromusername'], $request['tousername'], $reply_text);
}
}
}else{
return "success";
}
}