php微信开发自定义菜单

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

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

接口调用请求说明

http请求方式:POST(请使用https协议) 请求示例(JSON数据请使用UTF-8编码)

参数说明

返回结果 正确时的返回JSON数据包如下: {"errcode":0,"errmsg":"ok"} 错误时的返回JSON数据包如下(示例为无效菜单名长度): {"errcode":40018,"errmsg":"invalid button name size"}

以下是示例代码(PHP)。

menu.json

响应自定义菜单事件

<div class="jb51code">
<pre class="brush:php;">
$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,0);
$curl_setopt($ch,1);
$curl_setopt($ch,FALSE);
$curl_setopt($ch,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 = "

%s 0 ";

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,$contentStr);
break;
case "voice": //声音消息
$msgType = "text";
$contentStr = "$fromUsername,您发送了声音信息";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "video": //视频消息
$msgType = "text";
$contentStr = "$fromUsername,您发送了视频信息";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "location": //位置消息
$msgType = "text";
$contentStr = "$fromUsername,您发送了位置信息";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "link": //链接消息
$msgType = "text";
$contentStr = "$fromUsername,您发送了链接信息";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "event": //事件
switch (strtolower(trim($postObj->Event))) {
case "subscribe": //关注事件
$msgType = "text";
$contentStr = "欢迎您关注XXXXXXX";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "unsubscribe": //取消关注事件
break;
case "scan": //用户已关注时扫描二维码事件
$msgType = "text";
$contentStr = "$fromUsername,您扫描了二维码";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "location": //上传地理位置事件
$msgType = "text";
$contentStr = "$fromUsername,您上传地理位置";
$resultStr = sprintf($textTpl,$contentStr);
break;
case "click": //自定义菜单事件
$msgType = "text";
$contentStr = "$fromUsername,您点击了自定义菜单 $postObj->EventKey ";
if ("BUTTON_ZAN" == $postObj->EventKey) {
$contentStr = "感谢您的赞,我们会继续提供更优质的服务。";
}
$resultStr = sprintf($textTpl,$contentStr);
;
break;
default:
$resultStr = "";
}
break;
default:
$resultStr = "";
}
echo $resultStr;
}
}
?>

自定义菜单查询

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

请求说明 http请求方式:GET

返回说明 对应创建接口,正确的Json返回结果:

代码如下:

自定义菜单删除

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

请求说明 http请求方式:GET nofollow" target="_blank" href="https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN">https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...