微信公众平台开发自定义菜单的教程
Token: weixin
程序实现如下
$appid = "";
$appsecret = "";
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$appsecret";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
$jsoninfo = json_decode($output, true);
$access_token = $jsoninfo["access_token"];
你也可以直接在浏览器地址栏中,拼接出地址,执行后,获得如下数据
{"access_token":"N2L7KXa084WvelONYjkJ_traBMCCvy_UKmpUUzlrQ0EA2yNp3Iz6eSUrRG0bhaR_viswd50vDuPkY5nG43d1gbm-olT2KRMxOsVE08RfeD9lvK9lMguNG9kpIkKGZEjIf8Jv2m9fFhf8bnNa-yQH3g","expires_in":7200}
参数说明如下
代码如下 | 复制代码 |
N2L7KXa084WvelONYjkJ_traBMCCvy_UKmpUUzlrQ0EA2yNp3Iz6eSUrRG0bhaR_viswd50vDuPkY5nG43d1gbm-olT2KRMxOsVE08RfeD9lvK9lMguNG9kpIkKGZEjIf8Jv2m9fFhf8bnNa-yQH3g
|
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
view:
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
请求示例
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"view",
"name":"视频",
"url":"http://v.qq.com/"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
参数说明
返回结果
正确时的返回JSON数据包如下:
{“errcode”:0,”errmsg”:”ok”}
错误时的返回JSON数据包如下(示例为无效菜单名长度):
{“errcode”:40018,”errmsg”:”invalid button name size”}
六、提交菜单内容给服务器
菜单的JSON结构为
1
{"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":"company"},{"type":"click","name":"趣味游戏","key":"游戏"},{"type":"click","name":"讲个笑话","key":"笑话"}]}]}
将以下代码保存为menu.php,并且在浏览器中运行该文件(比如 http://127.0.0.1/menu.php),将直接向微信服务器提交菜单,
< ?php
$access_token = "";
$jsonmenu = '{
"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":"company"
},
{
"type":"click",
"name":"趣味游戏",
"key":"游戏"
},
{
"type":"click",
"name":"讲个笑话",
"key":"笑话"
}]
}]
}';
$url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$access_token;
$result = https_request($url, $jsonmenu);
var_dump($result);
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);
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;
}
?>
或者使用官方的调试接口 使用网页调试工具调试该接口
一、函数主要了addslashes 方法
addslashes() 函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
•单引号 (')
•双引号 (")
•反斜杠 (\)
•NULL
二、array_map 说明
array_map() 函数返回用户自定义函数作用后的数组。回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
如果传递进来的参数 是数组形式则使用array_map方法进行参数的转义。
我们在开发对于$_GET,$_POST等变量
代码如下 | 复制代码 |
/** |
如果是数组将无法完成安全转义了,下面整理了一个例子,大家来看看
方法三,可以参考该递归方法实现其他功能,代码如下:
代码如下 | 复制代码 |
<?php Array ) ) |
原理是非常的简单,就是把数据利用foreach遍历一个个数组值进行操作了。
检测字符串编码可以有很多种方法,如利用ord获得字符的进制然后进入判断,或利用mb_detect_encoding函数来处理,下面整理了几种方法。
例子1
代码如下 | 复制代码 |
/** * 检测字符串是否为UTF8编码 * @param string $str 被检测的字符串 * @return boolean */ function is_utf8($str){ $len = strlen($str); for($i = 0; $i < $len; $i++){ $c = ord($str[$i]); if ($c > 128) { if (($c > 247)) return false; elseif ($c > 239) $bytes = 4; elseif ($c > 223) $bytes = 3; elseif ($c > 191) $bytes = 2; else return false; if (($i + $bytes) > $len) return false; while ($bytes > 1) { $i++; $b = ord($str[$i]); if ($b < 128 || $b > 191) return false; $bytes--; } } } return true; } |
例子2
代码如下 | 复制代码 |
function is_utf8($string) { return preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] # ASCII | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )*$%xs', $string); } |
准确率基本和mb_detect_encoding()一样,要对一起对,要错一起错。
编码检测不可能100%准确,这个东西已经可以基本满足要求了。
例子3
代码如下 | 复制代码 |
function mb_is_utf8($string) |
例子4
代码如下 | 复制代码 |
// Returns true if $string is valid UTF-8 and false otherwise. |
方法一(返回的是json字符串格式):
代码如下 | 复制代码 |
/** * Curl版本 * 使用方法: * $post_string = "app=request&version=beta"; * request_by_curl('http://facebook.cn/restServer.php',$post_string); */ function actionPost($url,$data){ // 模拟提交数据函数 $curl = curl_init(); // 启动一个CURL会话 curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器 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提交的数据包 curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); // 读取上面所储存的Cookie信息 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; // 返回数据 } |
方法二(返回的是json字符串格式):
代码如下 | 复制代码 |
function actionCurl($remote_server, $post_string){ $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL,$remote_server); //为了支持cookie curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); $result = curl_exec($ch); return $result; } |
大家都知道define是定义常量的,如果在类中定义常量呢?当然不能用define,而用const,如下例:
代码如下 | 复制代码 |
<?php define('PHP', 'I love PHP'); // 在类外面通常这样定义常量 if (defined('PHP')) { echo 'PHP is defined!'; } class MyClass { // 常量的值将始终保持不变。在定义和使用常量的时候不需要使用$符号 const CONSTANT = 'constant value'; function showConstant() { echo self::CONSTANT . '<br/>'; } } echo MyClass::CONSTANT . '<br/>'; $classname = 'MyClass'; echo $classname::CONSTANT . '<br/>'; // PHP 5.3.0 之后 $class = new MyClass(); $class->showConstant(); echo $class::CONSTANT.'<br/>'; // PHP 5.3.0 之后 print_r(get_defined_constants()); // 可以用get_defined_constants()获取所有定义的常量 |
一般是define在类外定义常量,const在类内定义常量,并且const必须通过类名::变量名来进行访问。但是php5.3以上支持类外通过const定义常量,看如下,这样是ok的:
代码如下 | 复制代码 |
const PHP_N = 'use const defined PHP'; echo PHP_N; if (defined('PHP_N')) { echo 'PHP_N is defined!'; } |
常量一般采用大写单词与下划线间隔的方式命名,常量必须通过 const 定义为类的成员,强烈不鼓励使用 define定义的全局常量。
关于常量的基础知识,这里不说了,除了以上,define和const的其它区别
1.const不能再条件语句中定义常量,但是define是可以的,如下:
代码如下 | 复制代码 |
<?php if (1) { const A = 'php'; } echo A; // 必错 |
2.const采用一个普通的常量名称,define可以采用表达式作为名称
代码如下 | 复制代码 |
<?php |
3.const只能接受静态的标量,而define可以采用任何表达式。
代码如下 | 复制代码 |
<?php const PHP = 1 << 5; // 错误 define('JAVA', 1 << 5); // 正确 4.const本身就是一个语言结构。而define是一个函数。所以使用const速度要快的多。 |
常量的命名规范:
常量包含数字字母字符和下划线,数字允许作为常量名
采用大写单词与下划线间隔的方式,例如可以这样 EMBED_SUPPRESS_EMBED_EXCEPTION 但不许这样 EMBED_SUPPRESSEMBEDEXCEPTION
通常使用常量所在的包名或者是类名作为前缀。比如,对于Bug类中常量应该以BUG_开始
常量必须通过 “const” 定义为类的成员,强烈不鼓励使用 “define” 定义的全局常量
相关文章
- 微信公众平台实现微信网页登陆授权开发其实是非常的简单了,因为官方的参考程序了,下面小编就看了一站长根据官方参考做的一个网页登陆授权例子,大家可看看。 文件1:in...2016-11-25
- 这篇文章主要介绍了PHP Curl模拟登录微信公众平台、新浪微博实例代码的相关资料,涉及到php curl模拟登录相关知识,需要的朋友可以参考下...2016-02-01
- 微信公众平开发时碰到回复中文乱码了,这个问题小编发现是编码问题,其实只要把编码转成utf8就可以解决了,具体来看看。 很多微信公众平台的自动回复程序都是 ThinkWec...2016-11-25
- 自定义菜单可以在后台设置但如果你使用了开发者之后那么后台的自定义菜单功能就失效了,必须通过程序来创建了,下面一起来看一个简单的通过php创建自定义菜单的例子。...2016-11-25
- 微信公众平台服务号可申请自定义菜单了,其它的号暂时不支持自定义菜单了,这个不但可以使用api来操作,还可以直接在后台定义菜单与参数哦。 申请自定义菜单 服务号可...2016-11-25
- 微信公众平台开发我们现在做得比较多了,下面给各位介绍的是一个入门级别的微信公众平台验证基础知识了,有兴趣的和小编来看看。 开发微信的时候 需要验证一下 。...2016-11-25
- 最近在模拟登录的时候愈发的出现登录失败的情况,原因是:微信公众平台登录如果时不时的会对一些异常帐号要求输入验证码才可以登录 这个时候平台首页的登录逻辑就会...2016-11-25
- 要对微信公众平台进行开发,首先需要成为开发者,可以到https://mp.weixin.qq.com/注册一个帐号,然后按要求填写相关信息即可。 有了公众号后,在公众平台的高级功能里选...2016-11-25
- 这篇文章主要为大家详细解析了微信公众平台开发之自定义菜单.Net代码,感兴趣的小伙伴们可以参考一下...2021-09-22
- 微信公众平台服务号开放了自定义菜单API,本案例介绍C#开发微信公众号自定义菜单功能。在此基础上可以开发更完善的自定义菜单管理功能...2020-06-25
- 其实这种发送邮件是非常的简单了我们只要接受由用户提交过来的邮箱地址然后再由php的邮件控制进行邮件发送了,下面看一个综合开发例子。 首先yyuc框架是支持发送em...2016-11-25
- 微信公众平台现在有许多的api接口了我们可以利用微信公众平台来实现许多的一些功能,下面来看一个php版本的微信公众平台开发实例。 最近在做微信公众平台开发,一口...2016-11-25
- 用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑 下面是一个微信公众平台关注和取消关注的...2016-11-25
wordpress主题支持自定义菜单及修改css样式实现方法
使用wordpress过程中会遇到主题支持自定义菜单以及修改css样式问题,本文将介绍详细解决方法,需要朋友可以参考下...2020-06-30- 这篇文章主要为大家详细介绍了微信自定义菜单的创建查询取消php示例代码,感兴趣的小伙伴们可以参考一下...2016-08-27
- 下面我们一起来看看关于微信公众平台网页获取用户OpenID方法,有需要了解的朋友可以一起来看看吧. 用户点击微信自定义菜单view类型按钮后,微信客户端将会打开开发者...2016-11-25
- 在微信公众平台中,有一个接收普通消息的接口,关注公众号之后,每回复一条信息,都会post到开发中心填写的地址上面去。 接收普通消息在官方开发文档中截图如下: 上面的...2016-05-19
- 本文章来给各位同学介绍一下关于微信公众平台之CURL应用实例,如果你碰到此类问题不防进入参考一下吧。 这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支...2016-11-25
- 现在使用微信公众平台的商家越来越多了,微信公众平台为我提供了大量api接口他可以实现与我们网站数据对接,然后用户输入内容自动回复相关信息,下面我来介绍微信公众平台...2016-11-25
- 微信公众平台开发自定义菜单功能打开非常的简单只需要在微信网站后台进行一些简单的设置即可,具体来给各位演示一下。 一、自定义菜单概述 自定义菜单能够帮助公众...2016-11-25