微信公众平台消息接口开发(9)骑行西藏自定义菜单-程序员宅基地

技术标签: 操作系统  php  

 

 

 

最新教程,请访问:http://www.cnblogs.com/txw1958/p/weixin-58-custom-menu.html

 

 

 

 

 

1. 申请成为服务号(新申请订阅号无法开发申请菜单)

2. 申请自定义菜单,得到appid和appsecert

3. 用appid和appsecert获得access token
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

{"access_token":"N2L7KXa084WvelONYjkJ_traBMCCvy_UKmpUUzlrQ0EA2yNp3Iz6eSUrRG0bhaR_viswd50vDuPkY5nG43d1gbm-olT2KRMxOsVE08RfeD9lvK9lMguNG9kpIkKGZEjIf8Jv2m9fFhf8bnNa-yQH3g","expires_in":7200}

 
4. 将菜单组织成结构,通过post提交给接口

$xjson = '{
"button":[
{
"name":"天气预报",
"sub_button":[
{
"type":"click",
"name":"北京天气",
"key":"天气北京"
},
{
"type":"click",
"name":"上海天气",
"key":"天气上海"
},
{
"type":"click",
"name":"广州天气",
"key":"天气广州"
},
{
"type":"click",
"name":"深圳天气",
"key":"天气深圳"
},
{
"type":"view",
"name":"本地天气",
"url":"http://m.hao123.com/a/tianqi"
}]

},
{
"name":"休闲娱乐",
"sub_button":[
{
"type":"click",
"name":"移动电影",
"key":"电影"
},
{
"type":"click",
"name":"趣味游戏",
"key":"游戏"
},
{
"type":"click",
"name":"讲个笑话",
"key":"笑话"
}]
}]
}';

$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=p0tEu5tgSgQmZP4UKa1Bvd2Y9BL-03Uz2FXj2j-LX9hFuHt49ExIOyvKtNi4DWycl73Vs2SIsl1I6QqEpzyQpBNK2vRFHZKk1fS6HsXMWn522cvoOAhGX13aSj4zmoU5sQnX-FEpD36XwQJqw8IXkQ";
$result = vpost($url,$xjson);
var_dump($result);
 
function vpost($url,$data){ // 模拟提交数据函数
    $curl = curl_init(); // 启动一个CURL会话
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); // 模拟用户使用的浏览器
    // curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    // curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
    curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包x
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
    curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    $tmpInfo = curl_exec($curl); // 执行操作
    if (curl_errno($curl)) {
       echo 'Errno'.curl_error($curl);//捕抓异常
    }
    curl_close($curl); // 关闭CURL会话
    return $tmpInfo; // 返回数据
}

 


5. 在消息接口中处理event事件,其中的click代表菜单点击,通过响应菜单结构中的key值回应消息

