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;
}
}
?>







