微信开发消息自动回复

2016-09-28 12:23:28 qq_35584242 阅读数 571

一、 微信公众号开发以及消息自动回复

1、第一步先注册微信公众平台进入。

2、接下来点击首页开发中基本配置。

3、点击开启第三方接口功能,点击启用后首页功能中的功能不能使用

4、然后我们可以进入开发中开发者工具,开发者工具中有一个公众平台测试账号,点击进入,进行手机扫码登录

5、进入公众号测试管理,测试管理中有测试号的appIDappsecret信息,还有接口配置信息的修改,开发者文档中有接入指南,里面有个消息接口文档下载,将消息接口文档上传到线上服务器中,然后修改接口配置url写入消息接口文档的地址,还有Token要与接口文档中的token一致,这样才能与测试号连接。

6、我们可以通过线上服务器中的文档中的修改,来进行一些消息自动回复的修改。也可以通过配置进行一些回复语音、图片功能。

二、 自定义菜单

1、自定义菜单需要调用接口。

2、首先把接口连接中的appidappsecret替换成我们自己的,使用file_get_contents获取url,通过使用json_decode(),把返回的json格式内容转换成数组格式,获取页面内容调用接口首先需要获得access_token

3、创建新页面include()引用上一步的内容,获得access_token,根据access_token使用curl调用菜单接口,配置参数,来修改菜单参数。

三、 图片自动回复

1、首先通过使用post请求接口获取一个图片的信息。

2、使用开发者文档中的图片回复<xml></xml>,修改msgtype回复类型,改成image,还要修改sprintf函数中的最后一个参数,根据上一步获得图片的信息中的media_id修改成回复图片的media_id,这样就能够完成图片的自动回复啦。

四、 oauth授权

1、首先设置授权回调页面域名。

2、使用网页授权获取用户进本信息的连接,修改连接参数,获取用户同意授权,获取code

Urlencode()来解决连接中包括连接的问题。

3、通过code参数获取用户的access_tokenopenid

4、获取tokenopenid后,使用获取用户信息接口,修改参数,这样就能够获得用户的信息和头像信息

 

 

 

2018-04-18 17:29:56 ssh456 阅读数 1531

回复图片消息和文本消息都是需要用两个数据表将它管理起来


接下来将数据存入数据库,首先获取到前台提交的数据,然后将数据分别写入两个数据表中,并将上传的图片同时上传到公众号服务器上,这时又要用到微信上传素材的接口,具体代码如下:

//回复图片
	public function addImage(){
		$keyword=I('post.keyword');
		$media_id=I('post.media_id');
     	$url=I('post.url');
     	//相对路径->绝对路径
		$file=realpath('.'.$url);
		// echo $file;
		// exit;
     	
     	if (empty($keyword) || empty($url)) {
     		$this->ajaxReturn(array('msg'=>"必须填写关键字"));
     		exit;
     	}
     	if(empty($media_id)){
     		$accessToken=getAccess_token();
		    include APP_PATH . 'LaneWeChat/lanewechat.php';
		    //上传永久图片api
		    $api="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$accessToken&type=image";
		    $data['media']=Curl::addFile($file);
		    $ret=Curl::callWebServer($api,$data,'post',true,false);
		    // print_r($ret);
		    // exit;

     	}
     	if (isset($ret['media_id'])) {
     		$mp=$this->mp;
		    $data['media_id']=$ret['media_id'];
            $data['url']=$ret['url'];
            $model=M('mp_reply_image');
     	    $ret=$model->add($data);
     	    if(isset($ret)){
     	    	$arr['mpid']=$mp['id'];
		        $arr['reply_id']=$ret;
		        $arr['type']='image';
		     	$arr['keyword']=$keyword;
		        $rule=M('mp_rule');
		     	$ret=$rule->add($arr);
     	    }
     	    if ($ret) {
     	    	$this->ajaxReturn(array('status'=>0,'msg'=>"添加成功!"));
     	    } else {
     	    	$this->ajaxReturn(array('msg'=>$ret));
     	    }
     	    
		}else{
          $ret['fail']='本地上传失败';
          $this->ajaxReturn(array('status'=>1,'msg'=>$ret));
          exit;
        }
     	
	}

