Heim >Backend-Entwicklung >PHP-Tutorial >Teilen von Methoden zum Entwickeln benutzerdefinierter Menüs in PHP WeChat

Teilen von Methoden zum Entwickeln benutzerdefinierter Menüs in PHP WeChat

墨辰丷
墨辰丷Original
2018-06-01 14:37:371412Durchsuche

In diesem Artikel wird hauptsächlich die Entwicklung des benutzerdefinierten PHP-WeChat-Menüs ausführlich vorgestellt, das einen gewissen Referenzwert hat.

Derzeit umfasst das benutzerdefinierte Menü des WeChat-Dienstkontos jeweils bis zu 3 Ebenen Das Menü enthält bis zu 5 Menüs der zweiten Ebene. Das Menü der ersten Ebene kann bis zu 4 chinesische Zeichen enthalten, und das Menü der zweiten Ebene kann bis zu 7 chinesische Zeichen enthalten. Die zusätzlichen Teile werden durch „…“ ersetzt. Bitte beachten Sie, dass es nach dem Erstellen eines benutzerdefinierten Menüs aufgrund der Zwischenspeicherung des WeChat-Clients 24 Stunden dauert, bis der WeChat-Client es anzeigt. Es wird empfohlen, beim Testen zu versuchen, dem öffentlichen Konto nicht mehr zu folgen und ihm erneut zu folgen. Nach der Erstellung können Sie den Effekt sehen.

Derzeit kann die benutzerdefinierte Menüoberfläche zwei Arten von Schaltflächen implementieren, wie folgt:
Klicken: Nachdem der Benutzer auf die Schaltfläche „Klicktyp“ geklickt hat, wird der WeChat Der Server kommuniziert über die Nachrichtenschnittstelle. Senden Sie die Nachrichtentyp-Ereignisstruktur an den Entwickler (siehe Anleitung zur Nachrichtenschnittstelle) und geben Sie den vom Entwickler eingegebenen Schlüsselwert in die Schaltfläche ein. Der Entwickler kann mit dem Benutzer über den benutzerdefinierten Schlüssel interagieren Wert;
Ansicht:
Nachdem der Benutzer auf die Schaltfläche „Ansichtstyp“ geklickt hat, öffnet der WeChat-Client den vom Entwickler eingegebenen URL-Wert (d. h. Weblink). Die Schaltfläche zum Erreichen des Zwecks des Öffnens der Webseite wird empfohlen, die Webseite zu autorisieren, um die grundlegende Informationsschnittstelle des Benutzers zu erhalten und die persönlichen Anmeldeinformationen des Benutzers zu erhalten.

Beschreibung der Schnittstellenaufrufanforderunghttp-Anfragemethode: POST (bitte verwenden Sie das https-Protokoll) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
Beispiel anfordern (bitte UTF-8-Kodierung für JSON-Daten verwenden)

 {
 "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"}]
  }
 ]
}

Parameterbeschreibung

Ergebnis zurückgeben
JSON-Daten zurückgeben, wenn sie korrekt sind Das Paket lautet wie folgt:
{"errcode":0,"errmsg":"ok"}
Das zurückgegebene JSON-Datenpaket im Fehlerfall lautet wie folgt (ein Beispiel ist eine ungültige Länge des Menünamens):
{"errcode":40018 ,"errmsg": "ungültige Schaltflächennamengröße"}

Das Folgende ist Beispielcode (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[&#39;HTTP_USER_AGENT&#39;]);
  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>

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"}]
  }
 ]
}

Auf benutzerdefinierte Menüereignisse reagieren

 $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, &#39;SimpleXMLElement&#39;, 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;
  }
 }
?>

Benutzerdefinierte Menüabfrage

Verwenden Sie die Schnittstelle, um benutzerdefinierte Menüs zu erstellen Nach der Erstellung des Menüs können Entwickler über die Schnittstelle auch die Struktur des benutzerdefinierten Menüs abfragen.

Anweisungen anfordern
HTTP-Anforderungsmethode: GET
https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN

Anweisungen zurückgeben
Entspricht der Erstellungsschnittstelle und das korrekte Json-Rückgabeergebnis ist:

Code kopieren Der Code lautet wie folgt:

{"menu":{"button":[{"name":"Meine Informationen","sub_button" :[ {"type": "click", "name": "Daumenabfrage", "key": "BUTTON_1", "sub_button":[]},{"type": "click", "name": Daumen verlassen ","key="BUTTON_2",sub_button":[]},{"type"view",name"Arbeits-ID-Bindung",url"http://XXXXXXXX" , "sub_button":[]}]},{"type": "click", "name": "Geschäftsprozess", "key": "BUTTON_3", "sub_button": []}, {"name": „ Mitarbeitervorschläge“, „sub_button“:[{“type“: „view“, „name“: „Idea Spark“, „url“: „http://XXXXXXXX“, „sub_button“:[]},{“ Typ: „Ansicht“, „Name“: „Einlösung des Preises“, „URL“: „http://XXXXXXXX“, „sub_button“:[]}, {“Typ“: „Klicken“, „Name“: „ Like Let's“, „key“: „BUTTON_ZAN“, „sub_button“:[]}]}]}}

Benutzerdefiniertes Menü löschen

Verwenden Sie die Schnittstelle zum Erstellen Benutzerdefiniert Nach der Definition des Menüs können Entwickler über die Schnittstelle auch das aktuell verwendete benutzerdefinierte Menü löschen.

Anweisungen anfordern
http-Anfragemethode: GET
https://api.weixin.qq.com/cgi-bin/menu/delete ?access_token=ACCESS_TOKEN

Rückgabeanweisungen
entsprechend der Erstellungsschnittstelle, das korrekte Json-Rückgabeergebnis:
{"errcode":0," errmsg" :"ok"}

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:

PHP-Array-Additionsoperation und der Unterschied zu array_merge

Verwendung der Callback-Funktion call_user_func_array in PHP

Hinweise dazu, wie PHP die Curl-Funktion zum Senden von Post-Anfragen verwendet

Das obige ist der detaillierte Inhalt vonTeilen von Methoden zum Entwickeln benutzerdefinierter Menüs in PHP WeChat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn