精华内容
下载资源
问答
  • 微信开发自动回复

    2018-04-18 17:04:04
    众所周知,微信有一个特别重要的一个功能就是自动回复,就是用户访问订阅号并发送消息,订阅号会根据用户输入字符回复用户,我写了自动回复文字,图片和图文。每一个自动回复都是一个网页,分别是<extend ...

    众所周知,微信有一个特别重要的一个功能就是自动回复,就是用户访问订阅号并发送消息,订阅号会根据用户输入字符回复用户,我写了自动回复文字,图片和图文。

    每一个自动回复都是一个网页,分别是

    <extend name="Common:base" />
    <block name="body">
    <h2>回复文本</h2>
    <form class="layui-form" action="" style="padding-right: 10px;" method="post">
        <div class="layui-form-item">
            <label class="layui-form-label">回复关键词</label>
            <div class="layui-input-block">
                <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
            </div>
        </div>
       
        <div class="layui-form-item">
            <label class="layui-form-label">回复内容</label>
            <div class="layui-input-block">
                <textarea name="content" required  lay-verify="required" placeholder="请输入内容" class="layui-textarea"></textarea>
            </div>
        </div>
        
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
                <a href="{:U('keywords',['type'=>'text'])}" class="layui-btn layui-btn-primary">返回</a>
            </div>
        </div>
    </form>
    
    <script>
      
    layui.use('form', function(){
        var form = layui.form
        form.on('submit(SBT)', function(data){
            var load = layer.load();
            $.post("{:U('replytext')}",data.field,function (res) {
               
                layer.close(load);
                layer.msg(res.msg,{time:1000},function () {
                    // window.location.href=res.url;
                });
              
            })
            return false;
        });
    
    });
    
    </script>
    </block>
    <extend name="Common:base" />
    <block name="css">
     <style type="text/css">
        .meterial{
            position: relative;
            width: 120px;
            height: 120px;
            padding: 10px;
            float: left;
        }
        .meterial img{
            width: 100%;
            height: 100%;
        }
        .select{
    
            text-align: center;
            vertical-align: middle;
             opacity: 0.5;  
            color: #0f0;  
            background: rgba(0,0,0,0.8);
        
        }
      </style>
    </block>
    
    <block name="body">
    <h2>回复图片</h2>
    <form class="layui-form" action="" style="padding-right: 10px;" method="post">
        <div class="layui-form-item">
            <label class="layui-form-label">关键词</label>
            <div class="layui-input-block">
                <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
            </div>
        </div>
       <div class="layui-form-item">
            <label class="layui-form-label">回复图片</label>
            <div class="layui-input-block">
                <input type="hidden" id="media_id" name="media_id">
                <input type="hidden" id="url" name="url">
                <img src="" id="img_logo" width="100" height="100" />
                <button type="button" class="layui-btn" id="btn_upload">
                  <i class="layui-icon"></i>选择本地图片
                </button>
               <!--  <button type="button" class="layui-btn" id="btn_select">
                  <i class="layui-icon"></i>选择素材库中图片
                </button> -->
            </div>
       </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
                <a href="{:U('keywords',['type'=>'image'])}" class="layui-btn layui-btn-primary">返回</a>
            </div>
        </div>
    </form>
    
    <script>
       
    layui.use('form', function(){
        var form = layui.form
        form.on('submit(SBT)', function(data){
            var load = layer.load();
            $.post("{:U('replyimage')}",data.field,function (res) {
                // if(res.status=='0'){
                    layer.close(load);
                    layer.msg(res.msg);
                // }
                // if(res.status=='1'){
                //     layer.close(load);
                //     layer.msg(res.msg,{time:1000},function () {
                //         window.location.href=res.url;
                //     });
                // }
            })
            return false;
        });
    
    });
    
    //图片上传
    layui.use('upload', function(){
      var upload = layui.upload;
       
      //执行实例
      var uploadInst = upload.render({
        elem: '#btn_upload', //绑定元素
        accept: 'images', //允许上传的文件类型
        url: "{:U('upload')}", //上传接口
        done: function(res){
          //上传完毕回调
          if(res.code=='0'){
            var url ="__ROOT__" + res.url;
            console.log(url);
            $("#img_logo").attr("src",url);
            $("#url").val(res.url);
          }else{
             layer.msg(res.msg);
          }
    
        },
        error: function(){
          //请求异常回调
        }
      });
    });
    
    
    $("#btn_select").click(function(){
        layui.use('layer', function(){
          var layer = layui.layer;
          
          layer.open({
              type: 2,
              title: '永久素材',
              shadeClose: true,
              shade: 0.5,
              area: ['680px', '300px'],
              content: '{:U('common/selectImage')}',
              btn:['确定','取消'],
              yes: function(index, layero){
                var body = layer.getChildFrame('body', index);
                // console.log(body.html());
                var img = body.find('.select').siblings('img');
                $("#img_logo").attr('src',img.attr('src'));
                $("#media_id").val(img.attr('media-id'));
                $("#url").val(img.attr('url'));
                layer.close(index); 
              }
    
            });
        }); 
    })
    </script>
    </block><extend name="Common:base" />
    <block name="css">
     <style type="text/css">
        .meterial{
            position: relative;
            width: 120px;
            height: 120px;
            padding: 10px;
            float: left;
        }
        .meterial img{
            width: 100%;
            height: 100%;
        }
        .select{
    
            text-align: center;
            vertical-align: middle;
             opacity: 0.5;  
            color: #0f0;  
            background: rgba(0,0,0,0.8);
        
        }
      </style>
    </block>
    
    <block name="body">
    <h2>回复图片</h2>
    <form class="layui-form" action="" style="padding-right: 10px;" method="post">
        <div class="layui-form-item">
            <label class="layui-form-label">关键词</label>
            <div class="layui-input-block">
                <input type="text" name="keyword" required  lay-verify="required"   placeholder="请输入关键词" autocomplete="off" class="layui-input">
            </div>
        </div>
       <div class="layui-form-item">
            <label class="layui-form-label">回复图片</label>
            <div class="layui-input-block">
                <input type="hidden" id="media_id" name="media_id">
                <input type="hidden" id="url" name="url">
                <img src="" id="img_logo" width="100" height="100" />
                <button type="button" class="layui-btn" id="btn_upload">
                  <i class="layui-icon"></i>选择本地图片
                </button>
               <!--  <button type="button" class="layui-btn" id="btn_select">
                  <i class="layui-icon"></i>选择素材库中图片
                </button> -->
            </div>
       </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
                <a href="{:U('keywords',['type'=>'image'])}" class="layui-btn layui-btn-primary">返回</a>
            </div>
        </div>
    </form>
    
    <script>
       
    layui.use('form', function(){
        var form = layui.form
        form.on('submit(SBT)', function(data){
            var load = layer.load();
            $.post("{:U('replyimage')}",data.field,function (res) {
                // if(res.status=='0'){
                    layer.close(load);
                    layer.msg(res.msg);
                // }
                // if(res.status=='1'){
                //     layer.close(load);
                //     layer.msg(res.msg,{time:1000},function () {
                //         window.location.href=res.url;
                //     });
                // }
            })
            return false;
        });
    
    });
    
    //图片上传
    layui.use('upload', function(){
      var upload = layui.upload;
       
      //执行实例
      var uploadInst = upload.render({
        elem: '#btn_upload', //绑定元素
        accept: 'images', //允许上传的文件类型
        url: "{:U('upload')}", //上传接口
        done: function(res){
          //上传完毕回调
          if(res.code=='0'){
            var url ="__ROOT__" + res.url;
            console.log(url);
            $("#img_logo").attr("src",url);
            $("#url").val(res.url);
          }else{
             layer.msg(res.msg);
          }
    
        },
        error: function(){
          //请求异常回调
        }
      });
    });
    
    
    $("#btn_select").click(function(){
        layui.use('layer', function(){
          var layer = layui.layer;
          
          layer.open({
              type: 2,
              title: '永久素材',
              shadeClose: true,
              shade: 0.5,
              area: ['680px', '300px'],
              content: '{:U('common/selectImage')}',
              btn:['确定','取消'],
              yes: function(index, layero){
                var body = layer.getChildFrame('body', index);
                // console.log(body.html());
                var img = body.find('.select').siblings('img');
                $("#img_logo").attr('src',img.attr('src'));
                $("#media_id").val(img.attr('media-id'));
                $("#url").val(img.attr('url'));
                layer.close(index); 
              }
    
            });
        }); 
    })
    </script>
    </block>

    <extend name="Common:base" />
    <block name="body">
    <h2>回复图文</h2>
    <form class="layui-form" action="" style="padding-right: 10px;" method="post">
        <div class="layui-form-item">
            <label class="layui-form-label">回复关键词</label>
            <div class="layui-input-block">
                <input type="text" name="keyword"    placeholder="请输入关键词" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">标题</label>
            <div class="layui-input-block">
                <input type="text" name="title" placeholder="请输入标题" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">封面图</label>
            <div class="layui-input-block">
                <input type="hidden" id="media_id" name="media_id">
                <input type="hidden" id="url" name="url">
                <img src="" id="img_logo" width="100" height="100" />
               <button type="button" class="layui-btn" id="btn_upload">
                  <i class="layui-icon"></i>选择本地图片
                </button>
               <!--  <button type="button" class="layui-btn" id="btn_select">
                  <i class="layui-icon"></i>选择素材库中图片
                </button> -->
            </div>
        </div>
        <div class="layui-form-item layui-form-text">
            <label class="layui-form-label">内容</label>
            <div class="layui-input-block">
                <textarea name="content" placeholder="请输入图文内容" class="layui-textarea"></textarea>
            </div>
        </div>
    
        <div class="layui-form-item">
            <label class="layui-form-label">原文地址</label>
            <div class="layui-input-block">
                <input type="text" name="content_source_url"  placeholder="请输入原文地址如:http://xxxx.com/……" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn" lay-submit lay-filter="SBT">提交</button>
                <a href="{:U('keywords',['type'=>'news'])}" class="layui-btn layui-btn-primary">返回</a>
            </div>
        </div>
    </form>
    
    <script>
     
    layui.use('form', function(){
        var form = layui.form
        form.on('submit(SBT)', function(data){
            var load = layer.load();
            $.post("{:U('replynews')}",data.field,function (res) {
                // if(res.status=='0'){
                    layer.close(load);
                    layer.msg(res.msg);
                // }
                // if(res.status=='1'){
                //     layer.close(load);
                //     layer.msg(res.msg,{time:1000},function () {
                //         window.location.href=res.url;
                //     });
                // }
            })
            return false;
        });
    
    });
    
    //图片上传
    layui.use('upload', function(){
      var upload = layui.upload;
       
      //执行实例
      var uploadInst = upload.render({
        elem: '#btn_upload', //绑定元素
        accept: 'images', //允许上传的文件类型
        url: "{:U('upload')}", //上传接口
        done: function(res){
          //上传完毕回调
          if(res.code=='0'){
            var url ="__ROOT__" + res.url;
            console.log(url);
            $("#img_logo").attr("src",url);
            $("#url").val(res.url);
          }else{
             layer.msg(res.msg);
          }
    
        },
        error: function(){
          //请求异常回调
        }
      });
    });
    
    $("#btn_select").click(function(){
        layui.use('layer', function(){
          var layer = layui.layer;
          
          layer.open({
              type: 2,
              title: '永久素材',
              shadeClose: true,
              shade: 0.5,
              area: ['680px', '300px'],
              content: '{:U('common/selectImage')}',
              btn:['确定','取消'],
              yes: function(index, layero){
                var body = layer.getChildFrame('body', index);
                // console.log(body.html());
                var img = body.find('.select').siblings('img');
                $("#img_logo").attr('src',img.attr('src'));
                $("#media_id").val(img.attr('media-id'));
                $("#url").val(img.attr('url'));
                layer.close(index); 
              }
    
            });
        }); 
    })
    
    </script>
    </block>

    而且注意的是上面的3个网页对应的是3个数据表,注意的是回复图片,是用media_id来返回图片,而回复图文是要的返回的url

    <?php
    namespace Home\Controller;
    
    
    
    use Think\Controller;
    use LaneWeChat\Core\Curl;
    
    
    
    class AutoreplyController extends Controller {
    	private $mp;
    	public function _initialize(){
    		$mp=getCurrentMp();
    		if(empty($mp)){
    			$this->error('无使用公众号',U('index'));
    		}else{
    			$this->mp=$mp;
    		}
    	}
    	public function replytext(){
    		if(IS_GET){
    			$this->display();
    		}else{
    			$content=I('post.content');
    			$keyword=I('post.keyword');
    			$model=M('mp_reply_text');
    			$data['content'] = $content;
    			$reply_id=$model->add($data);
    			if(isset($reply_id)){
    				$mp=$this->mp;
    				$data['mp_id']=$mp['id'];
    				$data['type']='text';
    				$data['keyword']=$keyword;
    				$data['reply_id']=$reply_id;
    				M('mp_rule')->add($data);
    				$this->ajaxReturn(array('msg'=>'添加成功'));
    			}else{
    				$this->ajaxReturn(array('msg'=>'添加失败'));
    			}
    
    
    		}
    
    	}
    	public function replyimage(){
    		if(IS_GET){
    			$this->display();
    		}else{
    		$url=I('post.url');//图片在本地服务器上的路径
    		//相对路径转换成绝对路径
    		$file=realpath('.'.$url);
    		// echo $file;
    		// exit;	
    		$access_token=getAccess_token();
    		include APP_PATH.'LaneWeChat/lanewechat.php';		
    			//永久素材
    		$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";		
    		$data['media']=Curl::addFile($file);		
    		$ret=Curl::callWebServer($url,$data,'post',true,false);
    		if(isset($ret['media_id'])){
    			$mp=getCurrentMp();
    			$data['url']=$ret['url'];
    			$data['media_id']=$ret['media_id'];
    			$reply_id=M('mp_reply_image')->add($data);
    			$keyword=I('post.keyword');
    			if(isset($reply_id)){				
    				$data['mp_id']=$mp['id'];
    				$data['type']='image';
    				$data['keyword']=$keyword;
    				$data['reply_id']=$reply_id;
    				if($mp['is_use']==1){
    					$data['status']=1;
    				}else{
    					$data['status']=0;
    				}
    				M('mp_rule')->add($data);
    				$this->ajaxReturn(array('msg'=>'添加成功'));
    			}else{
    				$this->ajaxReturn(array('msg'=>'添加失败'));
    			}
    		}else{
    			$this->ajaxReturn(array('msg'=>'添加失败'));
    		}
    		// $this->ajaxReturn($ret);
    		}
    	}
    	public function replynews(){
    		if(IS_GET){
    			$this->display();
    		}else{
    		$keyword=I('post.keyword');
    		$title=I('post.title');
    		$description=I('post.content');
    		$link=I('post.content_source_url');
    		$url=I('post.url');//图片在本地服务器上的路径
    		//相对路径转换成绝对路径
    		$file=realpath('.'.$url);
    		// echo $file;
    		// exit;	
    		$access_token=getAccess_token();
    		include APP_PATH.'LaneWeChat/lanewechat.php';		
    			//永久素材
    		$url="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";		
    		$data['media']=Curl::addFile($file);		
    		$ret=Curl::callWebServer($url,$data,'post',true,false);
    		if(isset($ret['media_id'])){
    			$mp=getCurrentMp();
    			$data['title']=$title;
    			$data['description']=$description;
    			$data['picurl']=$ret['url'];
    			$data['url']=$link;
    			$reply_id=M('mp_reply_news')->add($data);
    			if(isset($reply_id)){				
    				$data['mp_id']=$mp['id'];
    				$data['type']='news';
    				$data['keyword']=$keyword;
    				$data['reply_id']=$reply_id;
    				if($mp['is_use']==1){
    					$data['status']=1;
    				}else{
    					$data['status']=0;
    				}
    				M('mp_rule')->add($data);
    				$this->ajaxReturn(array('msg'=>'添加成功'));
    			}else{
    				$this->ajaxReturn(array('msg'=>'添加失败'));
    			}
    		}else{
    			$this->ajaxReturn(array('msg'=>'添加失败'));
    		}
    		
    		}
    		
    	}
    	 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->error($upload->getError());
    
    
    
    			$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));
    
    
    
    		}
    
    
    
    	}
    }


    展开全文
  • 基于微信公众平台的,自动回复。里面有详细代码。
  • 微信开发自动回复消息乱码问题

    千次阅读 2018-01-05 18:31:44
    最近开发微信服务号,遇到了一个问题,在编写自动回复消息的时候出现乱码,最后发现问题是由于spring mvc的@ResponseBody注解返回字符串时默认返回的是“ISO-8859-1”而不是utf-8。  虽然大家的项目里面可能都有...

      最近开发微信服务号,遇到了一个问题,在编写自动回复消息的时候出现乱码,最后发现问题是由于spring mvc的@ResponseBody注解返回字符串时默认返回的是“ISO-8859-1”而不是utf-8。

      虽然大家的项目里面可能都有字符编码过滤器,但是有一个问题在这里,我们设置response.setContentType("text/html; charset=utf-8");时都是在chain.doFilter(request, response);之前设置的,也就是过滤器前处理是设置的响应编码格式,之所以不在后处理时设置是因为后处理时响应内容已经生成此时设置是无效的,必须在响应内容生成之前设置响应编码格式。

      那么问题就出在这个地方,我们虽然设置了响应编码格式,,,可是spring mvc在有@ResponseBody注解的响应是,篡改了我们的响应编码!!!!!!!!!为什么会这样。。。。。我们来剖析一下原因。
      相信大家对spring的Message Converters不会陌生,HttpMessageConverters<T>这个接口是用来把请求信息转化为对象T,把T输出为响应信息的一个接口,在该接口众多的实现类中有一个实现类StringHttpMessageConverter,这个类的作用就是把请求信息转换未字符串,而@ResponseBody注解就是默认调用的这个类,,,而这个类中默认的编码格式就是ISO-8859-1,,所以罪魁祸首找到了,怎么改呢?

    我直接添加了

    @RequestMapping(value = "/weixin/validation" , method = RequestMethod.POST , produces = "text/html;charset=UTF-8")
    这样一个注释在控制器上,
     /**
      * 注意:
    	 * "application/json" json格式数据
    	 * "application/xml" xml类型数据
    	 * "application/x-www-form-urlencoded" 基本类型  jquery默认就是采用的这种
    	 * "multipart/form-data" 文件上传
    	 * "text/xml"  和application/xml采用的默认编码格式不一样
    	 * "text/html"  一般的html
    	 */
    主要就是
    produces = "text/html;charset=UTF-8"
    这个配置当然还有很多别的方式,网上也有很多,我没有都尝试,这里把一些链接留下:

    Spring MVC @ResponseBody响应中文乱码

    Spring MVC @ResponseBody注解返回响应流时中文乱码问题的解决




    展开全文
  • 编写自动回复,针对用户不同消息类型做出回复,程序怎么调都有问题额。 问题:无论我发送什么消息,文本也好,图片也好,语音也好,都只回复“我只接收图片消息”,也就是说程序似乎不执行 if(strtolower($...
  • 坑:服务器可以接受到发到公众号的信息,但是公众号不能回复,直接echo " ";exit();也会提示“该公众号提供的服务出现故障,请稍后再试”; 可能原因:用的php,是把数组转换成XML的时候出的问题 解决办法:把...

    坑:服务器可以接受到发到公众号的信息,但是公众号不能回复,直接echo " ";exit();也会提示“该公众号提供的服务出现故障,请稍后再试”;

    可能原因:用的php,是把数组转换成XML的时候出的问题

    解决办法:把php.ini文件里的always_populate_raw_post_data参数启用并设置为-1就好了

     

    转载于:https://www.cnblogs.com/zhangyouwu/p/10972732.html

    展开全文
  • 是小编给大家介绍的微信消息自动回复下所遇到的坑的相关内容,在日常项目开发中经常遇到,非常具有参考借鉴价值,感兴趣的小伙伴一起学习吧
  • 微信公众号自动回复功能开发 本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧! 1.注册公众号 如果你从来...

    ef13a7c55b726a98af14e047daba2fa1.png

    微信公众号自动回复功能开发

    本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧!

    1.注册公众号

    如果你从来没创建过请先注册 微信公众平台

    请选择订阅号,然后填写一些基本信息即可 ,具体注册流程这里就展开说了。

    注意 邮箱作为登录帐号,请填写未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 建议直接注册一个新邮箱使用

    b90440a1bf85bea54b0d77f0887f23cc.png

    2.微信托管自动回复功能

    微信提供了自动回复功能,也就是直接在微信上配置

    分别提供了3种配置 1.关键词回复 2.收到消息回复 3.被关注回复

    使用方法很简单 只需要在对应的回复类型上面配置即可 这里不做详细说明

    d9e90d098a333df589c0a643e96d81ec.png

    3.自己开发服务托管自动回复功能

    本篇重点讲解自己去托管自动回复功能,微信只做转发

    3.1 关闭微信的自动回复功能

    要想自己托管自动回复功能首先要讲微信的自动回复功能关闭 关闭方式如下

    eb5d54d82791430ac06beb5de17402c6.png

    3.2 开发者中心配置托管的服务器信息

    在开始服务器端开发之前,我先介绍一个natapp 内网穿透工具,有了它你可以直接将其本地映射一个地址配置到该URL地址上面,那么方便你调试 具体关于natapp的使用 请看我另一篇博客 natapp 内网穿透工具

    主要配置URL地址 和Token信息 EncodingAESKey 可以随机生成

    473c29c56a1fc85f289aede5021addbb.png

    3.3 服务端开发(验证消息来来自微信服务器)

    开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

        参数    描述
        signature    微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
        timestamp    时间戳
        nonce        随机数
        echostr        随机字符串
       

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

          1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    你也可以简单粗暴的直接返回echostr 我暂时就是这样做的

        /**
         * 微信成为开发者 接口
         * @param signature : 签名
         * @param timestamp : 时间戳
         * @param nonce     : 随机数
         * @param echostr   : 随机字符串
         * @return
         */
        @GetMapping("/authorize")
        public String authorize(@RequestParam("signature") String signature,
                            @RequestParam("timestamp") Long timestamp,
                            @RequestParam("nonce") String nonce,
                            @RequestParam("echostr") String echostr) {
            log.info("【signature:{}】", signature);
            log.info("【timestamp:{}】", timestamp);
            log.info("【nonce:{}】", nonce);
            log.info("【echostr:{}】", echostr);
            return echostr;
        }

    在上图中点击提交微信会发送请求到该接口 只要该接口正确返回了echostr,微信公众号管理平台就会如下显示 提交成功

    11f199d249fac02c34103970b89bd7a1.png

    微信验证 开发者成功后点击 启用 服务器配置信息

    f6ca7567a5b7b7e7c80b80a1b0992ec8.png

    3.4 服务器端开发 (接收消息)

    附上微信关于消息的开发文档 微信公众平台开发文档

    当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,也就是你刚刚配置的验证接口的URL地址,只不过是POST方式提交,所以你需要写一个POST接口

    文本消息:

        <xml>
             <ToUserName><![CDATA[toUser]]></ToUserName>
            <FromUserName><![CDATA[fromUser]]></FromUserName>
            <CreateTime>1348831860</CreateTime>
            <MsgType><![CDATA[text]]></MsgType>
            <Content><![CDATA[this is a test]]></Content>
            <MsgId>1234567890123456</MsgId>
        </xml>
    
         参数            描述
         ToUserName    开发者微信号
         FromUserName    发送方帐号(一个OpenID)
         CreateTime    消息创建时间 (整型)
         MsgType    消息类型,文本为text
         Content    文本消息内容
         MsgId
        

    接受到的消息格式:

    5421840fcf60d85dcb61d131067a9f84.png

    封装接收微信消息的实体

    这里我使用了 XStream 来解析XML 它非常好用,不了解的自行百度 后期可能会写一篇关于XStream的用法

        @Data
        @XStreamAlias("xml")
        public class WxXmlData implements Serializable {
    
        @XStreamAlias("ToUserName")
        private String toUserName;
        @XStreamAlias("FromUserName")
        private String fromUserName;
        @XStreamAlias("CreateTime")
        private Long createTime;
        @XStreamAlias("MsgType")
        private String msgType;
        @XStreamAlias("Content")
        private String content;
        @XStreamAlias("MsgId")
        private String msgId;
        //
        @XStreamAlias("Title")
        private String title;
        @XStreamAlias("Description")
        private String description;
        @XStreamAlias("Url")
        private String url;
        /**
         * 订阅或者取消订阅的事件
         */
        @XStreamAlias("Event")
        private String event;
        @XStreamAlias("EventKey")
        private String eventkey;
        }
        

    从InputStream流中读取到xml字符串(inputstream从 post接口的 request.getInputStream()获取),然后通过XStream解析到封装的实体对象WxXmlData中

        @Override
        public WxXmlData resolveXmlData(InputStream in) throws IOException {
        String xmlData = FileUtils.getInputToString(in);
        log.info("【receive  xmlData str : {}】", xmlData);
        WxXmlData wxXmlData = null;
        try {
            XStream xstream = new XStream();
            //这个必须要加 不然无法转换成WxXmlData对象
            xstream.setClassLoader(WxXmlData.class.getClassLoader());
            xstream.processAnnotations(WxXmlData.class);
            xstream.alias("xml", WxXmlData.class);
            wxXmlData = (WxXmlData) xstream.fromXML(xmlData);
            log.info("【wxXmlData: {}】 ", wxXmlData);
        } catch (Exception e) {
            log.error("【error】{}", e.getMessage());
        }
        return wxXmlData;
        }

    编写自动回复接口,这里有判断 event,如果是订阅可以做相应的回复,如果是 普通消息可以做相应的回复等等。。具体怎么实现回复逻辑看你自己的需求

    注意:你的回复的人是 发送给你消息的人

           @Override
        public String autoResponse(WxXmlData wxData) {
        WxXmlData resultXmlData = new WxXmlData();
        resultXmlData.setToUserName(wxData.getFromUserName());  //收到的消息是谁发来的再发给谁
        resultXmlData.setFromUserName(wxData.getToUserName());  //
        if (!StringUtils.isEmpty(wxData.getEvent())) {
            if (WxSubscribeEnum.SUBSCRIBE.getValue().equals(wxData.getEvent())) {
                resultXmlData.setMsgType("text");
                resultXmlData.setCreateTime(System.currentTimeMillis());
                resultXmlData.setContent("欢迎来到Johnny屋,本公众号会定期更新技术干货,愿与 读者共同成长。nn" +
                        "-<a href="https://www.askajohnny.com">我的博客(建议PC端打开,移动端适配正在紧张开发中)</a>");
            }
        } else if(wxData.getContent().equalsIgnoreCase("vip")){
            resultXmlData.setMsgType("text");
            resultXmlData.setCreateTime(System.currentTimeMillis());
            resultXmlData.setContent("<a href="https://my.openwrite.cn/code/generate?blogId=18931-1576559666626-322">点击该链接,获取博客解锁验证码</a>");
        } else {
            resultXmlData.setMsgType("text");
            resultXmlData.setCreateTime(System.currentTimeMillis());
            resultXmlData.setContent("公众号正在开发中。后期请多多关注!");
        }
        XStream xstream = new XStream();
        xstream.processAnnotations(WxXmlData.class);
        xstream.setClassLoader(WxXmlData.class.getClassLoader()); 
        return xstream.toXML(resultXmlData);  //XStream的方法,直接将对象转换成 xml数据

    效果如下:

    8896469943b04ed069ce792156f319ee.png

    4.总结

    本篇主要讲解微信公众号自动回复功能的开发,实现自己托管消息回复,能够更加灵活的根据不同的消息进行回复,主要就是对XML的报文解析并且发送对应的报文即可,后期可能会有其他关于微信公众号开发的文章包括 自定义菜单 等等 多多关注

    个人博客系统 https://www.askajohnny.com 欢迎访问!
    本文由博客一文多发平台 OpenWrite 发布!
    展开全文
  • 微信开发自动回复文字: $data['content']=I('content'); $replyid=M('mp_reply_text')-&gt;add($data);//添加到数据库 $mp=getCurrentMp(); $arr['mp_id']=$mp['id']; $arr['type']='text'; $arr['...
  • 关于微信接入第三方域名进行业务开发的相关说明已在另外一篇做了说明,这里不做赘述,接入步骤请移步 https://blog.csdn.net/qq_27987023/article/details/82861521 本篇示范微信交互过程中的几个基础事件,主要...
  • 主要介绍了nodejs微信开发自动回复的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 微信开发中,首先遇到的问题就是处理如何接收和响应用户消息 , 本文将向大家介绍一下方法和关键的代码。 本文使用的是 :https://github.com/chendong152/Weixin_api_.net 非常感谢 TD的作者 ASP.NET开发的 ...
  • 一、 微信公众号开发以及消息自动回复 1、第一步先注册微信公众平台进入。 2、接下来点击首页开发中基本配置。 3、点击开启第三方接口功能,点击启用后首页功能中的功能不能使用 4、然后我们可以进入开发中开发者...
  • laravel 微信开发-自动回复1.微信公众号的逻辑,用户关注了你的微信公众号后,假设用户发送了一条消息给你的公众号,实际上是先发送到腾讯的服务器上,腾讯把内容转成特定的xml格式,再转发到你指定的服务端(如:/...
  • 微信开发自动回复图文消息

    千次阅读 2017-08-05 16:05:43
    基于 laravel框架的微信公众号的自动回复功能。主要是图文消息和文本类型
  • 主要介绍了基于springboot微信公众号开发(微信自动回复),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 主要为大家详细介绍了PHP微信开发之简单实现文本自动回复的相关资料,感兴趣的小伙伴们可以参考一下
  • 微信公众号自动回复功能分为两种,一种自主开发,一种利用公众号自动开发,两种不可兼容,开发状态的自动回复功能,将导致编辑状态下的菜单,自动回复失效。 WeixinchatController代码: 这边是的接口用来到公众号...
  • 随着微信逐渐开放的数据接口,开发者可以设置自定义的服务器地址,微信的服务端会把用户发送给公众号的消息转发到开发者自定义的服务器上,并且开发者可以调用接口进行回复,这就成就了基于微信进行二次开发的可能性...
  • 小弟我是做android开发的,新版本H5 需求要微信公众号开发,后台人员不够,无奈 老大嫌弃 移动端事情太少,就分配给我了. 前期准备  1.外网 因为微信公众号开发在后台配置的url 只支持外网 并且是端口80或者443 ...
  • 微信Python自动回复代码

    千次阅读 2018-06-04 01:27:01
    首先 ,这个代码基于itchat这个库 ,如果需要安装 ,只需要pip3 install itchat 就能安装成功如何我们直接在这个库的基础上,在进行2...1.程序主要利用itchat库实现了微信聊天自动回复功能,添加了weather、package...
  • 微信开发自动回复

    2016-12-15 19:05:47
    /**  * wechat php test  */ header("content-type:text/html;charset=utf-8"); //define your token define("TOKEN", "weixin"); $wechatObj = new CallbackapiTest();...$wechatObj->responseMsg();...cla
  • 微信公众号自动回复

    2020-02-28 10:38:41
    微信公众平台=>开发=>基本配置 2) 接口信息配置 (1) 必须得有一个域名,可以使用SSH穿透 ssh -vnNt -R 7788:localhost:3333 root@39.106.4.9 ②nginx的配置 upstream tunnel { server 127.0.0.1:7788; } ...
  • 自动回复消息,就是把自动回复的信息,组成xml文件,每一个回复都会对应着一个xml文件,并不是所有回复都使用的一个xml。下面分别是回复文本、图片、图文消息。在回复图片和图文中都需要上传图片,分别需要点用接口...
  • '这是asp微信公众号自动回复开发案列之新闻查询机器人 '可以对任意输入都提示内容及发送使用说明 '比如发送图片,语音,定位信息,文字信息等都会回复信息。 '是各网页爱好者初学微信公众号接口开发的最佳案列 '是...
  • 一,先创建与微信端提交自动回复文本信息的html页面 如下:&lt;extend name="Common:base" /&gt; &lt;block name="body"&gt; &lt;h2&gt;回复文本&lt;/h2&gt; ...
  • 这篇文章主要为大家详细介绍了PHP微信开发之简单实现文本,图片以及图文自动回复的相关资料。首先,先去微信公众平台注册一个账号,注册好之后,登录进去。可以看到左侧的“开发者中心”,开启开发者中心前好像还要...
  • 这段时间一直想给家里搞个常用工具集,比如撸羊毛推荐,图片识别,图片OCR,在线桌游等。...除了等备案然后serve网站,想想反正大家都在用微信,不如搭一个类似于小黄鸡的server,能响应各种需求。直接开使做吧。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 897
精华内容 358
关键字:

微信开发自动回复