2019-06-27 14:17:24 RobotBing 阅读数 413

微信公众号后台有编辑模式和代码模式两种,设置成代码模式后,微信服务器会把公众号收到的所有消息以post方式发送到验证接入填写的url上,携带的请求参数为xml格式,由自己写的controller负责处理消息并按照微信要求的发送给微信服务器。Controller通过请求方式来分别处理验证接入和消息处理。

微信消息分为文本消息、语音消息、位置消息等多种格式,我做的是文本消息。文本消息的xml格式如下:

<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

消息id64位整型

各字段含义为:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

开发需要先定义接受消息和发送消息的实体类,然后将对对象进行操作即可

代码如下:(参考codingwolf的博客)

InMsgPojo.java

import javax.xml.bind.annotation.XmlAccessType;

  import javax.xml.bind.annotation.XmlAccessorType;

  import javax.xml.bind.annotation.XmlRootElement;

  

  @XmlRootElement(name="xml")

  @XmlAccessorType(XmlAccessType.FIELD)

  public class InMsgPojo {

    // 开发者微信号

    protected String FromUserName;

    // 发送方帐号(一个OpenID)

    protected String ToUserName;

    // 消息创建时间

    protected Long CreateTime;

    /**

     * 消息类型

     * text 文本消息

     * image 图片消息

     * voice 语音消息

     * video 视频消息

     * music 音乐消息

     */

    protected String MsgType;

    // 消息id

    protected Long MsgId;

    // 文本内容

    private String Content;

    // 图片链接(由系统生成)

    private String PicUrl;

    // 图片消息媒体id,可以调用多媒体文件下载接口拉取数据

    private String MediaId;

  

    public String getFromUserName() {

        return FromUserName;

    }

  

    public void setFromUserName(String fromUserName) {

        FromUserName = fromUserName;

    }

  

    public String getToUserName() {

        return ToUserName;

    }

  

    public void setToUserName(String toUserName) {

        ToUserName = toUserName;

    }

  

    public Long getCreateTime() {

        return CreateTime;

    }

  

    public void setCreateTime(Long createTime) {

        CreateTime = createTime;

    }

  

    public String getMsgType() {

        return MsgType;

    }

  

    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

  

    public Long getMsgId() {

        return MsgId;

    }

  

    public void setMsgId(Long msgId) {

        MsgId = msgId;

    }

  

    public String getContent() {

        return Content;

    }

  

    public void setContent(String content) {

        Content = content;

    }

  

    public String getPicUrl() {

        return PicUrl;

    }

  

    public void setPicUrl(String picUrl) {

        PicUrl = picUrl;

    }

  

    public String getMediaId() {

        return MediaId;

    }

  

    public void setMediaId(String mediaId) {

        MediaId = mediaId;

    }

  

    @Override

    public String toString() {

        return "InMsgPojo{" +

                "FromUserName='" + FromUserName + '\'' +

                ", ToUserName='" + ToUserName + '\'' +

                ", CreateTime=" + CreateTime +

                ", MsgType='" + MsgType + '\'' +

                ", MsgId=" + MsgId +

                ", Content='" + Content + '\'' +

                ", PicUrl='" + PicUrl + '\'' +

                ", MediaId='" + MediaId + '\'' +

                '}';

    }

}

 

OutMsgPojo.java