private function receiveEvent($object)
    {
        $contentStr = "";
        switch ($object->Event)
        {
            case "subscribe":
                $contentStr[] = array("Title" =>"欢迎关注方倍工作室", "Description" =>"点击图片关注或者微信搜索方倍工作室", "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"weixin://addfriend/pondbaystudio");
            case "unsubscribe":
                $contentStr = "";
                break;
            case "CLICK":
                switch ($object->EventKey)
                {
                    case "company":
                        $contentStr[] = array("Title" =>"公司简介", "Description" =>"方倍工作室提供移动互联网相关的产品及服务,包括新浪微博应用、微信公众平台接口、手机版网站等", "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"weixin://addfriend/pondbaystudio");
                        break;
                    default:
                        $contentStr[] = array("Title" =>"默认菜单回复", "Description" =>"您正在使用的是方倍工作室的自定义菜单测试接口", "PicUrl" =>"http://discuz.comli.com/weixin/weather/icon/cartoon.jpg", "Url" =>"weixin://addfriend/pondbaystudio");
                        break;
                }
                break;
            default:
                $contentStr = "receive a new event: ".$object->Event;
                break;      

       }
        return $contentStr;
    }

 

 

 

.net代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=HI3brcIDTXHIxpDoxJfYSGd9Yx-OgQNlEmJ48I80SV8tD0zpCzA1yZ069E1GTjz6-3aAZHfrYHIZKdgsRvWlyv7OR5PJjrq3Zy-MgSyZ4Xhuvz2qJr3mjGmZ0cjYQ0kh";
            string param = "{\"button\":[{\"type\":\"click\",\"name\":\"今日歌曲\",\"key\":\"V1001_TODAY_MUSIC\"},{\"name\":\"菜单\",\"sub_button\":[{\"type\":\"click\",\"name\":\"helloword\",\"key\":\"V1001_HELLO_WORLD\"},{\"type\":\"click\",\"name\":\"赞一下我们\",\"key\":\"V1001_GOOD\"}]}]}";
            string result = postWebReq(url, param, Encoding.UTF8);
            
        }


        static string postWebReq(string postUrl, string paramData, Encoding dataEncode)
        {
            string ret = string.Empty;
            try
            {
                byte[] byteArray = dataEncode.GetBytes(paramData);
                HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
                webReq.Method = "POST";
                webReq.ContentType = "application/x-www-form-urlencoded";
                webReq.ContentLength = byteArray.Length;

                Stream newStream = webReq.GetRequestStream();
                newStream.Write(byteArray, 0, byteArray.Length);
                newStream.Close();

                HttpWebResponse reponse = (HttpWebResponse)webReq.GetResponse();
                StreamReader sr = new StreamReader(reponse.GetResponseStream(), Encoding.Default);
                ret = sr.ReadToEnd();
                
                sr.Close();
                reponse.Close();
                newStream.Close();


            }
            catch (Exception ex)
            {
                
            }
            return ret;
        }

    }
}

 

  

 

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34194379/article/details/85544342

智能推荐

2021-1-31: c语言中 %f 和 %lf 的区别_%if-程序员宅基地

文章浏览阅读3.4k次,点赞7次,收藏14次。%f和%lf分别是float类型和double类型用于格式化输入输出时对应的格式符号。其中:float,单精度浮点型,对应%f。double,双精度浮点型,对应%lf。在用于输出时:float类型可以使用%lf格式,但不会有任何好处。double类型如果使用了%f格式可能会导致输出错误。在用于输入时:double 类型使用了%f格式,会导致输入值错误。float类型使用double类型不仅会导致输入错误,还可能引起程序崩溃。所以在输入输出时,一定要区分好double和float,而使用对_%if

IDEA 使用Git图文详解_git idea-程序员宅基地

文章浏览阅读10w+次,点赞325次,收藏1.6k次。一、配置git路劲:或二、克隆项目或填写克隆路径及输出路径三、上传项目到git仓库 1、在你的idea里新建git仓库,这是新建本地仓库,等会会同步到线上git仓库 2、新建后如果文件名不是绿色的表示没有加入到git索引中 3、将需要上传的文件按照下图方式add 4、添加后,相应的文件名会变成绿色 5、然后commit项目,提交项目,这里是先提交带本地仓库 6、然后push到线上仓..._git idea

【数据结构】超详细讲解:算术表达式转化为后缀表达式、前缀表达式、表达式树的构建_算术表达式的后缀式怎么算-程序员宅基地

文章浏览阅读7.5k次,点赞24次,收藏58次。中缀表达式:中缀表达式是我们常见的数学表达式,其中运算符放置在两个操作数中间,例如:3 + 4 * 2。在中缀表达式中,还可以包含括号,用于改变运算符的优先级。后缀表达式:后缀表达式(也称为逆波兰表达式)是一种将运算符放置在操作数后面的表达式,例如:3 4 2 * 1 5 - 2 ^ / +。在后缀表达式中,所有操作符的优先级相同,而括号则不再需要。前缀表达式:前缀表达式(也称为波兰表达式)是一种将运算符放置在操作数前面的表达式,例如:+ / * 3 4 2 ^ - 1 5 2。_算术表达式的后缀式怎么算

对象存储minio、OSS、S3、ceph等迁移方案--rclone_minio开源协议变更-程序员宅基地

文章浏览阅读5.8k次。概述MinIO 是一个基于Apache License v2.0开源协议的对象存储服务,是一个非常轻量级的服务,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。运行在线上的minio由于业务需求的变更,可能面临迁移的问题:线上minio如何迁移至线下的minio或线下的minio如何迁移至线上minio? minio如何迁移至阿里云的oss或 Amazon S3 ? minio迁移如何至ceph?_minio开源协议变更

