微信开发 点击菜单返回图片_点击微信菜单时微信服务器返回的信息有 - CSDN
精华内容
参与话题
  • 进入之后点击左侧开发/开发者工具 在右侧点击进入公众平台测试账号(因为测试账号的功能比较全,所以选择测试账号) 一、微信自动回复图片功能 点击接口配置信息修改中的 消息接口使用指南之后 进入公众平台...

    微信是一个高大上的东西,恩,没错

    首先输入网址mp.weixin.qq.com进入微信公众平台

    注册账号和密码(注意的是这里的账号和密码不是微信的账号密码

    进入之后点击左侧开发/开发者工具

    在右侧点击进入公众平台测试账号(因为测试账号的功能比较全,所以选择测试账号


    一、微信自动回复图片功能

    点击接口配置信息修改中的 消息接口使用指南之后 进入公众平台开发者文档


    点击开始开发中的 接口指南 右侧第三步之上有一个PHP实例代码(下载之后放到自己的服务器

    下面就是下载的php实例代码

    其中 要验证TOKEN中的值要和接口信息中的配置一致

    1. define("TOKEN""qweqwe");  


    回复图片需要用到media_id

    获取media_id需要获取access_token(每个access_token的生存时间是7200秒,建议把access加入缓存)


    获取media_id


    图片

    回复的时候就回复图片


    二、自定义菜单

    自定义菜单首先需要获取access_token和上边一样

    点击自定义菜单中的菜单创建接口

    1. <?php  
    2. header('content-type:text/html;charset=utf-8');  
    3. define("APPID""wx15ca9f0520bc2e4c");  
    4. define("APPSECRET""2fadf1c74655b7a47253de19b7a23d7d");  
    5. $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;  
    6. $arr = file_get_contents($url);  
    7. $arr = json_decode($arr,true);  
    8. $access_token = $arr['access_token'];  
    9. $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;  
    10. $curl = new curl();  
    11. $data = ' {  
    12.      "button":[  
    13.      {    
    14.           "type":"click",  
    15.           "name":"今日歌曲",  
    16.           "key":"V1001_TODAY_MUSIC"  
    17.       },  
    18.       {  
    19.            "name":"菜单",  
    20.            "sub_button":[  
    21.            {      
    22.                "type":"view",  
    23.                "name":"搜索",  
    24.                "url":"http://www.soso.com/"  
    25.             },  
    26.             {  
    27.                "type":"view",  
    28.                "name":"视频",  
    29.                "url":"http://v.qq.com/"  
    30.             },  
    31.             {  
    32.                "type":"click",  
    33.                "name":"赞一下我们",  
    34.                "key":"V1001_GOOD"  
    35.             }]  
    36.        }]  
    37.  }';  
    38. echo $curl->send($url,'POST',$data);  
    39.   
    40. class curl    
    41.     {    
    42.             
    43.         function send($url,$method,$data='')    
    44.         {    
    45.             $ch = curl_init();   //1.初始化      
    46.             curl_setopt($ch, CURLOPT_URL, $url); //2.请求地址      
    47.             curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);//3.请求方式      
    48.             //4.参数如下      
    49.             curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//https      
    50.             curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);      
    51.             curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');//模拟浏览器      
    52.             curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);      
    53.             curl_setopt($ch, CURLOPT_AUTOREFERER, 1);       
    54.             if($method=="POST"){//5.post方式的时候添加数据      
    55.                 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);      
    56.             }      
    57.             curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);      
    58.             $tmpInfo = curl_exec($ch);//6.执行            
    59.             return $tmpInfo;        
    60.         }    
    61.     }   
    62. ?>  

    运行php文件,再重新关注即可显示菜单
    展开全文
  • 这个发送图片,并不是点击输入框右侧的“➕”,去选择本地照片,而是要把图片上传的公众号的服务器。 按照开发文档...

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

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

    按照开发文档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 注意的是,区分好...


    话不多说,我分析我遇到的问题和解决方法。

    1 注意的是,区分好个人订阅号和测试号;

    1.1:个人订阅号,在没有通过验证前,是不可以在开发者模式下自定义菜单。所以一般都选择测试号学习开发。以下也以测试号来说明情况。

    2.先获取token值;

    2.1 注意标红处
    在这里插入图片描述
    在这里插入图片描述
    先点图一
    记住你的appID和appsecret然后返回刚刚的图二;
    在这里插入图片描述在这里插入图片描述

    记住怎么获取token值,等等需要用到。

    自定义菜单代码(php)

    <?php /** * Created by PhpStorm. * User: * Date: 2020/6/5 * Time: 10:05 */ $appid = "自己的测试号的appid "; $appsecret = "自己的测试号的appsecret "; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret"; $output = https_request($url); $result = (array)json_decode($output); $token = $result['access_token']; //调用自定义菜单接口创建自定义菜单 $urlMenu = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$token"; $MenuData = ' { "button":[ { "name":"实验资料", "sub_button":[ { "type":"view", "name":"实验三", "url":"https://www.baidu.com/" }, { "type":"click", "name":"实验二", "key":"V1001_GOOD_2" }, { "type":"click", "name":"实验一", "key":"V1001_GOOD_1" } ] }, { "type":"click", "name":"课程导学", "key":"V1001_GOOD_3" }, { "name":"课外提升", "sub_button":[ { "type":"click", "name":"微信年度数据报告", "key":"V1001_GOOD_4" },{ "type":"click", "name":"微信开发学习路程", "key":"V1001_GOOD_5" }] }] } '; $output1 = https_request($urlMenu,$MenuData); echo $output1; function https_request($url,$data = null) { $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE); //curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); if(!empty($data)) { curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); $output = curl_exec($curl); curl_close($curl); return $output; } ?>

    代码二:

    <?php 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 "event": //文本消息 $result = $this->receiveEvent($postObj); break; case "text": //文本消息 $result = $this->receiveText($postObj); break; case "image": //图片消息 $result = $this->receiveImage($postObj); break; case "voice": //语音消息 $result = $this->receiveVoice($postObj); break; case "video": //视频消息 $result = $this->receiveVideo($postObj); break; case "location"://位置消息 $result = $this->receiveLocation($postObj); break; case "link": //链接消息 $result = $this->receiveLink($postObj); break; default: $result = "unknow msg type: ".$RX_TYPE; break; } echo $result; //返回处理的结果 }else { echo " "; exit; } } //接收文本消息 private function receiveEvent($object) { $Event = $object->Event; if($Event =="subscribe"){ $content = "欢迎关注小抓瓦"."\n"."我们因你而精彩"; }elseif($Event == "CLICK"){ $Key = $object->EventKey; if($Key == "V1001_GOOD_2"){ $result = $this->transmitnews($object); return $result; } elseif($Key == "V1001_GOOD_1"){ $result = $this->transmitImage1($object); return $result; } elseif($Key == "V1001_GOOD_3"){ $result = $this->transmitMusic($object); return $result; } elseif($Key == "V1001_GOOD_4"){ $result = $this->transmitnews1($object); return $result; } elseif($Key == "V1001_GOOD_5"){ $result = $this->transmitnews2($object); return $result; } else { $content = "你点击了CLICK菜单"; } } else{ $content = "你点击了菜单"; } $result = $this->transmitText($object, $content); return $result; } private function receiveText($object) { $keyworlds = $object->Content; if($keyworlds == "天后"){ $result = $this->transmitMusic($object); } elseif($keyworlds == "你好"){ $content = "你好呀。"; $result = $this->transmitText($object, $content); }elseif($keyworlds == "图片"){ $result = $this->transmitImage1($object); }elseif($keyworlds == "图文"){ $result = $this->transmitnews($object); } else{ $content = "你发送的是文本,内容为:".$object->Content; $result = $this->transmitText($object, $content); } return $result; } //接收图片消息 private function receiveImage($object) { $content =array("MediaId"=>$object->MediaId); $result = $this->transmitImage($object, $content); return $result; } //接收语音消息 private function receiveVoice($object) { $content =array("MediaId"=>$object->MediaId); $result = $this->transmitVoice($object, $content); return $result; } //接收视频消息 private function receiveVideo($object) { $content = "你发送的是视频,媒体ID为:".$object->MediaId; $result = $this->transmitText($object, $content); return $result; } //接收位置消息 private function receiveLocation($object) { $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label; $result = $this->transmitText($object, $content); return $result; } //接收链接消息 private function receiveLink($object) { $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url; $result = $this->transmitText($object, $content); return $result; } //回复文本消息 private function transmitText($object, $content) { $textTpl = " <![CDATA[%s]]> <![CDATA[%s]]> %s <![CDATA[text]]> <![CDATA[%s]]> "; $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content); return $result; } //回复图片消息 private function transmitImage1($object) { $itemTpl=" <![CDATA[%s]]> <![CDATA[%s]]> %s <![CDATA[image]]> <![CDATA[q72tuNgtah6dELq4sCP1juldRLiCqD5Tgztj2QuDpjR-vwJj3S7QuMOV20x4A8Uy]]> "; $result = sprintf($itemTpl, $object->FromUserName, $object->ToUserName, time()); return $result; } ?>

    讲下重点代码:

    自己测试号的

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    图文等等是推送是类似的。今天就到这,希望能帮助到你们,我也是小白。

    展开全文
  • 微信开发 -- 自定义菜单

    万次阅读 2014-02-10 10:18:49
    微信开发 自定义菜单 菜单事件推送

    目前微信服务号自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

    目前自定义菜单接口可实现两种类型按钮,如下:

    click:
    用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event	的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
    view:
    用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值	(即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
    


    接口调用请求说明

    http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN

    请求示例(JSON数据请使用UTF-8编码)

    {
        "button":[
            {"type":"click","name":"我的信息","sub_button":[
                {"type":"click","name":"拇指查询","key":"BUTTON_1"},
    	    {"type":"click","name":"拇指请假","key":"BUTTON_2"},
    	    {"type":"view","name":"工号绑定","url":"http://XXXXXXXXXXXXXXXXX"}]
    	},
            {"type":"click","name":"业务流程","key":"BUTTON_3"},
            {"name":"员工建议","sub_button":[
                {"type":"view","name":"思想火花","url":"http://XXXXXXXXXXXXXXXXXX"},
                {"type":"view","name":"奖品兑换","url":"http://XXXXXXXXXXXXXXXXXX"},
                {"type":"click","name":"赞一下我们","key":"BUTTON_ZAN"}]
            }
        ]
    }
    

    参数说明

    参数 是否必须 说明
    button 一级菜单数组,个数应为1~3个
    sub_button 二级菜单数组,个数应为1~5个
    type 菜单的响应动作类型,目前有click、view两种类型
    name 菜单标题,不超过16个字节,子菜单不超过40个字节
    key click类型必须 菜单KEY值,用于消息接口推送,不超过128字节
    url view类型必须 网页链接,用户点击菜单可打开链接,不超过256字节


    返回结果

    正确时的返回JSON数据包如下:

    {"errcode":0,"errmsg":"ok"}
    

    错误时的返回JSON数据包如下(示例为无效菜单名长度):

    {"errcode":40018,"errmsg":"invalid button name size"}

            以下是示例代码(PHP)。

            

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN">
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <meta name="author" content="Chris Mao" />
        </head>
        <body>
        <?php
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    
            $output = curl_exec($ch);
            curl_close($ch);
            if (empty($output)) { var_dump($output); exit; }
            $result = json_decode($output);
            $token = $result->access_token;
                
            //创建菜单
            $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=$token";
            $jsonData = file_get_contents("menu.json");
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            $output = curl_exec($ch);
            curl_close($ch); 
            var_dump($output);
        ?>
        </body>
    </html>

    menu.json

    {
        "button":[
            {"type":"click","name":"我的信息","sub_button":[
                {"type":"click","name":"拇指查询","key":"BUTTON_1"},
    	    {"type":"click","name":"拇指请假","key":"BUTTON_2"},
    	    {"type":"view","name":"工号绑定","url":"http://XXXXXXXXXXXXXXXXX"}]
    	},
            {"type":"click","name":"业务流程","key":"BUTTON_3"},
            {"name":"员工建议","sub_button":[
                {"type":"view","name":"思想火花","url":"http://XXXXXXXXXXXXXXXXXX"},
                {"type":"view","name":"奖品兑换","url":"http://XXXXXXXXXXXXXXXXXX"},
                {"type":"click","name":"赞一下我们","key":"BUTTON_ZAN"}]
            }
        ]
    }

    响应自定义菜单事件

        $wechatObj = new wechatCallbackAPI();
        if (isset($_GET["echostr"])) { 
            $wechatObj->valid(); 
        } else { 
            $wechatObj->responseMsg();
        }
    
    
        class wechatCallbackAPI {
    
            private $token = "WEIXIN";
    
            private $appId = "APPID";
    
            private $appSecret = "APPSECRET";
            
            private function checkSignature() {
                $signature = $_GET["signature"];
                $timestamp = $_GET["timestamp"];
                $nonce = $_GET["nonce"];    
                        
                $tmpArr = array($this->token, $timestamp, $nonce);
                sort($tmpArr);
                $tmpStr = implode($tmpArr);
                $tmpStr = sha1($tmpStr);
                
                if($tmpStr == $signature) {
                    return true;
                } else {
                    return false;
                }
            }
    
            private function getAccessToken() {
                $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
    
                $ch = curl_init($url);
                $curl_setopt($ch, CURLOPT_HEADER, 0);
                $curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                $curl_setopt($ch, CURLOPT_POST, 0);
                $curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                $curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    
                $output = curl_exec($ch);
                curl_close($ch);
                if (empty($output)) { return ""; }
    
                $result = json_decode($result);
                return $result->access_token;
            }
    
            public function valid() {
                $echoStr = $_GET["echostr"];
                
                //valid signature, option
                if($this->checkSignature()){
                    echo $echoStr;
                    exit;
                }
            }
        
            public function responseMsg() {
                //get post data, May be due to the different environments
                $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
                if (empty($postStr)){
                    echo "";
                    exit;
                }
    
                //extract post data
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $time = time();
    
                //文本消息模板
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";
                
                switch (strtolower(trim($postObj->MsgType))) {
                    case "text": //文本消息
                        $keyword = trim($postObj->Content);
                        if(!empty($keyword)) {
                            $msgType = "text";
                            $contentStr = "$fromUsername, 您发送了文本信息: $keyword ";
                            if (strtolower($keyword) == "time") {
                                $contentStr = date("Y-m-d H:i:s", $time);
                            }
                            $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        } else {
                            $resultStr = "Input something...";
                        }
                        break;
                    case "image": //图片消息
                        $msgType = "text";
                        $contentStr = "$fromUsername, 您发送了图片信息";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        break;
                    case "voice": //声音消息
                        $msgType = "text";
                        $contentStr = "$fromUsername, 您发送了声音信息";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        break;
                    case "video": //视频消息
                        $msgType = "text";
                        $contentStr = "$fromUsername, 您发送了视频信息";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        break;
                    case "location": //位置消息
                        $msgType = "text";
                        $contentStr = "$fromUsername, 您发送了位置信息";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        break;
                    case "link": //链接消息
                        $msgType = "text";
                        $contentStr = "$fromUsername, 您发送了链接信息";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        break;
                    case "event": //事件
                        switch (strtolower(trim($postObj->Event))) {
                            case "subscribe": //关注事件
                                $msgType = "text";
                                $contentStr = "欢迎您关注XXXXXXX";
                                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                break;
                            case "unsubscribe": //取消关注事件
                                break;
                            case "scan": //用户已关注时扫描二维码事件
                                $msgType = "text";
                                $contentStr = "$fromUsername, 您扫描了二维码";
                                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                break;
                            case "location": //上传地理位置事件
                                $msgType = "text";
                                $contentStr = "$fromUsername, 您上传地理位置";
                                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                break;
                            case "click": //自定义菜单事件
                                $msgType = "text";
                                $contentStr = "$fromUsername, 您点击了自定义菜单 $postObj->EventKey ";
                                if ("BUTTON_ZAN" == $postObj->EventKey) {
                                    $contentStr = "感谢您的赞,我们会继续提供更优质的服务。";
                                }
                                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                                ;
                                break;
                            default:
                                $resultStr = "";
                        }
                        break;
                    default:
                        $resultStr = "";
                }
                echo $resultStr;
            }
        }
    ?>

    自定义菜单查询

    使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构。

    请求说明

    http请求方式:GET
    https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN
    

    返回说明

    对应创建接口,正确的Json返回结果:
     {"menu":{"button":[{"name":"我的信息","sub_button":[{"type":"click","name":"拇指查询","key":"BUTTON_1","sub_button":[]},{"type":"click","name":"拇指请假","key":"BUTTON_2","sub_button":[]},{"type":"view","name":"工号绑定","url":"http:\/\/XXXXXXXX","sub_button":[]}]},{"type":"click","name":"业务流程","key":"BUTTON_3","sub_button":[]},{"name":"员工建议","sub_button":[{"type":"view","name":"思想火花","url":"http:\/\/XXXXXXXX","sub_button":[]},{"type":"view","name":"奖品兑换","url":"http:\/\/XXXXXXXX","sub_button":[]},{"type":"click","name":"赞一下我们","key":"BUTTON_ZAN","sub_button":[]}]}]}}


    自定义菜单删除

    使用接口创建自定义菜单后,开发者还可使用接口删除当前使用的自定义菜单。

    请求说明

    http请求方式:GET
    https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
    

    返回说明

    对应创建接口,正确的Json返回结果:
    {"errcode":0,"errmsg":"ok"}


    展开全文
  • 微信公众号自定义菜单创建及响应 一配置相关工具类: 1.证书信任管理器(用于https请求) package com.jcxx.saas.wxapi.CustomMenuUtil; import javax.net.ssl.X509TrustManager; import java.security.cert....
  • Java微信公众平台开发之自定义菜单

    千次阅读 2017-09-01 11:21:03
    一、自定义菜单的说明和...3)创建自定义菜单后,菜单的刷新策略是,在用户进入公众号会话页或公众号profile页时,如果发现上一次拉取菜单的请求在5分钟以前,就会拉取一下菜单,如果菜单有更新,就会刷新客户端的菜单
  • // // 响应用户消息 // 微信公众账号响应给用户的不同消息类型 // define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); if (!isset($_GET['echostr'])) { ... $wechatObj->v
  • 一、业务场景:点击订阅号菜单栏,跳转到一个页面,在页面中需要识别用户身份 二、背景: 有的认证订阅号有网页授权获取用户基本信息 有的认证订阅号没有网页授权获取用户基本信息 认证服务号是有这个接口权限的...
  • JAVA微信公众号开发之自定义菜单

    千次阅读 2019-05-06 16:07:46
    1、click:点击推事件用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;...
  • 微信5.0发布 2013年8月5日,伴随着微信5.0 iPhone版的发布,公众平台也进行了重要的更新,主要包括: 1)运营主体为组织,可选择成为服务号或者订阅号; 2)服务号可以申请自定义菜单; 3)使用QQ登录的公众号,...
  • 微信公众号开发教程(四)自定义菜单

    千次阅读 2018-06-22 14:19:09
    作者:陈惠,叩丁狼教育...菜单效果:打开开发文档,选择”自定义菜单”的”菜单创建接口”。注意: 1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多...
  • 以下是微信公众平台对 添加自定义菜单 的文档说明:1、自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 2、一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。 3、创建...
  • 自定义菜单创建接口: http请求方式:POST(请使用https协议)https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN 自定义菜单查询接口: http请求方式:GET...
  • 回复数据格式如下: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <.../CreateT...
  • 微信开发全局返回码说明

    千次阅读 2016-05-09 13:27:43
    微信开发全局返回码说明
  • 用户点击自定义菜单后,微信会把点击事件推送给开发者,请注意,点击菜单弹出子菜单,不会产生上报。请注意,第3个到第8个的所有事件,仅支持微信iPhone5.4.1以上版本,和Android5.4以上版本的微信用户,旧版本微信...
  • 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发...
  • 微信公众号开发(四)自定义菜单

    千次阅读 2019-05-22 09:23:26
    微信公众号开发(四)自定义菜单 1、说明 微信的自定义菜单分为普通菜单和个性化菜单,个性化菜单可以根据地区、性别、语言等为不同的用户展示不同的菜单,定义个性化菜单之前必须定义普通菜单,删除普通菜单则...
  • 注意,接口配置信息中,url为你服务器下验证token合法所在的地址的绝对路径,此处为hello/start在服务器下的绝对路径,token为一个约定的钥匙,服务器验证时,微信会用token加密一段字符串,它会把加密字符串用到的...
1 2 3 4 5 ... 20
收藏数 7,441
精华内容 2,976
关键字:

微信开发 点击菜单返回图片