import javax.xml.bind.annotation.XmlAccessType;

  import javax.xml.bind.annotation.XmlAccessorType;

  import javax.xml.bind.annotation.XmlRootElement;

  

  @XmlRootElement(name="xml")

  @XmlAccessorType(XmlAccessType.FIELD)

  public class OutMsgPojo {

    // 发送方的账号

    protected String FromUserName;

    // 接收方的账号(OpenID)

    protected String ToUserName;

    // 消息创建时间

    protected Long CreateTime;

    /**

     * 消息类型

     * text 文本消息

     * image 图片消息

     * voice 语音消息

     * video 视频消息

     * music 音乐消息

     * news 图文消息

     */

    protected String MsgType;

  

    // 文本内容

    private String Content;

  

    public String getFromUserName() {

        return FromUserName;

    }

  

    public void setFromUserName(String fromUserName) {

        FromUserName = fromUserName;

    }

  

    public String getToUserName() {

        return ToUserName;

    }

  

    public void setToUserName(String toUserName) {

        ToUserName = toUserName;

    }

  

    public Long getCreateTime() {

        return CreateTime;

    }

  

    public void setCreateTime(Long createTime) {

        CreateTime = createTime;

    }

  

    public String getMsgType() {

        return MsgType;

    }

  

    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

    public String getContent() {

        return Content;

    }

  

    public void setContent(String content) {

        Content = content;

    }

  

    @Override

    public String toString() {

        return "OutMsgPojo{" +

                "FromUserName='" + FromUserName + '\'' +

                ", ToUserName='" + ToUserName + '\'' +

                ", CreateTime=" + CreateTime +

                ", MsgType='" + MsgType + '\'' +

                ", Content='" + Content + '\'' +

                '}';

    }

}

 

WechatController.java

//微信自动回复,发送“你好”,回复“你也好”

  @RequestMapping(value = "/wechat", method = RequestMethod.POST, produces = "application/xml")

  public @ResponseBody

  Object doPost(@RequestBody InMsgPojo inMsgPojo) {

    //创建消息响应对象

    OutMsgPojo out = new OutMsgPojo();

    //把原来的发送方设置为接收方

    out.setToUserName(inMsgPojo.getFromUserName());

    //把原来的接收方设置为发送方

    out.setFromUserName(inMsgPojo.getToUserName());

    //获取接收的消息类型

    String msgType = inMsgPojo.getMsgType();

    //设置消息的响应类型

    out.setMsgType(msgType);

    //设置消息创建时间

    out.setCreateTime(new Date().getTime());

    //根据类型设置不同的消息数据

    if (inMsgPojo.getContent().equals("你好")) {

        out.setContent("你也好");

    } else {

        out.setContent("无法识别的请求!");

    }

    return out;

}

 

 

 

 

 

 

2017-08-05 16:05:43 LJFPHP 阅读数 6831

最近开始做公司的微信项目,深切的感受到了微信的不同,做微信是需要从头开始好好学的,在此记录一下学习微信的过程,也希望以后能根据这些文章迅速掌握微信开发的知识。少踩坑,,(laravel框架)

1、首先需要进入微信公众号--》基本配置--》填上你的服务器信息--》验证TOKEN,获取appId和appkey

2、下载官方的SDK文件,参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543

demo下载地址:http://www.cnblogs.com/txw1958/p/tutorials-of-wechat-public-platform.html       方倍工作室 的。

3、首先需要明确(1)验证token通过,证明你的服务器可以和微信进行交互

(2)进入微信页面,发送消息,此时,后台应接受消息,并判断消息类型

(3)根据消息类型,拼接不同的xml数据,返回给模板

(4)然后就实现了微信上自动回复的功能了。

4、


以上为验证token之后,在控制器设置的微信入口文件:这个文件也就是demo中的reponseMsg()方法:

主要用于获得微信发送过来的数据,然后再把tousername,fromusername等信息放到一起,提取用户发送消息的类型$event,并且请求下一个方法:

5、

这个方法主要是为了判断请求的类型,根据不同的类型会有不同的处理方法。在此只处理text类型的数据,并且调用text方法,获取拼接的数据。最后返回给响应方法handle_response()方法。

