이 글에서는 주로 PHP WeChat의 사용자 정의 메뉴 개발에 대해 자세히 설명합니다. 관심 있는 친구가 참고할 수 있습니다.
현재 WeChat 서비스 계정의 사용자 정의 메뉴에는 각각 최대 3개의 메뉴가 포함되어 있습니다. 각 1단계 메뉴에는 최대 5개의 2단계 메뉴가 포함되어 있습니다. 1단계 메뉴에는 최대 4개의 한자가 포함될 수 있으며, 2단계 메뉴에는 최대 7개의 한자가 포함될 수 있습니다. 추가 부분은 "..."으로 대체됩니다. WeChat 클라이언트 캐싱으로 인해 사용자 정의 메뉴를 생성한 후 WeChat 클라이언트가 해당 메뉴를 표시하는 데 24시간이 소요된다는 점에 유의하세요. 테스트하실 때 공개 계정을 언팔로우 하신 후 다시 팔로우를 해보시어 생성 후 효과를 확인하시는 것을 추천드립니다.
현재 사용자 정의 메뉴 인터페이스는 다음과 같이 두 가지 유형의 버튼을 구현할 수 있습니다.
클릭: 사용자가 클릭 유형 버튼을 클릭하면 WeChat 서버는 메시지를 통해 메시지 유형 이벤트 구조를 개발자에게 푸시합니다. 인터페이스(메시지 인터페이스 가이드 참조), 개발자가 사용자 정의된 키 값을 통해 사용자와 상호 작용할 수 있습니다.
사용자가 클릭한 후; 보기 유형 버튼을 누르면 WeChat 클라이언트가 열립니다. 개발자가 버튼에 입력한 URL 값(예: 웹 링크)은 웹 페이지를 여는 데 사용됩니다. 사용자의 기본 정보를 얻기 위해 이를 웹 페이지 인증 인터페이스와 결합하는 것이 좋습니다. 이용자의 로그인 개인정보를 취득하기 위한 정보입니다.
인터페이스 호출 요청 설명
요청 예시(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"}]
}
]
}
반환 결과 올바르면 반환된 JSON 데이터 패킷은 다음과 같습니다.
{"errcode":0,"errmsg":"ok"}반환된 JSON 데이터 잘못된 경우 패키지는 다음과 같습니다(예제는 잘못된 메뉴 이름 길이입니다):
{"errcode":40018,"errmsg":"invalid 버튼 이름 크기"}
다음은 샘플 코드(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>
{ "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":"My information","sub_button":[{"type":"click", "name":"썸 쿼리","key":"BUTTON_1","sub_button":[]},{"type":"클릭","name":"썸 떠나기","key":"BUTTON_2" ,"sub_button":[]},{"type":"view","name":"작업 ID 바인딩","url":"http://XXXXXXXX","sub_button":[]}]}, {" type":"click","name":"Business Process","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 요청 방법: GEThttps://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
해당 생성 인터페이스 , 올바른 Json 반환 결과: {"errcode":0,"errmsg":"ok"}
요약: 위 내용은 이 문서의 전체 내용입니다. 모든 사람의 학습에 도움이 되기를 바랍니다.
PHP 배열 추가 작업 및 array_merge
PHP의 call_user_func_array 콜백 함수 사용
위 내용은 PHP WeChat에서 맞춤형 메뉴 개발을 위한 방법 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!