php微信开发点击菜单回复信息_php微信开发 自定义菜单 回复纯文本 - CSDN
  • 点击click事件自动回复 <?php/* 实现功能: 1.扫码关注提示 2.点击click事件自动回复 */ define("TOKEN", "weixin");$wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) { $wechatO

    实现功能:
    1.扫码关注提示
    2.点击click事件自动回复

    <?php
    
    /* 
      实现功能:
      1.扫码关注提示
      2.点击click事件自动回复  
    */ 
    
    define("TOKEN", "weixin");
    
    $wechatObj = new wechatCallbackapiTest();
    if (!isset($_GET['echostr'])) {
        $wechatObj->responseMsg();
    }else{
        $wechatObj->valid();
    }
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
    
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    
        public function responseMsg()
        {
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            if (!empty($postStr)){
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $RX_TYPE = trim($postObj->MsgType);
    
                switch ($RX_TYPE)
                {
                    case "text":
                        $resultStr = $this->receiveText($postObj);
                        break;
                    case "event":
                        $resultStr = $this->receiveEvent($postObj);
                        break;
                    default:
                        $resultStr = "";
                        break;
                }
                echo $resultStr;
            }else {
                echo "";
                exit;
            }
        }
    
        private function receiveText($object)
        {
            $funcFlag = 0;
            $contentStr = "你发送的内容为:".$object->Content;
            $resultStr = $this->transmitText($object, $contentStr, $funcFlag);
            return $resultStr;
        }
    
        private function receiveEvent($object)
        {
            $contentStr = "";
            switch ($object->Event)
            {
                case "subscribe":
                    $contentStr = "欢迎关注XX";
                case "unsubscribe":
                    break;
                case "CLICK":
                    switch ($object->EventKey)
                    {
                        case "company":
                            $contentStr[] = array("Title" =>"公司简介", 
                            "Description" =>"XX提供移动互联网相关的产品及服务", 
                            "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
                            "Url" =>"weixin://addfriend/pondbaystudio");
                            break;
                        default:
                            $contentStr[] = array("Title" =>"默认菜单回复", 
                            "Description" =>"您正在使用的XXX", 
                            "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", 
                            "Url" =>"weixin://addfriend/pondbaystudio");
                            break;
                    }
                    break;
                default:
                    break;      
    
            }
            if (is_array($contentStr)){
                $resultStr = $this->transmitNews($object, $contentStr);
            }else{
                $resultStr = $this->transmitText($object, $contentStr);
            }
            return $resultStr;
        }
    
        private function transmitText($object, $content, $funcFlag = 0)
        {
            $textTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>%d</FuncFlag>
    </xml>";
            $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $funcFlag);
            return $resultStr;
        }
    
        private function transmitNews($object, $arr_item, $funcFlag = 0)
        {
            //首条标题28字,其他标题39字
            if(!is_array($arr_item))
                return;
    
            $itemTpl = "    <item>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[%s]]></Description>
            <PicUrl><![CDATA[%s]]></PicUrl>
            <Url><![CDATA[%s]]></Url>
        </item>
    ";
            $item_str = "";
            foreach ($arr_item as $item)
                $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
    
            $newsTpl = "<xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <Content><![CDATA[]]></Content>
    <ArticleCount>%s</ArticleCount>
    <Articles>
    $item_str</Articles>
    <FuncFlag>%s</FuncFlag>
    </xml>";
    
            $resultStr = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($arr_item), $funcFlag);
            return $resultStr;
        }
    }
    ?>
    展开全文
  • 微信开发自定义回复文本&lt;?php namespace Home\Controller; use Think\Controller; use LaneWeChat\Core\Curl; class AutoreplyController extends Controller { private $mp; public function _initialize...

    微信开发自定义回复文本

    <?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('mp/index'));
    			exit;
    		}else{
    			$this->mp = $mp;
    		}
    	}
    
    	public function index(){
             $this->display('replytext');
    	}
    	//回复文本消息
    	public function replytext(){
    		$data['content'] = I('content');
    		$replyid = M('mp_reply_text')->add($data);
    		if($replyid){
    		$mp = $this->mp;
    		$arr['mp_id'] = $mp['id'];
    		$arr['type'] = 'text';
    		$arr['keyword'] = I('keyword');
    		$arr['reply_id'] = $replyid;
    
    		$ret = M('mp_rule')->add($arr);
    		if($ret){
    			$this->ajaxReturn(array('msg'=>'添加成功','url'=>U('keyword',['type'=>'text'])));
    		}else{
    				$this->ajaxReturn(array('msg'=>$ret));
    			
    		}
    		}else{
    				$this->ajaxReturn(array('msg'=>$ret));
    		}
    	}
    }

    自定义菜单点击文本回复在wechatquest.php中设置为

     public static function eventClick(&$request){
            //获取该分类的信息
            $eventkey = $request['eventkey'];
            $request['content'] = $eventkey;
            return self::text($request);
            // $content = '收到点击菜单事件,您设置的key是' . $eventKey;
            // return ResponsePassive::text($request['fromusername'], $request['tousername'], $content);
        }

    展开全文
  • <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678<... &...

    <xml>
      <ToUserName><![CDATA[toUser]]></ToUserName>
      <FromUserName><![CDATA[fromUser]]></FromUserName>
      <CreateTime>12345678</CreateTime>
      <MsgType><![CDATA[news]]></MsgType>
      <ArticleCount>1</ArticleCount>
      <Articles>
        <item>
          <Title><![CDATA[title1]]></Title>
          <Description><![CDATA[description1]]></Description>
          <PicUrl><![CDATA[picurl]]></PicUrl>
          <Url><![CDATA[url]]></Url>
        </item>
      </Articles>
    </xml>
    ArticleCount 消息数量
    Title 标题
    Description 描述(当ArticleCount大于1时,不显示)
    PicUrl 图片的地址(可访问的url地址
    Url 点击后跳转地址

    添加菜单,并设置key值。参照《创建菜单》

    		{
    			"type":"click",
    			"name":"图文",
    			"key":"mh005"
    		}

    修改WXMessgeBean。

    @XmlRootElement(name="xml")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class WXMessgeBean {
        ......
    
        private int ArticleCount;
        private ArticleMessage Articles;
    
        ......
    
        public int getArticleCount() {
            return ArticleCount;
        }
    
        public void setArticleCount(int articleCount) {
            ArticleCount = articleCount;
        }
    
        public ArticleMessage getArticles() {
            return Articles;
        }
    
        public void setArticles(ArticleMessage articles) {
            Articles = articles;
        }
    
    //新增图文消息Bean
        public static class ArticleMessage{
            private List<ArticleItem> item;
    
            @XmlElement(name = "item")
            public List<ArticleItem> getItem() {
                if (item == null)
                    item = new ArrayList<>();
                return item;
            }
        }
        public static class ArticleItem{
            private String title;
            private String description;
            private String picUrl;
            private String url;
    
            public String getTitle() {
                return title;
            }
            @XmlElement(name = "Title")
            public void setTitle(String title) {
                this.title = title;
            }
    
            public String getDescription() {
                return description;
            }
            @XmlElement(name = "Description")
            public void setDescription(String description) {
                this.description = description;
            }
    
            public String getPicUrl() {
                return picUrl;
            }
            @XmlElement(name = "PicUrl")
            public void setPicUrl(String picUrl) {
                this.picUrl = picUrl;
            }
    
            public String getUrl() {
                return url;
            }
            @XmlElement(name = "Url")
            public void setUrl(String url) {
                this.url = url;
            }
        }
    }
    

    回复代码,先看一条的情况。

                else if (wxMessgeBean.getEventKey().equals("mh005")){
                    bean.setMsgType("news");
                    bean.setArticleCount(1);
                    bean.setArticles(new WXMessgeBean.ArticleMessage());
                    WXMessgeBean.ArticleItem item = new WXMessgeBean.ArticleItem();
                    item.setTitle("图文消息一");
                    item.setDescription("中华人民共和国成立70周年");
                    item.setPicUrl("https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/pic/item/d01373f082025aaf6ca357d9f7edab64034f1a0a.jpg");
    //假定点击跳转到百度
                    item.setUrl("http://www.baidu.com");
                    bean.getArticles().getItem().add(item);
                }

    这时Title和Description都会显示。再看看两个的情况。

    else if (wxMessgeBean.getEventKey().equals("mh005")){
                    bean.setMsgType("news");
                    bean.setArticleCount(2);
                    bean.setArticles(new WXMessgeBean.ArticleMessage());
                    WXMessgeBean.ArticleItem item = new WXMessgeBean.ArticleItem();
                    item.setTitle("图文消息一");
                    item.setDescription("中华人民共和国成立70周年");
                    item.setPicUrl("https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/pic/item/d01373f082025aaf6ca357d9f7edab64034f1a0a.jpg");
                    item.setUrl("http://www.baidu.com");
                    bean.getArticles().getItem().add(item);
                    item = new WXMessgeBean.ArticleItem();
                    item.setTitle("图文消息二");
                    item.setDescription("弹劾特朗普");
                    item.setPicUrl("http://static.ename.cn/article/2018-12-17/pic-1-1545037442.jpg");
                    item.setUrl("http://www.baidu.com");
                    bean.getArticles().getItem().add(item);
                }

     

    和一条的对比以下,看到只显示Title。 

    展开全文
  • 先讲回复图片,语音类似。 这个发送图片,并不是点击输入框右侧的“➕”,去选择本地照片,而是要把图片上传的公众号的服务器。 按照开发文档...

    先讲回复图片,语音类似。

    这个发送图片,并不是点击输入框右侧的“➕”,去选择本地照片,而是要把图片上传的公众号的服务器。

    按照开发文档https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html,被动回复图片消息格式如下:

    <xml>
      <ToUserName><![CDATA[toUser]]></ToUserName>
      <FromUserName><![CDATA[fromUser]]></FromUserName>
      <CreateTime>12345678</CreateTime>
      <MsgType><![CDATA[image]]></MsgType>
      <Image>
        <MediaId><![CDATA[media_id]]></MediaId>
      </Image>
    </xml>

    大厂的定义也是够不正规的,多种图片消息格式竟然不统一,这里的MediaId节点是在Image(注意首字母大写)节点之下的,其他图片消息MediaId节点是一级节点,注意一下啊!

    增加菜单“看图”,并定义key值。参照《创建菜单》

    {
    	"button":[
    		{
    			"type":"click",
    			"name":"Hello",
    			"key":"mh001"
    		},
    		{
    			"type":"click",
    			"name":"看图",
    			"key":"mh002"
    		}
    }

    根据开发文档,对之前的WXMessgeBean进行修改,增加一个字段和一个ImageMessage的Bean

    package com.myweb.demo.bean;
    
    import javax.xml.bind.annotation.*;
    
    @XmlRootElement(name="xml")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class WXMessgeBean {
        ......
    
        private ImageMessage Image;
    
        ......
    
        public ImageMessage getImage() {
            return Image;
        }
    
        public void setImage(ImageMessage image) {
            Image = image;
        }
    
        public static class ImageMessage{
            private String mediaId;
    
            public String getMediaId() {
                return mediaId;
            }
    //注意这里,设置MediaId节点名称,一定是首字母大写
            @XmlElement(name = "MediaId")
            public void setMediaId(String mediaId) {
                this.mediaId = mediaId;
            }
        }
    }
    

    设置MediaId节点名称,一定是首字母大写!!!

    另外这个MediaId从哪里来呢,通过微信公众平台接口调试工具,将图片提交到服务器(当然还要先获取accessToken)

    按照图示的样子,填写信息,点击“检查问题”,成功后,就会在下方显示MediaID。 

    回复消息的代码如下:

        @PostMapping(value = "/checktoken", produces = MediaType.APPLICATION_XML_VALUE)
        public String receiveWX(HttpServletRequest request, HttpServletResponse response  ){
            try {
                Marshaller marshaller;
                Unmarshaller unmarshal;
                //你要解析成哪个bean对象,newInstance的参数就是哪个对象
                JAXBContext jaxbContext = JAXBContext.newInstance(WXMessgeBean.class);
                unmarshal = jaxbContext.createUnmarshaller();
                //xml解码成bean对象
                WXMessgeBean wxMessgeBean = (WXMessgeBean) unmarshal.unmarshal(request.getInputStream());
    
                //准备返回文字信息
                WXMessgeBean bean = new WXMessgeBean();
                bean.setFromUserName(wxMessgeBean.getToUserName());
                bean.setToUserName(wxMessgeBean.getFromUserName());
                bean.setCreateTime(new Date().getTime());
                //通过比对菜单项的key值
                if (wxMessgeBean.getEventKey().equals("mh001")) {
                    ......
                }
                else if (wxMessgeBean.getEventKey().equals("mh002")){
                    bean.setMsgType("image");
                    bean.setImage(new WXMessgeBean.ImageMessage());
                    bean.getImage().setMediaId("DSUR_MT-pbZTA7gf6CITwK3RtCnxwB_K5zUKUWAZNgbKbGB1HS3n3hyGNJZPWbFD");
                }
                else{
                    ......
                }
                //把bean对象组装成xml格式,并返回
                marshaller = jaxbContext.createMarshaller();
                StringWriter writer = new StringWriter();
                marshaller.marshal(bean,writer);
                return writer.toString();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

    把之前获得的MediaId填进去就是了。启动服务,点击“看图”按钮,就会看到了。

    回复图像搞定之后,语音的就简单了,所有步骤都一样,唯一不同的就是MsgType=video。

    <MsgType><![CDATA[video]]></MsgType>

     

    展开全文
  • 微信公众号开发者模式下的自定义菜单回复图片和图文1 注意的是,区分好个人订阅号和测试号;2.先获取token值;自定义菜单代码(php)讲下重点代码: 话不多说,我分析我遇到的问题和解决方法。 1 注意的是,区分好...
  • 在测试账号申请时,我们还...这篇文章将讲解如何点击底部菜单,返回文字信息。 官方文档https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html <xml> ...
  • 微信公众号开发5-自定义菜单-微信开发php讲师介绍: 秦子恒,CEO/董事长/总经理,大秦电商创始人,专注网络技术的电商应用。已经出品《1小时快速建站》《微博营销实战》《PHP采集》《网络招商系统》课程介绍: ...
  • 微信是一个高大上的东西,恩,没错 首先输入网址mp.weixin.qq.com进入微信公众平台 注册账号和密码(注意的是这里的账号和密码不是微信的账号密码) 进入之后点击左侧开发/开发者工具 在右侧点击进入公众平台...
  • // // 响应用户消息 // 微信公众账号响应给用户的不同消息类型 // define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) { ... $wechatObj->v
  • 自定义菜单需要我们以POST的方式去请求接口,并且需要携带按钮信息(格式为json)。 由于自定义菜单较为简单,这里使用微信官方提供的接口测试工具对按钮增加接口进行测试: 通过appid和secret获取access_token。 ...
  • 我们在关注微信公众号、点击菜单回复关键词或者执行程序中的某些事件(比如,订单提交成功等。)的时候,可以看到,有些公众号同时给我们回复了两条或两条以上的消息内容。 内容形式不限于文字,可能是这些消息...
  • 关键字:微信公众平台 开发模式 图文消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-97-news.html 在这篇微信公众平台开发教程中,我们将介绍如何灵活的使用图文消息功能。我们将只介绍被动...
  • 一:自动回复  1:在开发选项里有接口权限可以调用接口 / 开发者工具 (接口权限都是无上限的) (这两个是使用不同的后台,所以需要分别登录)    2:接口配置信息,打开公众平台开发者文档,里面有一些...
  • 企业号和订阅号服务号最大区别,千万注意消息加密和解密!...点击菜单回复消息时,流程为: 先调用官方给的VerifyURL($sMsgSignature, $sTimeStamp, $sNonce, $sEchoStr, &$sReplyEchoStr)函数进行URL验证,
  • 此次和上一篇:微信公众号上传素材类似,这里部分代码就省略 直接上代码: 创建自定义菜单: public function menu() { $bb=[ "button"=>[ [ "type"=>"click", "name"=>"生成海报", "key"=>...
  • 自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发微信WEB开发微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权...
  • 创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单。测试时可以尝试取消关注...
  • 微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎...
  • 接着上次分享的服务器被动回复文本消息,这次分享的是图文消息(也叫文章消息),文本消息虽然可以处理大部分的业务需求,但美中不足的是消息过于死板不够活泼生动,为了丰富消息的内容和展现微信提供了图文消息供...
  • laravel 微信开发-自动回复1.微信公众号的逻辑,用户关注了你的微信公众号后,假设用户发送了一条消息给你的公众号,实际上是先发送到腾讯的服务器上,腾讯把内容转成特定的xml格式,再转发到你指定的服务端(如:/...
1 2 3 4 5 ... 20
收藏数 2,084
精华内容 833
关键字:

php微信开发点击菜单回复信息