app和bootloader跳转函数硬件中断_jump2app函数进去硬件中断-程序员宅基地

文章浏览阅读1.9k次。1.不要把跳转函数放在中断中,如此导致在跳转后的app或者bootloder都是在中断状态,只要你一开启该中断,就可能出现硬件中断了2.如果你的APP使用了ucos系统,在跳转函数中还需要增加__set_CONTROL(0);//把psp修改成msp;这样是为了把ucos系统中的psp置回msp,否则容易出现硬件中断..._jump2app函数进去硬件中断

电机加减速S曲线算法 Sigmoid 函数-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏30次。1、Sigmoid函数原型2、sigmoid函数波形:由图形可看出在-10时已经接近于0,一般取值区间在[-5,5]。3、sigmoid函数的导数导数可用自身表示: 导数在x等于0时最大,。求导过程:转载4、Sigmoid函数应用到电机速度控制参数:电机加速控制,电机初...

随便推点

Ubuntu20.04解决应用中心打不开的问题_snap商店打不开-程序员宅基地

文章浏览阅读1.5w次,点赞9次,收藏76次。Ubuntu20.04软件中心打不开 尝试了很多方法 Ubuntu 20.04 默认把软件中心换成了 snap, 感觉 snap 应用老出状况, snap 应用不但体积大, 安装好的应用还不时就崩溃, 所以如果要把电脑里的所有 snap 应用全部替换了, snapd 也卸载了. 下面这三句可以有效的解决 sudo apt install ubuntu-software sudo sn..._snap商店打不开

C语言-数据结构-栈-实验报告_数据结构栈的应用实验报告-程序员宅基地

文章浏览阅读6.5k次,点赞8次,收藏70次。实验报告内容:一、实验目的、要求:(1)熟练掌握栈的特点(先进后出FILO)及基本操作,如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题背景下灵活应用。(2)编写适当的主函数和相关函数,使实验题目运行出正确结果。(3)当场编程、调试、编译。(4)程序具有一定的健壮性、可读性,尽量简洁。(5)程序运行完成后分别存盘,上交实验报告,要求写出实验体会二、实验内容:(1)实验题目(2)主要函数的算法设计思想(3)程序清单(3)测试数据、实验结果及结论(4)实验体会(实验中存在的_数据结构栈的应用实验报告

qRadioButton-程序员宅基地

文章浏览阅读384次。#ifndef TESTRADIOBUTTON_H#define TESTRADIOBUTTON_H#include #include "ui_testradiobutton.h"class testRadioButton : public QMainWindow{ Q_OBJECTpublic: testRadioButton(QWidget *paren_radiobutton

C# WinForm 封装自定义组件(控件)Dll_把winfrom用户自定义控件封装成dll-程序员宅基地

文章浏览阅读2w次,点赞6次,收藏22次。封装自定义控件很简单,没什么技术含量,这里通过封装自定义的数字文本框实例简单总结一下:【1】新建自定义控件库 -- Windows Forms Control Library【2】添加自定义组件 -- Component Class【3】继承TextBox,添加KeyPress事件,代码如下:using System;usi_把winfrom用户自定义控件封装成dll

mysql关闭slave_mysql 关闭slave-程序员宅基地

文章浏览阅读619次。mysql版本:5.6.14一、修改 my.cnf 文件,增加skip-slave-start参数即可[mysqld]#主从log-bin=mysql-binserver-id=148skip-slave-start二、重启mysql/etc/init.d/mysql restart三、验证slave是否启动mysql> SHOW SLAVE STATUS\G****************..._mysql disable slave

vue-router或者vue-admin-template中刷新跳转404的解决办法_vue admin 直接跳到404-程序员宅基地

文章浏览阅读5k次。vue或者vue-admin-template中任意页面刷新都跳转404vue在刷新的时候动态添加的router会清空,所以在动态添加的路由页面刷新的时候会因为清空的router而跳转到404.。在/src/premission.js的最下方router.afterEach修改成下面这样router.afterEach(to =>{ sessionStorage.setItem('r..._vue admin 直接跳到404