6、

在这里,我们把回复的内容都给写死了,大家到时候也完全可以从数据库读出这些数据。里面就是简单的拼接了一些图文信息,然后把这些信息返回。数组$arr是方便在模板上输出图文消息。

7、

该控制器主要是根据传过来的event不同,判断该调用哪个模板,该回复什么样的消息等。如果$event==text,则调用默认的模板:$xml = view(wechat.tpl_reply_text) ;如果$event为news,则需要返回图文消息,我们把数据都放到数组里面,在模板上输出即可。

8、

<xml>
  <ToUserName><![CDATA[{{$ToUserName}}]]></ToUserName>
  <FromUserName><![CDATA[{{$FromUserName}}]]></FromUserName>
  <CreateTime>{{$CreateTime}}</CreateTime>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>{{$ArticleCount}}</ArticleCount>
  <Articles>
@foreach ($news  as $k => $v)
  <item>
  <Title><![CDATA[{{$v['Title']}}]]></Title>
  <Description><![CDATA[{{$v['Description']}}]]></Description>
  <PicUrl><![CDATA[{{$v['PicUrl']}}]]></PicUrl>
  <Url><![CDATA[{{$v['Url']}}]]></Url>
  </item>
@endforeach
  </Articles>
</xml>

这就是模板部分:直接输出即可。

9、在此已经是完成了微信的自动回复功能。用户输入指定的内容的时候,,我们也回复指定的内容回去。

微信官方的给的demo被拆分了,没有按照官方上那种返回xml数据,而是采用了laravel的模板来输出。


10、总结:虽然整体来说不够简洁,但也算是实现了功能,在此做个记录。以后水平高了再完善完善。

2018-04-26 18:17:37 tang_tss 阅读数 618

自动回复消息,就是把自动回复的信息,组成xml文件每一个回复都会对应着一个xml文件,并不是所有回复都使用的一个xml。下面分别是回复文本、图片、图文消息。在回复图片和图文中都需要上传图片,分别需要点用接口。

这里需要用到四个数据库:





回复文本消息

<xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml>
参数是否必须描述
ToUserName接收方帐号(收到的OpenID)
FromUserName开发者微信号
CreateTime消息创建时间 (整型)
MsgTypetext
Content回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

代码示例:

//自动回复文本
	public function addtext(){

		$content = I('post.content');
		$keyword = I('post.keyword');
		if(empty($content) || empty($keyword)){
			$this->ajaxReturn(array('msg'=>'必须输入关键字和回复内容'));
		}
		$mp = $this->mp;
		$data['content'] = $content;
		$model = M('mp_reply_text');
		$ret = $model->add($data);
		// echo $ret;
		// exit;
		if(isset($ret)){
			$data1['keyword'] = $keyword;
			$data1['mpid'] = $mp['id'];
			$data1['reply_id'] = $ret;
			$data1['type'] = 'text';
			M('mp_rule')->add($data1);
			$this->ajaxReturn(array('msg'=>'添加成功'));
		}
		else{
			$this->ajaxReturn(array('msg'=>$ret));
		}		
	}

回复图片消息

<xml><ToUserName>< ![CDATA[toUser] ]></ToUserName><FromUserName>< ![CDATA[fromUser] ]></FromUserName><CreateTime>12345678</CreateTime><MsgType>< ![CDATA[image] ]></MsgType><Image><MediaId>< ![CDATA[media_id] ]></MediaId></Image></xml>
参数是否必须说明
ToUserName接收方帐号(收到的OpenID)
FromUserName开发者微信号
CreateTime消息创建时间 (整型)
MsgTypeimage
MediaId通过素材管理中的接口上传多媒体文件,得到的id。

代码示例:

//自动回复图片
	public function addimage(){

		$url = I('post.url');//图片在本地服务器上的路径

		//相对路径->绝对路径
		$file = realpath('.' . $url);
		$keyword = I('post.keyword');
		if(empty($url) || empty($keyword)){
			$this->ajaxReturn(array('status'=>0,'msg'=>'必须输入关键字和回复图片'));
		}
		$access_token = getAccess_token();
		include APP_PATH . 'LaneWeChat/lanewechat.php';

		//上传永久图片api
		$api = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";

		$data['media'] = Curl::addFile($file);
		$ret = Curl::callWebServer($api,$data,'post',true,false);
		
		if(isset($ret['media_id'])){
			$data['media_id'] = $ret['media_id'];
			$data['url'] = $ret['url'];
			$model = M('mp_reply_image');
			$r = $model->add($data);
			if($r){
				$mp = $this->mp;
				$data['mpid'] = $mp['id'];
				$data['type'] = 'image';
				$data['keyword'] = $keyword;
				$data['reply_id'] = $r;
				M('mp_rule')->add($data);
				$this->ajaxReturn(array('status'=>1,'msg'=>'添加成功'));
			}else{
				$this->ajaxReturn(array('msg'=>$ret));
			}
		}else{
			$this->ajaxReturn(array('msg'=>$ret));
		}	
	}

回复图文消息

<xml><ToUserName>< ![CDATA[toUser] ]></ToUserName><FromUserName>< ![CDATA[fromUser] ]></FromUserName><CreateTime>12345678</CreateTime><MsgType>< ![CDATA[news] ]></MsgType><ArticleCount>2</ArticleCount><Articles><item><Title>< ![CDATA[title1] ]></Title> <Description>< ![CDATA[description1] ]></Description><PicUrl>< ![CDATA[picurl] ]></PicUrl><Url>< ![CDATA[url] ]></Url></item><item><Title>< ![CDATA[title] ]></Title><Description>< ![CDATA[description] ]></Description><PicUrl>< ![CDATA[picurl] ]></PicUrl><Url>< ![CDATA[url] ]></Url></item></Articles></xml>
参数是否必须说明
ToUserName接收方帐号(收到的OpenID)
FromUserName开发者微信号
CreateTime消息创建时间 (整型)
MsgTypenews
ArticleCount图文消息个数,限制为8条以内
Articles多条图文消息信息,默认第一个item为大图,注意,如果图文数超过8,则将会无响应
Title图文消息标题
Description图文消息描述
PicUrl图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
Url点击图文消息跳转链接

代码示例:

//自动回复图文
	public function addnews(){
		$keyword = I('post.keyword');
		$title = I('post.title');
		$picurl = I('post.url');
		$description = I('post.content');
		$url = I('post.content_source_url');

		//相对路径->绝对路径
		$file = realpath('.' . $picurl);

		if(empty($picurl) || empty($keyword) || empty($title) || empty($description) || empty($url)){
			$this->ajaxReturn(array('status'=>0,'msg'=>'请将信息输入完整'));
		}	

		$access_token = getAccess_token();
		include APP_PATH . 'LaneWeChat/lanewechat.php';

		//上传永久图片api
		$api = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=$access_token&type=image";

		$data['media'] = '@' . $file;
		$ret = Curl::callWebServer($api,$data,'post',true,false);
		if(isset($ret['media_id'])){
			$data['picurl'] = $ret['url'];
			$data['title'] = $title;
			$data['description'] = $description;
			$data['url'] = $url;
			$model = M('mp_reply_news');
			$r = $model->add($data);
			if($r){
				$mp = $this->mp;
				$arr['mpid'] = $mp['id'];
				$arr['keyword'] = $keyword;
				$arr['type'] = 'news';
				$arr['reply_id'] = $r;
				M('mp_rule')->add($arr);
				$this->ajaxReturn(array('status'=>1,'msg'=>'添加成功'));
			}else{
				$this->ajaxReturn(array('msg'=>$ret));
			}
		}else{
			$this->ajaxReturn(array('msg'=>$ret));
		}
		

	}