PHP使用Face++接口开发微信公众平台人脸识别系统的方法

5年以前  |  阅读数:216 次  |  编程语言:PHP 

本文实例讲述了PHP使用Face++接口开发微信公众平台人脸识别系统的方法。分享给大家供大家参考。具体如下:

效果图如下:

具体步骤如下:

首先,先登录Face++的官网注册账号:官网链接
注册之后会获取到api_secret和api_key,这些在调用接口的时候需要用到。
然后接下来的就是使用PHP脚本调用API了。
在使用PHP开发微信公共平台的时候,推荐使用Github上的一款不错的框架:wechat-php-sdk
对于微信的常用接口做了一些封装,核心文件wechat.class.php如下:


    <?php 
    /** 
     * 微信公众平台PHP-SDK, 官方API部分 
     * @author dodge <dodgepudding@gmail.com> 
     * @link https://github.com/dodgepudding/wechat-php-sdk 
     * @version 1.2 
     * usage: 
     *  $options = array( 
     *     'token'=>'tokenaccesskey', //填写你设定的key 
     *     'appid'=>'wxdk1234567890', //填写高级调用功能的app id 
     *     'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填写高级调用功能的密钥 
     *   ); 
     *  $weObj = new Wechat($options); 
     *  $weObj->valid(); 
     *  $type = $weObj->getRev()->getRevType(); 
     *  switch($type) { 
     *     case Wechat::MSGTYPE_TEXT: 
     *       $weObj->text("hello, I'm wechat")->reply(); 
     *       exit; 
     *       break; 
     *     case Wechat::MSGTYPE_EVENT: 
     *       .... 
     *       break; 
     *     case Wechat::MSGTYPE_IMAGE: 
     *       ... 
     *       break; 
     *     default: 
     *       $weObj->text("help info")->reply(); 
     *  } 
     *  //获取菜单操作: 
     *  $menu = $weObj->getMenu(); 
     *  //设置菜单 
     *  $newmenu = array( 
     *     "button"=> 
     *       array( 
     *         array('type'=>'click','name'=>'最新消息','key'=>'MENU_KEY_NEWS'), 
     *         array('type'=>'view','name'=>'我要搜索','url'=>'http://www.baidu.com'), 
     *         ) 
     *     ); 
     *  $result = $weObj->createMenu($newmenu); 
     */ 
    class Wechat 
    { 
      const MSGTYPE_TEXT = 'text'; 
      const MSGTYPE_IMAGE = 'image'; 
      const MSGTYPE_LOCATION = 'location'; 
      const MSGTYPE_LINK = 'link'; 
      const MSGTYPE_EVENT = 'event'; 
      const MSGTYPE_MUSIC = 'music'; 
      const MSGTYPE_NEWS = 'news'; 
      const MSGTYPE_VOICE = 'voice'; 
      const MSGTYPE_VIDEO = 'video'; 
      const API_URL_PREFIX = 'https://api.weixin.qq.com/cgi-bin'; 
      const AUTH_URL = '/token?grant_type=client_credential&'; 
      const MENU_CREATE_URL = '/menu/create?'; 
      const MENU_GET_URL = '/menu/get?'; 
      const MENU_DELETE_URL = '/menu/delete?'; 
      const MEDIA_GET_URL = '/media/get?'; 
      const QRCODE_CREATE_URL='/qrcode/create?'; 
      const QR_SCENE = 0; 
      const QR_LIMIT_SCENE = 1; 
      const QRCODE_IMG_URL='https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='; 
      const USER_GET_URL='/user/get?'; 
      const USER_INFO_URL='/user/info?'; 
      const GROUP_GET_URL='/groups/get?'; 
      const GROUP_CREATE_URL='/groups/create?'; 
      const GROUP_UPDATE_URL='/groups/update?'; 
      const GROUP_MEMBER_UPDATE_URL='/groups/members/update?'; 
      const CUSTOM_SEND_URL='/message/custom/send?'; 
      const OAUTH_PREFIX = 'https://open.weixin.qq.com/connect/oauth2'; 
      const OAUTH_AUTHORIZE_URL = '/authorize?'; 
      const OAUTH_TOKEN_PREFIX = 'https://api.weixin.qq.com/sns/oauth2'; 
      const OAUTH_TOKEN_URL = '/access_token?'; 
      const OAUTH_REFRESH_URL = '/refresh_token?'; 
      const OAUTH_USERINFO_URL = 'https://api.weixin.qq.com/sns/userinfo?'; 
      private $token; 
      private $appid; 
      private $appsecret; 
      private $access_token; 
      private $user_token; 
      private $_msg; 
      private $_funcflag = false; 
      private $_receive; 
      public $debug = false; 
      public $errCode = 40001; 
      public $errMsg = "no access"; 
      private $_logcallback; 
      public function __construct($options) 
      { 
        $this->token = isset($options['token'])?$options['token']:''; 
        $this->appid = isset($options['appid'])?$options['appid']:''; 
        $this->appsecret = isset($options['appsecret'])?$options['appsecret']:''; 
        $this->debug = isset($options['debug'])?$options['debug']:false; 
        $this->_logcallback = isset($options['logcallback'])?$options['logcallback']:false; 
      } 
      /** 
       * For weixin server validation 
       */  
      private function checkSignature() 
      { 
        $signature = isset($_GET["signature"])?$_GET["signature"]:''; 
        $timestamp = isset($_GET["timestamp"])?$_GET["timestamp"]:''; 
        $nonce = isset($_GET["nonce"])?$_GET["nonce"]:''; 
        $token = $this->token; 
        $tmpArr = array($token, $timestamp, $nonce); 
        sort($tmpArr, SORT_STRING); 
        $tmpStr = implode( $tmpArr ); 
        $tmpStr = sha1( $tmpStr ); 
        if( $tmpStr == $signature ){ 
          return true; 
        }else{ 
          return false; 
        } 
      } 
      /** 
       * For weixin server validation 
       * @param bool $return 是否返回 
       */ 
      public function valid($return=false) 
      { 
        $echoStr = isset($_GET["echostr"]) ? $_GET["echostr"]: ''; 
        if ($return) { 
            if ($echoStr) { 
              if ($this->checkSignature())  
                return $echoStr; 
              else 
                return false; 
            } else  
              return $this->checkSignature(); 
        } else { 
            if ($echoStr) { 
              if ($this->checkSignature()) 
                die($echoStr); 
              else  
                die('no access'); 
            } else { 
              if ($this->checkSignature()) 
                return true; 
              else 
                die('no access'); 
            } 
        } 
        return false; 
      } 
      /** 
       * 设置发送消息 
       * @param array $msg 消息数组 
       * @param bool $append 是否在原消息数组追加 
       */ 
      public function Message($msg = '',$append = false){ 
          if (is_null($msg)) { 
            $this->_msg =array(); 
          }elseif (is_array($msg)) { 
            if ($append) 
              $this->_msg = array_merge($this->_msg,$msg); 
            else 
              $this->_msg = $msg; 
            return $this->_msg; 
          } else { 
            return $this->_msg; 
          } 
      } 
      public function setFuncFlag($flag) { 
          $this->_funcflag = $flag; 
          return $this; 
      } 
      private function log($log){ 
          if ($this->debug && function_exists($this->_logcallback)) { 
            if (is_array($log)) $log = print_r($log,true); 
            return call_user_func($this->_logcallback,$log); 
          } 
      } 
      /** 
       * 获取微信服务器发来的信息 
       */ 
      public function getRev() 
      { 
        if ($this->_receive) return $this; 
        $postStr = file_get_contents("php://input"); 
        $this->log($postStr); 
        if (!empty($postStr)) { 
          $this->_receive = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); 
        } 
        return $this; 
      } 
      /** 
       * 获取微信服务器发来的信息 
       */ 
      public function getRevData() 
      { 
        return $this->_receive; 
      } 
      /** 
       * 获取消息发送者 
       */ 
      public function getRevFrom() { 
        if (isset($this->_receive['FromUserName'])) 
          return $this->_receive['FromUserName']; 
        else  
          return false; 
      } 
      /** 
       * 获取消息接受者 
       */ 
      public function getRevTo() { 
        if (isset($this->_receive['ToUserName'])) 
          return $this->_receive['ToUserName']; 
        else  
          return false; 
      } 
      /** 
       * 获取接收消息的类型 
       */ 
      public function getRevType() { 
        if (isset($this->_receive['MsgType'])) 
          return $this->_receive['MsgType']; 
        else  
          return false; 
      } 
      /** 
       * 获取消息ID 
       */ 
      public function getRevID() { 
        if (isset($this->_receive['MsgId'])) 
          return $this->_receive['MsgId']; 
        else  
          return false; 
      } 
      /** 
       * 获取消息发送时间 
       */ 
      public function getRevCtime() { 
        if (isset($this->_receive['CreateTime'])) 
          return $this->_receive['CreateTime']; 
        else  
          return false; 
      } 
      /** 
       * 获取接收消息内容正文 
       */ 
      public function getRevContent(){ 
        if (isset($this->_receive['Content'])) 
          return $this->_receive['Content']; 
        else if (isset($this->_receive['Recognition'])) //获取语音识别文字内容,需申请开通 
          return $this->_receive['Recognition']; 
        else 
          return false; 
      } 
      /** 
       * 获取接收消息图片 
       */ 
      public function getRevPic(){ 
        if (isset($this->_receive['PicUrl'])) 
          return $this->_receive['PicUrl']; 
        else  
          return false; 
      } 
      /** 
       * 获取接收消息链接 
       */ 
      public function getRevLink(){ 
        if (isset($this->_receive['Url'])){ 
          return array( 
            'url'=>$this->_receive['Url'], 
            'title'=>$this->_receive['Title'], 
            'description'=>$this->_receive['Description'] 
          ); 
        } else  
          return false; 
      } 
      /** 
       * 获取接收地理位置 
       */ 
      public function getRevGeo(){ 
        if (isset($this->_receive['Location_X'])){ 
          return array( 
            'x'=>$this->_receive['Location_X'], 
            'y'=>$this->_receive['Location_Y'], 
            'scale'=>$this->_receive['Scale'], 
            'label'=>$this->_receive['Label'] 
          ); 
        } else  
          return false; 
      } 
      /** 
       * 获取接收事件推送 
       */ 
      public function getRevEvent(){ 
        if (isset($this->_receive['Event'])){ 
          return array( 
            'event'=>$this->_receive['Event'], 
            'key'=>$this->_receive['EventKey'], 
          ); 
        } else  
          return false; 
      } 
      /** 
       * 获取接收语言推送 
       */ 
      public function getRevVoice(){ 
        if (isset($this->_receive['MediaId'])){ 
          return array( 
            'mediaid'=>$this->_receive['MediaId'], 
            'format'=>$this->_receive['Format'], 
          ); 
        } else  
          return false; 
      } 
      /** 
       * 获取接收视频推送 
       */ 
      public function getRevVideo(){ 
        if (isset($this->_receive['MediaId'])){ 
          return array( 
              'mediaid'=>$this->_receive['MediaId'], 
              'thumbmediaid'=>$this->_receive['ThumbMediaId'] 
          ); 
        } else 
          return false; 
      } 
      /** 
       * 获取接收TICKET 
       */ 
      public function getRevTicket(){ 
      if (isset($this->_receive['Ticket'])){ 
        return $this->_receive['Ticket']; 
      } else 
        return false; 
      } 
      /** 
       * 获取二维码的场景值 
       */ 
      public function getRevSceneId (){ 
        if (isset($this->_receive['EventKey'])){ 
          return str_replace('qrscene_','',$this->_receive['EventKey']); 
        } else{ 
          return false; 
        } 
      } 
      public static function xmlSafeStr($str) 
      {   
        return '<![CDATA['.preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/",'',$str).']]>';   
      }  
      /** 
       * 数据XML编码 
       * @param mixed $data 数据 
       * @return string 
       */ 
      public static function data_to_xml($data) { 
        $xml = ''; 
        foreach ($data as $key => $val) { 
          is_numeric($key) && $key = "item id=\"$key\""; 
          $xml  .= "<$key>"; 
          $xml  .= ( is_array($val) || is_object($val)) ? self::data_to_xml($val) : self::xmlSafeStr($val); 
          list($key, ) = explode(' ', $key); 
          $xml  .= "</$key>"; 
        } 
        return $xml; 
      }   
      /** 
       * XML编码 
       * @param mixed $data 数据 
       * @param string $root 根节点名 
       * @param string $item 数字索引的子节点名 
       * @param string $attr 根节点属性 
       * @param string $id  数字索引子节点key转换的属性名 
       * @param string $encoding 数据编码 
       * @return string 
      */ 
      public function xml_encode($data, $root='xml', $item='item', $attr='', $id='id', $encoding='utf-8') { 
        if(is_array($attr)){ 
          $_attr = array(); 
          foreach ($attr as $key => $value) { 
            $_attr[] = "{$key}=\"{$value}\""; 
          } 
          $attr = implode(' ', $_attr); 
        } 
        $attr  = trim($attr); 
        $attr  = empty($attr) ? '' : " {$attr}"; 
        $xml  = "<{$root}{$attr}>"; 
        $xml  .= self::data_to_xml($data, $item, $id); 
        $xml  .= "</{$root}>"; 
        return $xml; 
      } 
      /** 
       * 设置回复消息 
       * Examle: $obj->text('hello')->reply(); 
       * @param string $text 
       */ 
      public function text($text='') 
      { 
        $FuncFlag = $this->_funcflag ? 1 : 0; 
        $msg = array( 
          'ToUserName' => $this->getRevFrom(), 
          'FromUserName'=>$this->getRevTo(), 
          'MsgType'=>self::MSGTYPE_TEXT, 
          'Content'=>$text, 
          'CreateTime'=>time(), 
          'FuncFlag'=>$FuncFlag 
        ); 
        $this->Message($msg); 
        return $this; 
      } 
      /** 
       * 设置回复音乐 
       * @param string $title 
       * @param string $desc 
       * @param string $musicurl 
       * @param string $hgmusicurl 
       */ 
      public function music($title,$desc,$musicurl,$hgmusicurl='') { 
        $FuncFlag = $this->_funcflag ? 1 : 0; 
        $msg = array( 
          'ToUserName' => $this->getRevFrom(), 
          'FromUserName'=>$this->getRevTo(), 
          'CreateTime'=>time(), 
          'MsgType'=>self::MSGTYPE_MUSIC, 
          'Music'=>array( 
            'Title'=>$title, 
            'Description'=>$desc, 
            'MusicUrl'=>$musicurl, 
            'HQMusicUrl'=>$hgmusicurl 
          ), 
          'FuncFlag'=>$FuncFlag 
        ); 
        $this->Message($msg); 
        return $this; 
      } 
      /** 
       * 设置回复图文 
       * @param array $newsData 
       * 数组结构: 
       * array( 
       *   [0]=>array( 
       *     'Title'=>'msg title', 
       *     'Description'=>'summary text', 
       *     'PicUrl'=>'http://www.domain.com/1.jpg', 
       *     'Url'=>'http://www.domain.com/1.html' 
       *   ), 
       *   [1]=>.... 
       * ) 
       */ 
      public function news($newsData=array()) 
      { 
        $FuncFlag = $this->_funcflag ? 1 : 0; 
        $count = count($newsData); 
        $msg = array( 
          'ToUserName' => $this->getRevFrom(), 
          'FromUserName'=>$this->getRevTo(), 
          'MsgType'=>self::MSGTYPE_NEWS, 
          'CreateTime'=>time(), 
          'ArticleCount'=>$count, 
          'Articles'=>$newsData, 
          'FuncFlag'=>$FuncFlag 
        ); 
        $this->Message($msg); 
        return $this; 
      } 
      /** 
       * 
       * 回复微信服务器, 此函数支持链式操作 
       * @example $this->text('msg tips')->reply(); 
       * @param string $msg 要发送的信息, 默认取$this->_msg 
       * @param bool $return 是否返回信息而不抛出到浏览器 默认:否 
       */ 
      public function reply($msg=array(),$return = false) 
      { 
        if (empty($msg))  
          $msg = $this->_msg; 
        $xmldata= $this->xml_encode($msg); 
        $this->log($xmldata); 
        if ($return) 
          return $xmldata; 
        else 
          echo $xmldata; 
      } 

      /** 
       * GET 请求 
       * @param string $url 
       */ 
      private function http_get($url){ 
        $oCurl = curl_init(); 
        if(stripos($url,"https://")!==FALSE){ 
          curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); 
          curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE); 
        } 
        curl_setopt($oCurl, CURLOPT_URL, $url); 
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); 
        $sContent = curl_exec($oCurl); 
        $aStatus = curl_getinfo($oCurl); 
        curl_close($oCurl); 
        if(intval($aStatus["http_code"])==200){ 
          return $sContent; 
        }else{ 
          return false; 
        } 
      } 
      /** 
       * POST 请求 
       * @param string $url 
       * @param array $param 
       * @return string content 
       */ 
      private function http_post($url,$param){ 
        $oCurl = curl_init(); 
        if(stripos($url,"https://")!==FALSE){ 
          curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE); 
          curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false); 
        } 
        if (is_string($param)) { 
          $strPOST = $param; 
        } else { 
          $aPOST = array(); 
          foreach($param as $key=>$val){ 
            $aPOST[] = $key."=".urlencode($val); 
          } 
          $strPOST = join("&", $aPOST); 
        } 
        curl_setopt($oCurl, CURLOPT_URL, $url); 
        curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 ); 
        curl_setopt($oCurl, CURLOPT_POST,true); 
        curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST); 
        $sContent = curl_exec($oCurl); 
        $aStatus = curl_getinfo($oCurl); 
        curl_close($oCurl); 
        if(intval($aStatus["http_code"])==200){ 
          return $sContent; 
        }else{ 
          return false; 
        } 
      } 
      /** 
       * 通用auth验证方法,暂时仅用于菜单更新操作 
       * @param string $appid 
       * @param string $appsecret 
       */ 
      public function checkAuth($appid='',$appsecret=''){ 
        if (!$appid || !$appsecret) { 
          $appid = $this->appid; 
          $appsecret = $this->appsecret; 
        } 
        //TODO: get the cache access_token 
        $result = $this->http_get(self::API_URL_PREFIX.self::AUTH_URL.'appid='.$appid.'&secret;='.$appsecret); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          $this->access_token = $json['access_token']; 
          $expire = $json['expires_in'] ? intval($json['expires_in'])-100 : 3600; 
          //TODO: cache access_token 
          return $this->access_token; 
        } 
        return false; 
      } 
      /** 
       * 删除验证数据 
       * @param string $appid 
       */ 
      public function resetAuth($appid=''){ 
        $this->access_token = ''; 
        //TODO: remove cache 
        return true; 
      } 
      /** 
       * 微信api不支持中文转义的json结构 
       * @param array $arr 
       */ 
      static function json_encode($arr) { 
        $parts = array (); 
        $is_list = false; 
        //Find out if the given array is a numerical array 
        $keys = array_keys ( $arr ); 
        $max_length = count ( $arr ) - 1; 
        if (($keys [0] === 0) && ($keys [$max_length] === $max_length )) { //See if the first key is 0 and last key is length - 1 
          $is_list = true; 
          for($i = 0; $i < count ( $keys ); $i ++) { //See if each key correspondes to its position 
            if ($i != $keys [$i]) { //A key fails at position check. 
              $is_list = false; //It is an associative array. 
              break; 
            } 
          } 
        } 
        foreach ( $arr as $key => $value ) { 
          if (is_array ( $value )) { //Custom handling for arrays 
            if ($is_list) 
              $parts [] = self::json_encode ( $value ); /* :RECURSION: */ 
            else 
              $parts [] = '"' . $key . '":' . self::json_encode ( $value ); /* :RECURSION: */ 
          } else { 
            $str = ''; 
            if (! $is_list) 
              $str = '"' . $key . '":'; 
            //Custom handling for multiple data types 
            if (is_numeric ( $value ) && $value<2000000000) 
              $str .= $value; //Numbers 
            elseif ($value === false) 
            $str .= 'false'; //The booleans 
            elseif ($value === true) 
            $str .= 'true'; 
            else 
              $str .= '"' . addslashes ( $value ) . '"'; //All other things 
            // :TODO: Is there any more datatype we should be in the lookout for? (Object?) 
            $parts [] = $str; 
          } 
        } 
        $json = implode ( ',', $parts ); 
        if ($is_list) 
          return '[' . $json . ']'; //Return numerical JSON 
        return '{' . $json . '}'; //Return associative JSON 
      } 
      /** 
       * 创建菜单 
       * @param array $data 菜单数组数据 
       * example: 
       { 
       "button":[ 
       { 
       "type":"click", 
       "name":"今日歌曲", 
       "key":"MENU_KEY_MUSIC" 
       }, 
       { 
       "type":"view", 
       "name":"歌手简介", 
       "url":"http://www.qq.com/" 
       }, 
       { 
       "name":"菜单", 
       "sub_button":[ 
       { 
       "type":"click", 
       "name":"hello word", 
       "key":"MENU_KEY_MENU" 
       }, 
       { 
       "type":"click", 
       "name":"赞一下我们", 
       "key":"MENU_KEY_GOOD" 
       }] 
       }] 
       } 
       */ 
      public function createMenu($data){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_post(self::API_URL_PREFIX.self::MENU_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return true; 
        } 
        return false; 
      } 
      /** 
       * 获取菜单 
       * @return array('menu'=>array(....s)) 
       */ 
      public function getMenu(){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::MENU_GET_URL.'access_token='.$this->access_token); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 删除菜单 
       * @return boolean 
       */ 
      public function deleteMenu(){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::MENU_DELETE_URL.'access_token='.$this->access_token); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return true; 
        } 
        return false; 
      } 
      /** 
       * 根据媒体文件ID获取媒体文件 
       * @param string $media_id 媒体文件id 
       * @return raw data 
       */ 
      public function getMedia($media_id){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::MEDIA_GET_URL.'access_token='.$this->access_token.'&media;_id='.$media_id); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      }   
      /** 
       * 创建二维码ticket 
       * @param int $scene_id 自定义追踪id 
       * @param int $type 0:临时二维码;1:永久二维码(此时expire参数无效) 
       * @param int $expire 临时二维码有效期,最大为1800秒 
       * @return array('ticket'=>'qrcode字串','expire_seconds'=>1800) 
       */ 
      public function getQRCode($scene_id,$type=0,$expire=1800){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $data = array( 
          'action_name'=>$type?"QR_LIMIT_SCENE":"QR_SCENE", 
          'expire_seconds'=>$expire, 
          'action_info'=>array('scene'=>array('scene_id'=>$scene_id)) 
        ); 
        if ($type == 1) { 
          unset($data['expire_seconds']); 
        } 
        $result = $this->http_post(self::API_URL_PREFIX.self::QRCODE_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 获取二维码图片 
       * @param string $ticket 传入由getQRCode方法生成的ticket参数 
       * @return string url 返回http地址 
       */ 
      public function getQRUrl($ticket) { 
        return self::QRCODE_IMG_URL.$ticket; 
      } 
      /** 
       * 批量获取关注用户列表 
       * @param unknown $next_openid 
       */ 
      public function getUserList($next_openid=''){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::USER_GET_URL.'access_token='.$this->access_token.'&next;_openid='.$next_openid); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 获取关注者详细信息 
       * @param string $openid 
       * @return array 
       */ 
      public function getUserInfo($openid){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::USER_INFO_URL.'access_token='.$this->access_token.'&openid;='.$openid); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 获取用户分组列表 
       * @return boolean|array 
       */ 
      public function getGroup(){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_get(self::API_URL_PREFIX.self::GROUP_GET_URL.'access_token='.$this->access_token); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (isset($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 新增自定分组 
       * @param string $name 分组名称 
       * @return boolean|array 
       */ 
      public function createGroup($name){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $data = array( 
            'group'=>array('name'=>$name) 
        ); 
        $result = $this->http_post(self::API_URL_PREFIX.self::GROUP_CREATE_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 更改分组名称 
       * @param int $groupid 分组id 
       * @param string $name 分组名称 
       * @return boolean|array 
       */ 
      public function updateGroup($groupid,$name){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $data = array( 
            'group'=>array('id'=>$groupid,'name'=>$name) 
        ); 
        $result = $this->http_post(self::API_URL_PREFIX.self::GROUP_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 移动用户分组 
       * @param int $groupid 分组id 
       * @param string $openid 用户openid 
       * @return boolean|array 
       */ 
      public function updateGroupMembers($groupid,$openid){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $data = array( 
            'openid'=>$openid, 
            'to_groupid'=>$groupid 
        ); 
        $result = $this->http_post(self::API_URL_PREFIX.self::GROUP_MEMBER_UPDATE_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 发送客服消息 
       * @param array $data 消息结构{"touser":"OPENID","msgtype":"news","news":{...}} 
       * @return boolean|array 
       */ 
      public function sendCustomMessage($data){ 
        if (!$this->access_token && !$this->checkAuth()) return false; 
        $result = $this->http_post(self::API_URL_PREFIX.self::CUSTOM_SEND_URL.'access_token='.$this->access_token,self::json_encode($data)); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * oauth 授权跳转接口 
       * @param string $callback 回调URI 
       * @return string 
       */ 
      public function getOauthRedirect($callback,$state='',$scope='snsapi_userinfo'){ 
        return self::OAUTH_PREFIX.self::OAUTH_AUTHORIZE_URL.'appid='.$this->appid.'&redirect;_uri='.urlencode($callback).'&response;_type=code&scope;='.$scope.'&state;='.$state.'#wechat_redirect'; 
      } 
      /* 
       * 通过code获取Access Token 
       * @return array {access_token,expires_in,refresh_token,openid,scope} 
       */ 
      public function getOauthAccessToken(){ 
        $code = isset($_GET['code'])?$_GET['code']:''; 
        if (!$code) return false; 
        $result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_TOKEN_URL.'appid='.$this->appid.'&secret;='.$this->appsecret.'&code;='.$code.'&grant;_type=authorization_code'); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          $this->user_token = $json['access_token']; 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 刷新access token并续期 
       * @param string $refresh_token 
       * @return boolean|mixed 
       */ 
      public function getOauthRefreshToken($refresh_token){ 
        $result = $this->http_get(self::OAUTH_TOKEN_PREFIX.self::OAUTH_REFRESH_URL.'appid='.$this->appid.'&grant;_type=refresh_token&refresh;_token='.$refresh_token); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          $this->user_token = $json['access_token']; 
          return $json; 
        } 
        return false; 
      } 
      /** 
       * 获取授权后的用户资料 
       * @param string $access_token 
       * @param string $openid 
       * @return array {openid,nickname,sex,province,city,country,headimgurl,privilege} 
       */ 
      public function getOauthUserinfo($access_token,$openid){ 
        $result = $this->http_get(self::OAUTH_USERINFO_URL.'access_token='.$access_token.'&openid;='.$openid); 
        if ($result) 
        { 
          $json = json_decode($result,true); 
          if (!$json || !empty($json['errcode'])) { 
            $this->errCode = $json['errcode']; 
            $this->errMsg = $json['errmsg']; 
            return false; 
          } 
          return $json; 
        } 
        return false; 
      } 
    }

接下来就是接口对应的index.php文件,处理微信服务器发送来的信息。
因为是工作室的微信公共账号,所以未做任何修改源码搬上来,截取有用的部分即可:


    <?php 
    /** 
     * WeeGo工作室微信公众平台接口源码 
     * @author CallMeWhy <wanghaiyang@139.me> 
     * @version 1.0 
     */ 
    include "wechat.class.php"; 
    $options = array 
    ( 
      'token'=>'weego', 
      'debug'=>true, 
      'logcallback'=>'logdebug' 
    ); 
    $weObj = new Wechat($options); 
    // 验证 
    $weObj->valid(); 
    // 获取内容 
    $weObj->getRev(); 
    // 获取用户的OpenID  
    $fromUsername = $weObj->getRevFrom(); 
    // 获取接受信息的类型 
    $type = $weObj->getRev()->getRevType(); 

    //**********关注操作则写入数据库**********/ 
    if($weObj->getRevSubscribe()) 
    { 
      // 获取用户OPENID并写入数据库 
      $mysql = new SaeMysql(); 
      $sql = "INSERT INTO `users` (`wxid`) VALUES ('" . $fromUsername . "');"; 
      $mysql->runSql($sql); 
      $mysql->closeDb(); 
      // 获得信息的类型 
      $news = array 
      ( 
        array 
        ( 
          'Title'=>'欢迎关注WeeGo工作室', 
          'Description'=>'发送任意内容查看最新开发进展', 
          'PicUrl'=>'http://233.weego.sinaapp.com/images/weego_400_200.png', 
        ) 
      ); 
      $weObj->news($news)->reply(); 
    } 
    //**********取消关注操作则删除数据库**********/ 
    if($weObj->getRevUnsubscribe()) 
    { 
      // 获取用户OPENID并从数据库删除 
      $mysql = new SaeMysql(); 
      $sql = "DELETE FROM `users` WHERE `wxid` = '" . $fromUsername . "'"; 
      $mysql->runSql($sql); 
      $mysql->closeDb(); 
    } 
    switch($type) { 
      case Wechat::MSGTYPE_TEXT: 
        /**********文字信息**********/ 
        $news = array 
        ( 
          array 
          ( 
            'Title'=>"欢迎光临WeeGo工作室", 
            'PicUrl'=>'http://233.weego.sinaapp.com/images/weego_400_200.png', 
            //'Url'=>'http://233.weego.sinaapp.com/web/home.php?wxid='.$fromUsername 
          ),    
          array 
          ( 
            'Title'=>"功能1:发送图片可以查询照片中人脸的年龄和性别信息哦", 
            'PicUrl'=>'http://233.weego.sinaapp.com/images/face.jpg', 
            //'Url'=>'http://233.weego.sinaapp.com/web/home.php?wxid='.$fromUsername 
          ),  
          array 
          ( 
            'Title'=>"功能2:发送一张两人合影的照片可以计算两人的相似程度", 
            'PicUrl'=>'http://233.weego.sinaapp.com/images/mask.png', 
            //'Url'=>'http://233.weego.sinaapp.com/web/home.php?wxid='.$fromUsername 
          ),  
          array 
          ( 
            'Title'=>"功能3:山东大学绩点查询签到等功能正在开发中敬请期待", 
            'PicUrl'=>'http://233.weego.sinaapp.com/images/sdu.jpg', 
            //'Url'=>'http://233.weego.sinaapp.com/web/home.php?wxid='.$fromUsername 
          ) 
        ); 
        // 开发人员通道 
        if($weObj->getRev()->getRevContent() === "why"){ 
          $news = array 
          ( 
            array 
            ( 
              'Title'=>'开发人员通道', 
              'Description'=>'开发人员通道', 
              'PicUrl'=>'http://233.weego.sinaapp.com/images/weego_400_200.png', 
              'Url'=>'http://233.weego.sinaapp.com/web/home.php?wxid='.$fromUsername 
            ) 
          ); 
        } 
        $weObj->news($news)->reply(); 
        exit; 
        break; 
      case Wechat::MSGTYPE_EVENT: 
        break; 
      case Wechat::MSGTYPE_IMAGE: 
        /**********图片信息**********/ 
        $imgUrl = $weObj->getRev()->getRevPic(); 
        $resultStr = face($imgUrl); 
        $weObj->text($resultStr)->reply(); 
        break; 
      default: 
        $weObj->text("Default")->reply(); 
    } 
    // 调用人脸识别的API返回识别结果 
    function face($imgUrl) 
    { 
      // face++ 链接 
      $jsonStr = 
        file_get_contents("http://apicn.faceplusplus.com/v2/detection/detect?url=".$imgUrl."&api;_key=5eb2c984ad24ffc08c352bdb53ee52f8&api;_secret=ViX19uvxkT_A0a6d55Hb0Q0QGMTqZ95f&&attribute;=glass,pose,gender,age,race,smiling"); 
      $replyDic = json_decode($jsonStr); 
      $resultStr = ""; 
      $faceArray = $replyDic->{'face'}; 
      $resultStr .= "图中共检测到".count($faceArray)."张脸!\n"; 
      for ($i= 0;$i< count($faceArray); $i++){ 
        $resultStr .= "第".($i+1)."张脸\n"; 
        $tempFace = $faceArray[$i]; 
        // 获取所有属性 
        $tempAttr = $tempFace->{'attribute'}; 
        // 年龄:包含年龄分析结果 
        // value的值为一个非负整数表示估计的年龄, range表示估计年龄的正负区间 
        $tempAge = $tempAttr->{'age'}; 
        // 性别:包含性别分析结果 
        // value的值为Male/Female, confidence表示置信度 
        $tempGenger = $tempAttr->{'gender'};  
        // 种族:包含人种分析结果 
        // value的值为Asian/White/Black, confidence表示置信度 
        $tempRace = $tempAttr->{'race'};    
        // 微笑:包含微笑程度分析结果 
        //value的值为0-100的实数,越大表示微笑程度越高 
        $tempSmiling = $tempAttr->{'smiling'}; 
        // 眼镜:包含眼镜佩戴分析结果 
        // value的值为None/Dark/Normal, confidence表示置信度 
        $tempGlass = $tempAttr->{'glass'};   
        // 造型:包含脸部姿势分析结果 
        // 包括pitch_angle, roll_angle, yaw_angle 
        // 分别对应抬头,旋转(平面旋转),摇头 
        // 单位为角度。 
        $tempPose = $tempAttr->{'pose'}; 
        //返回年龄 
        $minAge = $tempAge->{'value'} - $tempAge->{'range'}; 
        $minAge = $minAge < 0 ? 0 : $minAge; 
        $maxAge = $tempAge->{'value'} + $tempAge->{'range'}; 
        $resultStr .= "年龄:".$minAge."-".$maxAge."岁\n"; 
        // 返回性别 
        if($tempGenger->{'value'} === "Male") 
          $resultStr .= "性别:男\n";  
        else if($tempGenger->{'value'} === "Female") 
          $resultStr .= "性别:女\n"; 
        // 返回种族 
        if($tempRace->{'value'} === "Asian") 
          $resultStr .= "种族:黄种人\n";   
        else if($tempRace->{'value'} === "Male") 
          $resultStr .= "种族:白种人\n";   
        else if($tempRace->{'value'} === "Black") 
          $resultStr .= "种族:黑种人\n";   
        // 返回眼镜 
        if($tempGlass->{'value'} === "None") 
          $resultStr .= "眼镜:木有眼镜\n";  
        else if($tempGlass->{'value'} === "Dark") 
          $resultStr .= "眼镜:目测墨镜\n";  
        else if($tempGlass->{'value'} === "Normal") 
          $resultStr .= "眼镜:普通眼镜\n";  
        //返回微笑 
        $resultStr .= "微笑:".round($tempSmiling->{'value'})."%\n"; 
      }   
      if(count($faceArray) === 2){ 
        // 获取face_id 
        $tempFace = $faceArray[0]; 
        $tempId1 = $tempFace->{'face_id'}; 
        $tempFace = $faceArray[1]; 
        $tempId2 = $tempFace->{'face_id'}; 

        // face++ 链接 
        $jsonStr = 
          file_get_contents("https://apicn.faceplusplus.com/v2/recognition/compare?api_secret=ViX19uvxkT_A0a6d55Hb0Q0QGMTqZ95f&api;_key=5eb2c984ad24ffc08c352bdb53ee52f8&face;_id2=".$tempId2 ."&face;_id1=".$tempId1); 
        $replyDic = json_decode($jsonStr); 
        //取出相似程度 
        $tempResult = $replyDic->{'similarity'}; 
        $resultStr .= "相似程度:".round($tempResult)."%\n"; 
        //具体分析相似处 
        $tempSimilarity = $replyDic->{'component_similarity'}; 
        $tempEye = $tempSimilarity->{'eye'}; 
        $tempEyebrow = $tempSimilarity->{'eyebrow'}; 
        $tempMouth = $tempSimilarity->{'mouth'}; 
        $tempNose = $tempSimilarity->{'nose'}; 
        $resultStr .= "相似分析:\n"; 
        $resultStr .= "眼睛:".round($tempEye)."%\n"; 
        $resultStr .= "眉毛:".round($tempEyebrow)."%\n"; 
        $resultStr .= "嘴巴:".round($tempMouth)."%\n"; 
        $resultStr .= "鼻子:".round($tempNose)."%\n"; 
      } 

      //如果没有检测到人脸 
      if($resultStr === "") 
        $resultStr = "照片中木有人脸=.="; 
      return $resultStr; 
    }; 
    // 写入本地日志文件的函数 
    function logdebug($text) 
    { 
      file_put_contents('log.txt', $text."\n", FILE_APPEND);    
    };

希望本文所述对大家基于php的微信公众平台开发有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例