微信公衆平臺接口API

本API爲筆者本人所寫,包括微信公衆平臺幾乎所有的接口、接口調用方法以及錯誤返回碼等。所有函數名稱均利用接口的英文名,便於查找和使用、後期會持續優化。關於各個接口的調用的案例、會持續更新。

<?php
/**
 * Author: helen
 * CreateTime: 2015/12/9 20:14
 * description: 微信公衆平臺接口API
 */
class Wechat{

    /**
     * @FunctionDescription:驗證開發者服務器url有效性
     * @Param:token(令牌 用戶手動輸入的配置信息)
     * @Return:echostr(隨機字符串)
     * @Description:
     * @Author:helen zheng
     */
    public function valid($token){
        $echostr = $_GET['echostr'];
        if($this->checkSignature($token)){
            echo $echostr;
            exit;
        }
    }

    /**
     * @FunctionDescription:檢驗signature函數
     * @Param:token(令牌 用戶手動輸入的配置信息)
     * @Return:true/false
     * @Description:微信服務器發送get請求將signature、timestamp、nonce、echostr四個參數發送到開發者提供的url,利用接收到的參數進行驗證。
     * @Author:helen zheng
     */
    function checkSignature($token){
        /*獲取微信發送確認的參數。*/
        $signature = $_GET['signature'];    /*微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。*/
        $timestamp = $_GET['timestamp'];    /*時間戳 */
        $nonce = $_GET['nonce'];            /*隨機數 */
        $echostr = $_GET['echostr'];        /*隨機字符串*/
        /*加密/校驗流程*/
        /*1. 將token、timestamp、nonce三個參數進行字典序排序*/
        $array = array($token,$timestamp,$nonce);
        sort($array,SORT_STRING);
        /*2. 將三個參數字符串拼接成一個字符串進行sha1加密*/
        $str = sha1( implode($array) );
        /*3. 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信*/
        if( $str==$signature && $echostr ){
            return ture;
        }else{
            return false;
        }
    }

    /**
     * @FunctionDescription:獲取access_token
     * @Param:AppID(第三方用戶唯一憑證 ),AppSecret(第三方用戶唯一憑證密鑰)
     * @Return:access_token( string(length=117))
     * @Description:access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將導致上次獲取的access_token失效。
     * @Author:helen zheng
     */
    public function getToken($appid,$appsecret){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取微信服務器的IP地址列表
     * @Param:access_token(公衆號的access_token )
     * @Return:
     * @Description:安全驗證
     * @Author:helen zheng
     */
    public function getWeixinIP($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:接收消息響應(回覆)函數(可與自定義回覆接口、語義理解接口、客服接口結合)
     * @Param:
     * @Return:接收消息類型
     * @Description:?當普通微信用戶向公衆賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL上。
     * @Author:helen zheng
     */
    public function responseMsg(){
        /*1,獲取到微信推送過來post數據(xml格式)*/
        $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
        /*2,處理消息類型,並設置回覆類型和內容*/
        $postObj = simplexml_load_string($postArr);
        /*判斷用戶發送消息的類型(普通消息、事件推送)*/
        $MsgType = strtolower($postObj->MsgType);
        $Event = strtolower($postObj->Event);
        if(isset($Event)){  /*事件推送*/
            switch($Event){
                case 'subscribe'            : /*return '訂閱事件(掃描帶參數二維碼事件(用戶未關注))';*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[FromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[subscribe]]></Event>
                                </xml>';
                    break;
                case 'unsubscribe'          : /*return '取消訂閱事件';*/
                    $template ='<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[FromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[unsubscribe]]></Event>
                                </xml>';
                    break;
                case 'scan'                 : /*return '掃描帶參數二維碼事件(用戶已關注)';*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[FromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[subscribe]]></Event>
                                    <EventKey><![CDATA[qrscene_123123]]></EventKey>
                                    <Ticket><![CDATA[TICKET]]></Ticket>
                                </xml>';
                    break;
                case 'location'             : /*return '上報地理位置事件';*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[fromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[LOCATION]]></Event>
                                    <Latitude>23.137466</Latitude>
                                    <Longitude>113.352425</Longitude>
                                    <Precision>119.385040</Precision>
                                </xml>';
                    break;
                case 'click'                : /*return '自定義菜單事件(點擊菜單拉取消息時的事件推送)';*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[FromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[CLICK]]></Event>
                                    <EventKey><![CDATA[EVENTKEY]]></EventKey>
                                </xml>';
                    break;
                case 'view'                 : /*return '自定義菜單事件(點擊菜單跳轉鏈接時的事件推送)';*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[toUser]]></ToUserName>
                                    <FromUserName><![CDATA[FromUser]]></FromUserName>
                                    <CreateTime>123456789</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[VIEW]]></Event>
                                    <EventKey><![CDATA[www.qq.com]]></EventKey>
                                </xml>';
                    break;
                case 'scancode_push'        : /*return '自定義菜單事件(掃碼推事件的事件推送 )'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408090502</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[scancode_push]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <ScanCodeInfo>
                                        <ScanType><![CDATA[qrcode]]></ScanType>
                                        <ScanResult><![CDATA[1]]></ScanResult>
                                    </ScanCodeInfo>
                                </xml>';
                    break;
                case 'scancode_waitmsg'     : /*return '自定義菜單事件(掃碼推事件且彈出“消息接收中”提示框的事件推送  )'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408090606</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[scancode_waitmsg]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <ScanCodeInfo>
                                        <ScanType><![CDATA[qrcode]]></ScanType>
                                        <ScanResult><![CDATA[2]]></ScanResult>
                                    </ScanCodeInfo>
                                </xml>';
                    break;
                case 'pic_sysphoto'         : /*return '自定義菜單事件(彈出系統拍照發圖的事件推送  )'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408090651</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[pic_sysphoto]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <SendPicsInfo>
                                        <Count>1</Count>
                                        <PicList>
                                            <item>
                                                <PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
                                            </item>
                                        </PicList>
                                    </SendPicsInfo>
                                </xml>';
                    break;
                case 'pic_photo_or_album'   : /*return '自定義菜單事件(彈出拍照或者相冊發圖的事件推送 )'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408090816</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[pic_photo_or_album]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <SendPicsInfo>
                                        <Count>1</Count>
                                        <PicList>
                                            <item>
                                                <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
                                            </item>
                                        </PicList>
                                    </SendPicsInfo>
                                </xml>';
                    break;
                case 'pic_weixin'           : /*return '自定義菜單事件(彈出微信相冊發圖器的事件推送 )'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408090816</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[pic_weixin]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <SendPicsInfo>
                                        <Count>1</Count>
                                        <PicList>
                                            <item>
                                                <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
                                            </item>
                                        </PicList>
                                    </SendPicsInfo>
                                </xml>';
                    break;
                case 'location_select'      : /*return '自定義菜單事件(彈出地理位置選擇器的事件推送)'*/
                    $template = '<xml>
                                    <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
                                    <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
                                    <CreateTime>1408091189</CreateTime>
                                    <MsgType><![CDATA[event]]></MsgType>
                                    <Event><![CDATA[location_select]]></Event>
                                    <EventKey><![CDATA[6]]></EventKey>
                                    <SendLocationInfo>
                                        <Location_X><![CDATA[23]]></Location_X>
                                        <Location_Y><![CDATA[113]]></Location_Y>
                                        <Scale><![CDATA[15]]></Scale>
                                        <Label><![CDATA[ 廣州市海珠區客村藝苑路 106號]]></Label>
                                        <Poiname><![CDATA[]]></Poiname>
                                    </SendLocationInfo>
                                </xml>';
                    break;
                default                     : /*return '未知事件類型';*/
                    break;
            }
        }else{  /*普通消息(自動回覆擴展)*/
            switch($MsgType){
                case 'text'       : /*return '文本信息';*/
                    $Content = '您發送的爲文本,內容爲:'.$postObj->Content;
                    break;
                case 'image'      : /*return '圖片消息';*/
                    $Content = '您發送的爲圖片,圖片鏈接爲:'.$postObj->PicUrl;
                    break;
                case 'voice'      : /*return '語音消息';*/
                    $Content = '您發送的爲語音,媒體ID爲:'.$postObj->MediaId;
                    break;
                case 'video'      : /*return '視頻消息';*/
                    $Content = '您發送的爲視頻,媒體ID爲:'.$postObj->MediaId;
                    break;
                case 'shortvideo' : /*return '小視頻消息';*/
                    $Content = '您發送的爲小視頻,媒體ID爲:'.$postObj->MediaId;
                    break;
                case 'location'   : /*return '地理位置消息';*/
                    $Content = '您發送的爲地理位置消息,位置爲: '.$postObj->Label.'緯度爲: '.$postObj->Location_X.'經度爲: '.$postObj->Location_Y;
                    break;
                case 'link'       : /*return '鏈接消息';*/
                    $Content = '您發送的爲鏈接消息,標題爲: '.$postObj->Title.'內容爲: '.$postObj->Description.'鏈接地址爲: '.$postObj->Url;
                    break;
                default           : /*return '未知消息類型';*/
                    $Content = '抱歉,請重新輸入!';
                    break;
            }
        }
        /*響應消息*/
        $FromUserName = $postObj->ToUserName;
        $ToUserName   = $postObj->FromUserName;
        $MsgType = 'text';  /*暫時響應均利用文本消息的形式*/
        $CreateTime = time();
        $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            </xml>";
        $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
        echo $info;
    }

    /**
     * @FunctionDescription:發送(回覆)消息
     * @Param:回覆消息類型(回覆圖文消息,需添加第二個參數 類型爲array 四個字段(title、description、picUrl、url) )
     * @Return:
     * @Description:根據回覆消息選定的類型進行特定類型的回覆
     * @Author:helen zheng
     */
    public function transmitMsg($MsgType,$array=null){
        /*1,獲取到微信推送過來post數據(xml格式)*/
        $postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
        /*2,處理消息類型,並設置回覆類型和內容*/
        $postObj = simplexml_load_string($postArr);
        /*判斷用戶發送消息的類型(普通消息、事件推送)*/
        /*響應消息*/
        $FromUserName = $postObj->ToUserName;
        $ToUserName   = $postObj->FromUserName;
        $CreateTime = time();
        switch($MsgType){   /*回覆消息*/
            case 'text'       : /*return '文本信息';*/
                $Content  = '';
                $template = '<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Content><![CDATA[%s]]></Content>
                            </xml>';
                $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Content);
                break;
            case 'image'      : /*return '圖片消息';*/
                $MediaId  = '';
                $template = '<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Image>
                                    <MediaId><![CDATA[%s]]></MediaId>
                                </Image>
                            </xml>';
                $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$MediaId);
                break;
            case 'voice'      : /*return '語音消息';*/
                $MediaId  = '';
                $template = '<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Voice>
                                    <MediaId><![CDATA[%s]]></MediaId>
                                </Voice>
                            </xml>';
                $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$MediaId);
                break;
            case 'video'      : /*return '視頻消息';*/
                $MediaId     = '';
                $Title       = '';
                $Description = '';
                $template = '<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Video>
                                    <MediaId><![CDATA[%s]]></MediaId>
                                    <Title><![CDATA[%s]]></Title>
                                    <Description><![CDATA[%s]]></Description>
                                </Video>
                            </xml>';
                $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$MediaId,$Title,$Description);
                break;
            case 'music'      : /*return '音樂消息';*/
                $Title        = '';
                $Description  = '';
                $MusicUrl     = '';
                $HQMusicUrl   = '';
                $ThumbMediaId = '';
                $template = '<xml>
                                <ToUserName><![CDATA[%s]]></ToUserName>
                                <FromUserName><![CDATA[%s]]></FromUserName>
                                <CreateTime>%s</CreateTime>
                                <MsgType><![CDATA[%s]]></MsgType>
                                <Music>
                                    <Title><![CDATA[%s]]></Title>
                                    <Description><![CDATA[%s]]></Description>
                                    <MusicUrl><![CDATA[%s]]></MusicUrl>
                                    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
                                    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
                                </Music>
                            </xml>';
                $info = sprintf($template,$ToUserName,$FromUserName,$CreateTime,$MsgType,$Title,$Description,$MusicUrl,$HQMusicUrl,$ThumbMediaId);
            case 'news'       : /*return '圖文消息'(根據傳入的數據可發送多條圖文消息);*/
                $template = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <ArticleCount>".count($array)."</ArticleCount>
                            <Articles>";
                foreach($array as $key=>$value){
                    $template .="<item>
                                <Title><![CDATA[".$value['title']."]]></Title>
                                <Description><![CDATA[".$value['description']."]]></Description>
                                <PicUrl><![CDATA[".$value['picUrl']."]]></PicUrl>
                                <Url><![CDATA[".$value['url']."]]></Url>
                                </item>";
                }
                $template .="</Articles>
                            </xml> ";
                $info = sprintf( $template, $ToUserName, $FromUserName, $CreateTime, $MsgType );
            default           : return '未知消息類型,請重新輸入';
        }
        echo $info;
    }

    /**
     * @FunctionDescription:客服接口
     * @Description:當用戶主動發消息給公衆號的時候(包括髮送信息、點擊自定義菜單、訂閱事件、掃描二維碼事件、支付成功事件、用戶維權),微信將會把消息數據推送給開發者,
     * @Description:開發者在一段時間內(目前修改爲48小時)可以調用客服消息接口,通過POST一個JSON數據包來發送消息給普通用戶,在48小時內不限制發送次數。
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:添加客服帳號(post)
     * @Param:access_token、custom_service_data(kf_account(完整客服賬號,格式爲:賬號前綴@公衆號微信號 )、nickname(客服暱稱,最長6個漢字或12個英文字符 )、password(客服賬號登錄密碼))
     * @Return:0 (ok)
     * @Description:每個公衆號最多添加10個客服賬號
     * @Author:helen zheng
     */
    public function customerServiceAccountAdd($access_token,$custom_service_data){
        $url = 'https://api.weixin.qq.com/customservice/kfaccount/add?access_token='.$access_token;
        $result = $this->request_post($url,$custom_service_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:修改客服賬號(post)
     * @Param:access_token、custom_service_data(kf_account(完整客服賬號,格式爲:賬號前綴@公衆號微信號 )、nickname(客服暱稱,最長6個漢字或12個英文字符 )、password(客服賬號登錄密碼))
     * @Return:0 (ok)
     * @Description:
     * @Author:helen zheng
     */
    public function customerServiceAccountUpdate($access_token,$custom_service_data){
        $url = 'https://api.weixin.qq.com/customservice/kfaccount/update?access_token='.$access_token;
        $result = $this->request_post($url,$custom_service_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:刪除客服帳號(get)
     * @Param:
     * @Return:
     * @Description:
     * @Author:helen zheng
     */
    public function customerServiceAccountDelete($access_token){
        $url = 'https://api.weixin.qq.com/customservice/kfaccount/del?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:設置客服帳號的頭像(post)
     * @Param:access_token,data(kf_account(客服賬號),img_data(圖片))
     * @Return:0 (ok)
     * @Description:調用本接口來上傳圖片作爲客服人員的頭像,頭像圖片文件必須是jpg格式,推薦使用640*640大小的圖片以達到最佳效果。
     * @Author:helen zheng
     */
    public function customerServiceAccountImg($access_token,$kf_account,$img_data){
        $url = 'http://api.weixin.qq.com/customservice/kfaccount/uploadheadimg?access_token='.$access_token.'&kf_account='.$kf_account;
        $result = $this->request_post($url,$img_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取所有客服賬號(get)
     * @Param:access_token
     * @Return:
     * @Description:通過本接口,獲取公衆號中所設置的客服基本信息,包括客服工號、客服暱稱、客服登錄賬號。
     * @Author:helen zheng
     */
    public function customerServiceAccountList($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/customservice/getkflist?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:客服接口-發消息(post)
     * @Param:access_token、data(touser、msgtype、content、media_id 、thumb_media_id )
     * @Return:
     * @Description:發送消息類型:文本消息、圖片消息、語音消息、視頻消息、音樂消息、圖文消息(點擊跳轉到外鏈/圖文消息頁面 圖文消息條數限制在8條以內,注意,如果圖文數超過8,則將會無響應。 )、發送卡券
     * @Author:helen zheng
     */
    public function customerServiceSend($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:高級羣發接口
     * @Description:對於認證訂閱號,羣發接口每天可成功調用1次,此次羣發可選擇發送給全部用戶或某個分組;
     * @Description:對於認證服務號雖然開發者使用高級羣發接口的每日調用限制爲100次,但是用戶每月只能接收4條,無論在公衆平臺網站上,還是使用接口羣發,用戶每月只能接收4條羣發消息,多於4條的羣發將對該用戶發送失敗;
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:上傳圖文消息內的圖片獲取URL【訂閱號與服務號認證後均可用】(post)
     * @Param:  access_token    是   調用接口憑證
                media           是   form-data中媒體文件標識,有filename、filelength、content-type等信息
     * @Return: url (上傳圖片的URL,可用於後續羣發中,放置到圖文消息中)。
     * @Description:本接口所上傳的圖片不佔用公衆號的素材庫中圖片數量的5000個的限制。圖片僅支持jpg/png格式,大小必須在1MB以下。
     * @Author:helen zheng
     */
    public function uploadImg($access_token,$img_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token='.$access_token;
        $result = $this->request_post($url,$img_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:上傳圖文消息素材【訂閱號與服務號認證後均可用】(post)
     * @Param:  Articles            是   圖文消息,一個圖文消息支持1到8條圖文
                thumb_media_id      是   圖文消息縮略圖的media_id,可以在基礎支持-上傳多媒體文件接口中獲得
                author              否   圖文消息的作者
                title               是   圖文消息的標題
                content_source_url  否   在圖文消息頁面點擊“閱讀原文”後的頁面
                content             是   圖文消息頁面的內容,支持HTML標籤。具備微信支付權限的公衆號,可以使用a標籤,其他公衆號不能使用
                digest              否   圖文消息的描述
                show_cover_pic      否   是否顯示封面,1爲顯示,0爲不顯示
     * @Return: type        媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb),次數爲news,即圖文消息
                media_id    媒體文件/圖文消息上傳後獲取的唯一標識
                created_at  媒體文件上傳時間
     * @Description:
     * @Author:helen zheng
     */
    public function uploadNews($access_token,$news_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token='.$access_token;
        $result = $this->request_post($url,$news_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:根據分組進行羣發【訂閱號與服務號認證後均可用】(post)
     * @Param:  filter          是   用於設定圖文消息的接收者
                is_to_all       否   用於設定是否向全部用戶發送,值爲true或false,選擇true該消息羣發給所有用戶,選擇false可根據group_id發送給指定羣組的用戶
                group_id        否   羣發到的分組的group_id,參加用戶管理中用戶分組接口,若is_to_all值爲true,可不填寫group_id
                mpnews          是   用於設定即將發送的圖文消息
                media_id        是   用於羣發的消息的media_id
                msgtype         是   羣發的消息類型,圖文消息爲mpnews,文本消息爲text,語音爲voice,音樂爲music,圖片爲image,視頻爲video,卡券爲wxcard
                title           否   消息的標題
                description     否   消息的描述
                thumb_media_id  是   視頻縮略圖的媒體ID
     * @Return: type          媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb),圖文消息爲news
                errcode       錯誤碼
                errmsg        錯誤信息
                msg_id        消息發送任務的ID
                msg_data_id   消息的數據ID,該字段只有在羣發圖文消息時,纔會出現。可以用於在圖文分析數據接口中,獲取到對應的圖文消息的數據,是圖文分析數據接口中的msgid字段中的前半部分,詳見圖文分析數據接口中的msgid字段的介紹。
     * @Description:
     * @Author:helen zheng
     */
    public function sendallByGroups($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:根據OpenID列表羣發【訂閱號不可用,服務號認證後可用】(post)
     * @Param:  touser          是   填寫圖文消息的接收者,一串OpenID列表,OpenID最少2個,最多10000個
                mpnews          是   用於設定即將發送的圖文消息
                media_id        是   用於羣發的圖文消息的media_id
                msgtype         是   羣發的消息類型,圖文消息爲mpnews,文本消息爲text,語音爲voice,音樂爲music,圖片爲image,視頻爲video,卡券爲wxcard
                title           否   消息的標題
                description     否   消息的描述
                thumb_media_id  是   視頻縮略圖的媒體ID
     * @Return: type            媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb),次數爲news,即圖文消息
                errcode         錯誤碼
                errmsg          錯誤信息
                msg_id          消息發送任務的ID
                msg_data_id     消息的數據ID,,該字段只有在羣發圖文消息時,纔會出現。可以用於在圖文分析數據接口中,獲取到對應的圖文消息的數據,是圖文分析數據接口中的msgid字段中的前半部分,詳見圖文分析數據接口中的msgid字段的介紹。
     * @Description:
     * @Author:helen zheng
     */
    public function sendallByOpenID($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:刪除羣發【訂閱號與服務號認證後均可用】(post)
     * @Param: msg_id   是   發送出去的消息ID
     * @Return: 0 (ok)
     * @Description:羣發只有在剛發出的半小時內可以刪除,發出半小時之後將無法被刪除。
     * @Author:helen zheng
     */
    public function sendallDelete($access_token,$msg_id){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token='.$access_token;
        $result = $this->request_post($url,$msg_id);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:預覽接口【訂閱號與服務號認證後均可用】(post)
     * @Param:  touser      接收消息用戶對應該公衆號的openid,該字段也可以改爲towxname,以實現對微信號的預覽
                msgtype     羣發的消息類型,圖文消息爲mpnews,文本消息爲text,語音爲voice,音樂爲music,圖片爲image,視頻爲video,卡券爲wxcard
                media_id    用於羣發的消息的media_id
                content     發送文本消息時文本的內容
     * @Return: msg_id      消息ID
     * @Description:開發者可通過該接口發送消息給指定用戶,在手機端查看消息的樣式和排版。爲了滿足第三方平臺開發者的需求,在保留對openID預覽能力的同時,增加了對指定微信號發送預覽的能力,但該能力每日調用次數有限制(100次),請勿濫用。
     * @Author:helen zheng
     */
    public function preview($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:查詢羣發消息發送狀態【訂閱號與服務號認證後均可用】(post)
     * @Param:  msg_id      羣發消息後返回的消息id
     * @Return: msg_id      羣發消息後返回的消息id
                msg_status  消息發送後的狀態,SEND_SUCCESS表示發送成功
     * @Description:
     * @Author:helen zheng
     */
    public function sendallStatus($access_token,$msg_id){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/mass/get?access_token='.$access_token;
        $result = $this->request_post($url,$msg_id);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:模板消息接口(post)
     * @Description:模板消息僅用於公衆號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中.
     * @Description:只有認證後的服務號纔可以申請模板消息的使用權限並獲得該權限;
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:設置所屬行業(post)
     * @Param:  industry_id1    是   公衆號模板消息所屬行業編號
                industry_id2    是   公衆號模板消息所屬行業編號
     * @Return:
     * @Description:設置行業可在MP中完成,每月可修改行業1次,賬號僅可使用所屬行業中相關的模板
     * @Author:helen zheng
     */
    public function setIndustry($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲得模板ID(post)
     * @Param: template_id_short    是   模板庫中模板的編號,有“TM**”和“OPENTMTM**”等形式
     * @Return:template_id
     * @Description:
     * @Author:helen zheng
     */
    public function getTemplateId($access_token,$template_id_short){
        $url = 'https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token='.$access_token;
        $result = $this->request_post($url,$template_id_short);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:發送模板消息(post)
     * @Param:
     * @Return: msgid
     * @Description:
     * @Author:helen zheng
     */
    public function sendTemplateMsg($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取自動回覆規則(get)
     * @Param:
     * @Return: is_add_friend_reply_open        關注後自動回覆是否開啓,0代表未開啓,1代表開啓
                is_autoreply_open               消息自動回覆是否開啓,0代表未開啓,1代表開啓
                add_friend_autoreply_info       關注後自動回覆的信息
                type                            自動回覆的類型。關注後自動回覆和消息自動回覆的類型僅支持文本(text)、圖片(img)、語音(voice)、視頻(video),關鍵詞自動回覆則還多了圖文消息(news)
                content                         對於文本類型,content是文本內容,對於圖文、圖片、語音、視頻類型,content是mediaID
                message_default_autoreply_info  消息自動回覆的信息
                keyword_autoreply_info          關鍵詞自動回覆的信息
                rule_name                       規則名稱
                create_time                     創建時間
                reply_mode                      回覆模式,reply_all代表全部回覆,random_one代表隨機回覆其中一條
                keyword_list_info               匹配的關鍵詞列表
                match_mode                      匹配模式,contain代表消息中含有該關鍵詞即可,equal表示消息內容必須和關鍵詞嚴格相同
                news_info                       圖文消息的信息
                title                           圖文消息的標題
                digest                          摘要
                author                          作者
                show_cover                      是否顯示封面,0爲不顯示,1爲顯示
                cover_url                       封面圖片的URL
                content_url                     正文的URL
                source_url                      原文的URL,若置空則無查看原文入口
     * @Description:開發者可以通過該接口,獲取公衆號當前使用的自動回覆規則,包括關注後自動回覆、消息自動回覆(60分鐘內觸發一次)、關鍵詞自動回覆。
     * @Author:helen zheng
     */
    public function getCurrentAutoreplyInfo($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/get_current_autoreply_info?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:素材管理
     * @Description:對多媒體文件、多媒體消息的獲取和調用等操作,是通過media_id來進行的。
     * @Description:素材管理接口對所有認證的訂閱號和服務號開放(注:自定義菜單接口和素材管理接口向第三方平臺旗下未認證訂閱號開放)。
     * @Description:圖片大小不超過2M,支持bmp/png/jpeg/jpg/gif格式,語音大小不超過5M,長度不超過60秒,支持mp3/wma/wav/amr格式
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:新增臨時素材(本接口即爲原“上傳多媒體文件”接口。)(post)
     * @Param:  access_token    是   調用接口憑證
                type            是   媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)
                media           是   form-data中媒體文件標識,有filename、filelength、content-type等信息
     * @Return: type        媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb,主要用於視頻與音樂格式的縮略圖)
                media_id    媒體文件上傳後,獲取時的唯一標識
                created_at  媒體文件上傳時間戳
     * @Description:對於臨時素材,每個素材(media_id)會在開發者上傳或粉絲髮送到微信服務器3天后自動刪除。media_id是可複用的。
     * @Description:上傳的臨時多媒體文件有格式和大小限制,如下:
                        圖片(image): 1M,支持JPG格式
                        語音(voice):2M,播放長度不超過60s,支持AMR\MP3格式
                        視頻(video):10MB,支持MP4格式
                        縮略圖(thumb):64KB,支持JPG格式
     * @Author:helen zheng
     */
    public function mediaUpload($access_token,$type,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/media/upload?access_token='.$access_token.'&type='.$type;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取臨時素材 (本接口即爲原“下載多媒體文件”接口。)(get)
     * @Param:  access_token    是   調用接口憑證
                media_id        是   媒體文件ID
     * @Return:
     * @Description:使用本接口獲取臨時素材(即下載臨時的多媒體文件)。請注意,視頻文件不支持https下載,調用該接口需http協議。
     * @Author:helen zheng
     */
    public function mediaGet($access_token,$media_id){
        $url = 'https://api.weixin.qq.com/cgi-bin/media/get?access_token='.$access_token.'&media_id='.$media_id;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:新增永久圖文素材(post)
     * @Param:  title               是   標題
                thumb_media_id      是   圖文消息的封面圖片素材id(必須是永久mediaID)
                author              是   作者
                digest              是   圖文消息的摘要,僅有單圖文消息纔有摘要,多圖文此處爲空
                show_cover_pic      是   是否顯示封面,0爲false,即不顯示,1爲true,即顯示
                content             是   圖文消息的具體內容,支持HTML標籤,必須少於2萬字符,小於1M,且此處會去除JS
                content_source_url  是   圖文消息的原文地址,即點擊“閱讀原文”後的URL
     * @Return: media_id 返回的即爲新增的圖文消息素材的media_id。
     * @Description:永久素材的數量是有上限的,請謹慎新增。圖文消息素材和圖片素材的上限爲5000,其他類型爲1000.素材的格式大小等要求與公衆平臺官網一致。
     * @Author:helen zheng
     */
    public function addPermanentGraphicMaterial($access_token,$news_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token='.$access_token;
        $result = $this->request_post($url,$news_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:新增其他類型永久素材(post)
     * @Param:  access_token    是   調用接口憑證
                type            是   媒體文件類型,分別有圖片(image)、語音(voice)、視頻(video)和縮略圖(thumb)
                media           是   form-data中媒體文件標識,有filename、filelength、content-type等信息
     * @Return:
     * @Description:通過POST表單來調用接口,表單id爲media,包含需要上傳的素材內容,有filename、filelength、content-type等信息。
     * @Description:請注意:圖片素材將進入公衆平臺官網素材管理模塊中的默認分組。
     * @Author:helen zheng
     */
    public function addPermanentOtherMaterial($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN';
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取永久素材(post)
     * @Param:  access_token    是   調用接口憑證
                media_id        是   要獲取的素材的media_id
     * @Return: title               圖文消息的標題
                thumb_media_id      圖文消息的封面圖片素材id(必須是永久mediaID)
                show_cover_pic      是否顯示封面,0爲false,即不顯示,1爲true,即顯示
                author              作者
                digest              圖文消息的摘要,僅有單圖文消息纔有摘要,多圖文此處爲空
                content             圖文消息的具體內容,支持HTML標籤,必須少於2萬字符,小於1M,且此處會去除JS
                url                 圖文頁的URL
                content_source_url  圖文消息的原文地址,即點擊“閱讀原文”後的URL
     * @Description:
     * @Author:helen zheng
     */
    public function getPermanentMaterial($access_token,$media_id){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/get_material?access_token='.$access_token;
        $result = $this->request_post($url,$media_id);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:刪除永久素材(post)
     * @Param:  access_token    是   調用接口憑證
                media_id        是   要獲取的素材的media_id
     * @Return:
     * @Description:
     * @Author:helen zheng
     */
    public function deletePermanentMaterial($access_token,$media_id){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/del_material?access_token='.$access_token;
        $result = $this->request_post($url,$media_id);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:修改永久圖文素材(post)
     * @Param:  media_id            是   要修改的圖文消息的id
                index               是   要更新的文章在圖文消息中的位置(多圖文消息時,此字段纔有意義),第一篇爲0
                title               是   標題
                thumb_media_id      是   圖文消息的封面圖片素材id(必須是永久mediaID)
                author              是   作者
                digest              是   圖文消息的摘要,僅有單圖文消息纔有摘要,多圖文此處爲空
                show_cover_pic      是   是否顯示封面,0爲false,即不顯示,1爲true,即顯示
                content             是   圖文消息的具體內容,支持HTML標籤,必須少於2萬字符,小於1M,且此處會去除JS
                content_source_url  是   圖文消息的原文地址,即點擊“閱讀原文”後的URL
     * @Return: 0 (ok)
     * @Description:
     * @Author:helen zheng
     */
    public function updatePermanentGraphicMaterial($access_token,$news_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/update_news?access_token='.$access_token;
        $result = $this->request_post($url,$news_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取素材總數(get)
     * @Param:
     * @Return: voice_count     語音總數量
                video_count     視頻總數量
                image_count     圖片總數量
                news_count      圖文總數量
     * @Description:開發者可以根據本接口來獲取永久素材的列表.1.永久素材的總數,也會計算公衆平臺官網素材管理中的素材
                    2.圖片和圖文消息素材(包括單圖文和多圖文)的總數上限爲5000,其他素材的總數上限爲1000
                    3.調用該接口需https協議
     * @Author:helen zheng
     */
    public function getPermanentMaterialCount($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取素材列表
     * @Param:  type    是   素材的類型,圖片(image)、視頻(video)、語音 (voice)、圖文(news)
                offset  是   從全部素材的該偏移位置開始返回,0表示從第一個素材 返回
                count   是   返回素材的數量,取值在1到20之間
     * @Return: total_count         該類型的素材的總數
                item_count          本次調用獲取的素材的數量
                title               圖文消息的標題
                thumb_media_id      圖文消息的封面圖片素材id(必須是永久mediaID)
                show_cover_pic      是否顯示封面,0爲false,即不顯示,1爲true,即顯示
                author              作者
                digest              圖文消息的摘要,僅有單圖文消息纔有摘要,多圖文此處爲空
                content             圖文消息的具體內容,支持HTML標籤,必須少於2萬字符,小於1M,且此處會去除JS
                url                 圖文頁的URL,或者,當獲取的列表是圖片素材列表時,該字段是圖片的URL
                content_source_url  圖文消息的原文地址,即點擊“閱讀原文”後的URL
                update_time         這篇圖文消息素材的最後更新時間
                name                文件名稱
     * @Description:開發者可以分類型獲取永久素材的列表。
     * @Author:helen zheng
     */
    public function getPermanentMaterialList($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:用戶管理
     * @Description:開發者可以使用接口,對公衆平臺的分組進行查詢、創建、修改、刪除等操作,也可以使用接口在需要時移動用戶到某個分組。
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:創建分組(post)
     * @Param:  access_token    調用接口憑證
                name            分組名字(30個字符以內)
     * @Return: id              分組id,由微信分配
                name            分組名字,UTF8編碼
     * @Description:一個公衆賬號,最多支持創建100個分組。
     * @Author:helen zheng
     */
    public function createGroups($access_token,$group_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/create?access_token='.$access_token;
        $result = $this->request_post($url,$group_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:查詢所有分組(get)
     * @Param:  access_token    調用接口憑證
     * @Return: groups          公衆平臺分組信息列表
                id              分組id,由微信分配
                name            分組名字,UTF8編碼
                count           分組內用戶數量
     * @Description:
     * @Author:helen zheng
     */
    public function getGroups($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:查詢用戶所在分組(post)
     * @Param:  access_token    調用接口憑證
                openid          用戶的OpenID
     * @Return: groupid         用戶所屬的groupid
     * @Description:
     * @Author:helen zheng
     */
    public function getGroupId($access_token,$openid){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/getid?access_token='.$access_token;
        $result = $this->request_post($url,$openid);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:修改分組名(post)
     * @Param:  access_token    調用接口憑證
                id              分組id,由微信分配
                name            分組名字(30個字符以內)
     * @Return:
     * @Description:
     * @Author:helen zheng
     */
    public function updateGroupsName($access_token,$group_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/update?access_token='.$access_token;
        $result = $this->request_post($url,$group_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:移動用戶分組(post)
     * @Param:  access_token    調用接口憑證
                openid          用戶唯一標識符
                to_groupid      分組id
     * @Return:
     * @Description:
     * @Author:helen zheng
     */
    public function updateGroupsUser($access_token,$user_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token='.$access_token;
        $result = $this->request_post($url,$user_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:批量移動用戶分組(post)
     * @Param:  access_token    調用接口憑證
                openid_list     用戶唯一標識符openid的列表(size不能超過50)
                to_groupid      分組id
     * @Return:
     * @Description:
     * @Author:helen zheng
     */
    public function batchupdateGroupsUser($access_token,$user_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token='.$access_token;
        $result = $this->request_post($url,$user_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:刪除分組(post)
     * @Param:  access_token    調用接口憑證
                group           分組
                id              分組的id
     * @Return:
     * @Description:本接口是刪除一個用戶分組,刪除分組後,所有該分組內的用戶自動進入默認分組。
     * @Author:helen zheng
     */
    public function deleteGroups($access_token,$group_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/groups/delete?access_token='.$access_token;
        $result = $this->request_post($url,$group_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:設置用戶備註名(post)
     * @Param:  access_token    調用接口憑證
                openid          用戶標識
                remark          新的備註名,長度必須小於30字符
     * @Return:
     * @Description:開發者可以通過該接口對指定用戶設置備註名,該接口暫時開放給微信認證的服務號。
     * @Author:helen zheng
     */
    public function updateUserRemark($access_token,$user_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token='.$access_token;
        $result = $this->request_post($url,$user_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取用戶基本信息(包括UnionID機制)(get)
     * @Param:  access_token    是   調用接口憑證
                openid          是   普通用戶的標識,對當前公衆號唯一
                lang            否   返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語
     * @Return: subscribe       用戶是否訂閱該公衆號標識,值爲0時,代表此用戶沒有關注該公衆號,拉取不到其餘信息。
                openid          用戶的標識,對當前公衆號唯一
                nickname        用戶的暱稱
                sex             用戶的性別,值爲1時是男性,值爲2時是女性,值爲0時是未知
                city            用戶所在城市
                country         用戶所在國家
                province        用戶所在省份
                language        用戶的語言,簡體中文爲zh_CN
                headimgurl      用戶頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項爲空。若用戶更換頭像,原有頭像URL將失效。
                subscribe_time  用戶關注時間,爲時間戳。如果用戶曾多次關注,則取最後關注時間
                unionid         只有在用戶將公衆號綁定到微信開放平臺帳號後,纔會出現該字段。詳見:獲取用戶個人信息(UnionID機制)
                remark          公衆號運營者對粉絲的備註,公衆號運營者可在微信公衆平臺用戶管理界面對粉絲添加備註
                groupid         用戶所在的分組ID
     * @Description:在關注者與公衆號產生消息交互後,公衆號可獲得關注者的OpenID(加密後的微信號,每個用戶對每個公衆號的OpenID是唯一的。對於不同公衆號,同一用戶的openid不同)。
     * @Description:公衆號可通過本接口來根據OpenID獲取用戶基本信息,包括暱稱、頭像、性別、所在城市、語言和關注時間。
     * @Description:如果開發者有在多個公衆號,或在公衆號、移動應用之間統一用戶帳號的需求,需要前往微信開放平臺(open.weixin.qq.com)綁定公衆號後,纔可利用UnionID機制來滿足上述需求。
     * @Author:helen zheng
     */
    public function getUserInfo($access_token,$openid){
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token='.$access_token.'&openid='.$openid.'&lang=zh_CN';
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:批量獲取用戶基本信息(post)
     * @Param:  openid  是   用戶的標識,對當前公衆號唯一
     * @Return: 同上
     * @Description:開發者可通過該接口來批量獲取用戶基本信息。最多支持一次拉取100條。
     * @Author:helen zheng
     */
    public function batchgetUserInfo($access_token,$user_list){
        $url = 'https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token='.$access_token;
        $result = $this->request_post($url,$user_list);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取用戶列表(get)
     * @Param:  access_token    是   調用接口憑證
                next_openid     是   第一個拉取的OPENID,不填默認從頭開始拉取
     * @Return: total           關注該公衆賬號的總用戶數
                count           拉取的OPENID個數,最大值爲10000
                data            列表數據,OPENID的列表
                next_openid     拉取列表的最後一個用戶的OPENID
     * @Description:公衆號可通過本接口來獲取帳號的關注者列表,關注者列表由一串OpenID(加密後的微信號,每個用戶對每個公衆號的OpenID是唯一的)組成。
     * @Description:一次拉取調用最多拉取10000個關注者的OpenID,可以通過多次拉取的方式來滿足需求。
     * @Author:helen zheng
     */
    public function getUserList($access_token,$next_openid=null){
        $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token='.$access_token.'&next_openid='.$next_openid;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:自定義菜單接口
     * @Description:自定義菜單最多包括3個一級菜單,每個一級菜單最多包含5個二級菜單。一級菜單最多4個漢字,二級菜單最多7個漢字.
     * @Description:創建自定義菜單後,由於微信客戶端緩存,需要24小時微信客戶端纔會展現出來
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:自定義菜單創建接口(post)
     * @Param:menu_data( button(一級菜單數組)、sub_button[二級菜單數組]、type(菜單的響應動作類型 )、name (菜單標題,不超過16個字節,子菜單不超過40個字節 ) )
     * @Param:menu_data(key (click等點擊類型必須 、菜單KEY值,用於消息接口推送,不超過128字節 )、url(view類型必須 網頁鏈接,用戶點擊菜單可打開鏈接,不超過256字節 )、media_id (media_id類型和view_limited類型必須 調用新增永久素材接口返回的合法media_id ) )
     * @Return:0 (ok)
     * @Description:按鈕類型:click:點擊推事件;view:跳轉URL;scancode_push:掃碼推事件;scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框;pic_sysphoto:彈出系統拍照發圖
     * @Description:按鈕類型:pic_photo_or_album:彈出拍照或者相冊發圖;pic_weixin:彈出微信相冊發圖器;location_select:彈出地理位置選擇器;media_id:下發消息(除文本消息);view_limited:跳轉圖文消息URL
     * @Author:helen zheng
     */
    public function customMenuEdit($menu_data,$access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$access_token;
        $result = $this->request_post($url,$menu_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:自定義菜單查詢接口(get)
     * @Param:access_token
     * @Return:自定義菜單信息
     * @Description:查詢自定義菜單的結構。
     * @Author:helen zheng
     */
    public function customMenuSearch($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/menu/get?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:自定義菜單刪除接口(get)
     * @Param:access_token
     * @Return:0 (ok)
     * @Description:刪除當前使用的自定義菜單。
     * @Author:helen zheng
     */
    public function customMenuDelete($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/menu/delete?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取自定義菜單配置接口(get)
     * @Param:access_token
     * @Return:is_menu_open(菜單是否開啓,0代表未開啓,1代表開啓 )、selfmenu_info(菜單信息 )、button (菜單按鈕 )、type (菜單的類型)、name (菜單名稱 )、value、url、key等字段
     * @Return:news_info(圖文消息的信息 )、title(圖文消息的標題 )、digest(摘要 )、author (作者)、show_cover (是否顯示封面,0爲不顯示,1爲顯示 )、cover_url( 封面圖片的URL )、content_url( 正文的URL )、source_url( 原文的URL,若置空則無查看原文入口)
     * @Description:本接口將會提供公衆號當前使用的自定義菜單的配置,如果公衆號是通過API調用設置的菜單,則返回菜單的開發配置,而如果公衆號是在公衆平臺官網通過網站功能發佈菜單,則本接口返回運營者設置的菜單配置。
     * @Author:helen zheng
     */
    public function customMenuList($access_token){
        $url = 'https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token='.$access_token;
        $result = $this->request_get($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:賬號管理
     * @Description:生成帶參數的二維碼、長鏈接轉短鏈接接口、微信認證事件推送
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:創建二維碼ticket
     * @Param:  expire_seconds  該二維碼有效時間,以秒爲單位。 最大不超過2592000(即30天),此字段如果不填,則默認有效期爲30秒。
                action_name     二維碼類型,QR_SCENE爲臨時,QR_LIMIT_SCENE爲永久,QR_LIMIT_STR_SCENE爲永久的字符串參數值
                action_info     二維碼詳細信息
                scene_id        場景值ID,臨時二維碼時爲32位非0整型,永久二維碼時最大值爲100000(目前參數只支持1--100000)
                scene_str       場景值ID(字符串形式的ID),字符串類型,長度限制爲1到64,僅永久二維碼支持此字段
     * @Return: ticket          獲取的二維碼ticket,憑藉此ticket可以在有效時間內換取二維碼。
                expire_seconds  該二維碼有效時間,以秒爲單位。 最大不超過2592000(即30天)。
                url             二維碼圖片解析後的地址,開發者可根據該地址自行生成需要的二維碼圖片
     * @Description:
     * @Author:helen zheng
     */
    public function createQrcodeTicket($access_token,$qrcode_data){
        $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token='.$access_token;
        $result = $this->request_post($url,$qrcode_data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:通過ticket換取二維碼
     * @Param:ticket
     * @Return:
     * @Description:獲取二維碼ticket後,開發者可用ticket換取二維碼圖片。TICKET記得進行UrlEncode
     * @Author:helen zheng
     */
    public function getQrcode($ticket){
        $url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket='.$ticket;
        $result = $this->downloadFile($url);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:長鏈接轉短鏈接接口(post)
     * @Param:  access_token    是   調用接口憑證
                action          是   此處填long2short,代表長鏈接轉短鏈接
                long_url        是   需要轉換的長鏈接,支持http://、https://、weixin://wxpay 格式的url
     * @Return: short_url       短鏈接。
     * @Description:將一條長鏈接轉成短鏈接。主要使用場景: 開發者用於生成二維碼的原鏈接(商品、支付二維碼等)太長導致掃碼速度和成功率下降,將原長鏈接通過此接口轉成短鏈接再生成二維碼將大大提升掃碼速度和成功率。
     * @Description:
     * @Author:helen zheng
     */
    public function shortUrl($access_token,$data){
        $url = 'https://api.weixin.qq.com/cgi-bin/shorturl?access_token='.$access_token;
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:數據統計
     * @Description:用戶分析數據接口、圖文分析數據接口、消息分析數據接口、接口分析數據接口
     * @Author:helen zheng
     */

    /**
     * @FunctionDescription:獲取用戶增減數據(post)
     * @Param:  access_token    是   調用接口憑證
                begin_date      是   獲取數據的起始日期,begin_date和end_date的差值需小於“最大時間跨度”(比如最大時間跨度爲1時,begin_date和end_date的差值只能爲0,才能小於1),否則會報錯
                end_date        是   獲取數據的結束日期,end_date允許設置的最大值爲昨日
     * @Return: ref_date        數據的日期
                user_source     用戶的渠道,數值代表的含義如下:0代表其他(包括帶參數二維碼) 3代表掃二維碼 17代表名片分享 35代表搜號碼(即微信添加朋友頁的搜索) 39代表查詢微信公衆帳號 43代表圖文頁右上角菜單
                new_user        新增的用戶數量
                cancel_user     取消關注的用戶數量,new_user減去cancel_user即爲淨增用戶數量
                cumulate_user   總用戶量
     * @Description:最大時間跨度(7)
     * @Author:helen zheng
     */
    public function getUserSummary($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getusersummary?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取累計用戶數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(7)
     * @Author:helen zheng
     */
    public function getUserCumulate($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getusercumulate?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文羣發每日數據(post)
     * @Param:  access_token    是   調用接口憑證
                begin_date      是   獲取數據的起始日期,begin_date和end_date的差值需小於“最大時間跨度”(比如最大時間跨度爲1時,begin_date和end_date的差值只能爲0,才能小於1),否則會報錯
                end_date        是   獲取數據的結束日期,end_date允許設置的最大值爲昨日
     * @Return: ref_date            數據的日期,需在begin_date和end_date之間
                ref_hour            數據的小時,包括從000到2300,分別代表的是[000,100)到[2300,2400),即每日的第1小時和最後1小時
                stat_date           統計的日期,在getarticletotal接口中,ref_date指的是文章羣發出日期, 而stat_date是數據統計日期
                msgid               請注意:這裏的msgid實際上是由msgid(圖文消息id,這也就是羣發接口調用後返回的msg_data_id)和index(消息次序索引)組成, 例如12003_3, 其中12003是msgid,即一次羣發的消息的id; 3爲index,假設該次羣發的圖文消息共5個文章(因爲可能爲多圖文),3表示5箇中的第3個
                title               圖文消息的標題
                int_page_read_user  圖文頁(點擊羣發圖文卡片進入的頁面)的閱讀人數
                int_page_read_count 圖文頁的閱讀次數
                ori_page_read_user  原文頁(點擊圖文頁“閱讀原文”進入的頁面)的閱讀人數,無原文頁時此處數據爲0
                ori_page_read_count 原文頁的閱讀次數
                share_scene         分享的場景   1代表好友轉發 2代表朋友圈 3代表騰訊微博 255代表其他
                share_user          分享的人數
                share_count         分享的次數
                add_to_fav_user     收藏的人數
                add_to_fav_count    收藏的次數
                target_user         送達人數,一般約等於總粉絲數(需排除黑名單或其他異常情況下無法收到消息的粉絲)
                user_source         在獲取圖文閱讀分時數據時纔有該字段,代表用戶從哪裏進入來閱讀該圖文。0:會話;1.好友;2.朋友圈;3.騰訊微博;4.歷史消息頁;5.其他
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getArticleSummary($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getarticlesummary?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文羣發總數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getArticleTotal($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getarticletotal?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文統計數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(3)
     * @Author:helen zheng
     */
    public function getUserRead($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getuserread?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文統計分時數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getUserReadHour($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getuserreadhour?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文分享轉發數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(7)
     * @Author:helen zheng
     */
    public function getUserShare($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getusershare?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取圖文分享轉發分時數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getUserShareHour($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getusersharehour?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送概況數據(post)
     * @Param:  access_token    是   調用接口憑證
                begin_date      是   獲取數據的起始日期,begin_date和end_date的差值需小於“最大時間跨度”(比如最大時間跨度爲1時,begin_date和end_date的差值只能爲0,才能小於1),否則會報錯
                end_date        是   獲取數據的結束日期,end_date允許設置的最大值爲昨日
     * @Return: ref_date            數據的日期,需在begin_date和end_date之間
                ref_hour            數據的小時,包括從000到2300,分別代表的是[000,100)到[2300,2400),即每日的第1小時和最後1小時
                msg_type            消息類型,代表含義如下:1代表文字 2代表圖片 3代表語音 4代表視頻 6代表第三方應用消息(鏈接消息)
                msg_user            上行發送了(向公衆號發送了)消息的用戶數
                msg_count           上行發送了消息的消息總數
                count_interval      當日發送消息量分佈的區間,0代表 “0”,1代表“1-5”,2代表“6-10”,3代表“10次以上”
                int_page_read_count 圖文頁的閱讀次數
                ori_page_read_user  原文頁(點擊圖文頁“閱讀原文”進入的頁面)的閱讀人數,無原文頁時此處數據爲0
     * @Description:最大時間跨度(7)
     * @Author:helen zheng
     */
    public function getUpStreamMsg($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsg?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息分送分時數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getUpstreamMsgHour($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsghour?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送週數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(30)
     * @Author:helen zheng
     */
    public function getUpstreamMsgWeek($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsgweek?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送月數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(30)
     * @Author:helen zheng
     */
    public function getUpstreamMsgMonth($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsgmonth?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送分佈數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(15)
     * @Author:helen zheng
     */
    public function getUpstreamMsgDist($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsgdist?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送分佈週數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(30)
     * @Author:helen zheng
     */
    public function getUpstreamMsgDistWeek($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsgdistweek?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取消息發送分佈月數據(post)
     * @Param:同上
     * @Return:同上
     * @Description:最大時間跨度(30)
     * @Author:helen zheng
     */
    public function getUpstreamMsgDistMonth($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getupstreammsgdistmonth?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取接口分析數據(post)
     * @Param:  access_token    是   調用接口憑證
                begin_date      是   獲取數據的起始日期,begin_date和end_date的差值需小於“最大時間跨度”(比如最大時間跨度爲1時,begin_date和end_date的差值只能爲0,才能小於1),否則會報錯
                end_date        是   獲取數據的結束日期,end_date允許設置的最大值爲昨日
     * @Return: ref_date        數據的日期
                ref_hour        數據的小時
                callback_count  通過服務器配置地址獲得消息後,被動回覆用戶消息的次數
                fail_count      上述動作的失敗次數
                total_time_cost 總耗時,除以callback_count即爲平均耗時
                max_time_cost   最大耗時
     * @Description:最大時間跨度(30)
     * @Author:helen zheng
     */
    public function getInterfaceSummary($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getinterfacesummary?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:獲取接口分析分時數據(post)
     * @Param:
     * @Return:
     * @Description:最大時間跨度(1)
     * @Author:helen zheng
     */
    public function getInterfaceSummaryHour($access_token,$begin_date,$end_date){
        $url = 'https://api.weixin.qq.com/datacube/getinterfacesummaryhour?access_token='.$access_token;
        $data = array(
            "begin_date"=>$begin_date,
            "end_date"=>$end_date
        );
        $data = json_encode($data);
        $result = $this->request_post($url,$data);
        $res = $this->resultProcess($result);
        if($res==$result){  /*接口返回值*/
            return($result);
        }else{  /*接口調用錯誤信息*/
            return($res);
        }
    }

    /**
     * @FunctionDescription:接口調用結果處理函數(判斷接口調用成功與否並處理)
     * @Param:接口調用返回值(json)
     * @Return:結果處理後信息(json或string)
     * @Description:假如接口調用成功,則本函數正常返回值;假如接口調用失敗,返回錯誤信息。
     * @Author:helen zheng
     */
    function resultProcess($res){
        if(!empty($res->errcode)){
            return ($this->errorMsg($res->errcode));
        }else{
            return $res;
        }
    }

    /**
     * @FunctionDescription:微信全局返回碼中文說明
     * @Param:微信返回碼
     * @Return:微信返回碼對應的中文說明
     * @Description:
     * @Author:helen zheng
     */
    function errorMsg($errcode) {
        switch ($errcode) {
            case -1    : return '系統繁忙,請稍候再試。';
            case 0     : return '請求成功。';
            case 40001 : return '獲取access_token時AppSecret錯誤,或者access_token無效。';
            case 40002 : return '不合法的憑證類型。';
            case 40003 : return '不合法的OpenID,請開發者確認OpenID(該用戶)是否已關注公衆號,或是否是其他公衆號的OpenID。';
            case 40004 : return '不合法的媒體文件類型';
            case 40005 : return '不合法的文件類型';
            case 40006 : return '不合法的文件大小';
            case 40007 : return '不合法的媒體文件id ';
            case 40008 : return '不合法的消息類型 ';
            case 40009 : return '不合法的圖片文件大小';
            case 40010 : return '不合法的語音文件大小';
            case 40011 : return '不合法的視頻文件大小';
            case 40012 : return '不合法的縮略圖文件大小';
            case 40013 : return '不合法的APPID';
            case 40014 : return '不合法的access_token ';
            case 40015 : return '不合法的菜單類型 ';
            case 40016 : return '不合法的按鈕個數 ';
            case 40017 : return '不合法的按鈕個數';
            case 40018 : return '不合法的按鈕名字長度';
            case 40019 : return '不合法的按鈕KEY長度 ';
            case 40020 : return '不合法的按鈕URL長度 ';
            case 40021 : return '不合法的菜單版本號';
            case 40022 : return '不合法的子菜單級數';
            case 40023 : return '不合法的子菜單按鈕個數';
            case 40024 : return '不合法的子菜單按鈕類型';
            case 40025 : return '不合法的子菜單按鈕名字長度';
            case 40026 : return '不合法的子菜單按鈕KEY長度 ';
            case 40027 : return '不合法的子菜單按鈕URL長度 ';
            case 40028 : return '不合法的自定義菜單使用用戶';
            case 40029 : return '不合法的oauth_code';
            case 40030 : return '不合法的refresh_token';
            case 40031 : return '不合法的openid列表 ';
            case 40032 : return '不合法的openid列表長度 ';
            case 40033 : return '不合法的請求字符,不能包含\uxxxx格式的字符 ';
            case 40035 : return '不合法的參數';
            case 40038 : return '不合法的請求格式';
            case 40039 : return '不合法的URL長度 ';
            case 40050 : return '不合法的分組id';
            case 40051 : return '分組名字不合法';
            case 41001 : return '缺少access_token參數';
            case 41002 : return '缺少appid參數';
            case 41003 : return '缺少refresh_token參數';
            case 41004 : return '缺少secret參數';
            case 41005 : return '缺少多媒體文件數據';
            case 41006 : return '缺少media_id參數';
            case 41007 : return '缺少子菜單數據';
            case 41008 : return '缺少oauth code';
            case 41009 : return '缺少openid';
            case 42001 : return 'access_token超時';
            case 42002 : return 'refresh_token超時';
            case 42003 : return 'oauth_code超時';
            case 43001 : return '需要GET請求';
            case 43002 : return '需要POST請求';
            case 43003 : return '需要HTTPS請求';
            case 43004 : return '需要接收者關注';
            case 43005 : return '需要好友關係';
            case 44001 : return '多媒體文件爲空';
            case 44002 : return 'POST的數據包爲空';
            case 44003 : return '圖文消息內容爲空';
            case 44004 : return '文本消息內容爲空';
            case 45001 : return '多媒體文件大小超過限制';
            case 45002 : return '消息內容超過限制';
            case 45003 : return '標題字段超過限制';
            case 45004 : return '描述字段超過限制';
            case 45005 : return '鏈接字段超過限制';
            case 45006 : return '圖片鏈接字段超過限制';
            case 45007 : return '語音播放時間超過限制';
            case 45008 : return '圖文消息超過限制';
            case 45009 : return '接口調用超過限制';
            case 45010 : return '創建菜單個數超過限制';
            case 45015 : return '回覆時間超過限制';
            case 45016 : return '系統分組,不允許修改';
            case 45017 : return '分組名字過長';
            case 45018 : return '分組數量超過上限';
            case 46001 : return '不存在媒體數據';
            case 46002 : return '不存在的菜單版本';
            case 46003 : return '不存在的菜單數據';
            case 46004 : return '不存在的用戶';
            case 47001 : return '解析JSON/XML內容錯誤';
            case 48001 : return 'api功能未授權';
            case 50001 : return '用戶未授權該api';
            default    : return '未知錯誤';
        }
    }

    /**
     * @FunctionDescription:接口調用的get方法
     * @Param:請求的url地址
     * @Return:(json)
     * @Description:利用cURL發送get請求,獲取數據
     * @Author:helen zheng
     */
    /*接口調用的get方法*/
    function request_get($url){
        //初始化cURL方法
        $ch = curl_init();
        //設置cURL參數
        $opts = array(
            //在局域網內訪問https站點時需要設置以下兩項,關閉ssl驗證!
            //此兩項正式上線時需要更改(不檢查和驗證認證)
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL            => $url,
        );
        curl_setopt_array($ch,$opts);
        //執行cURL操作
        $output = curl_exec($ch);
        if(curl_errno($ch)){    //cURL發生錯誤處理操作
            var_dump(curl_error($ch));
            die;
        }
        //關閉cURL
        curl_close($ch);
        $res = json_decode($output);
        return($res);    //返回json數據
    }

    /**
     * @FunctionDescription:接口調用的post方法
     * @Param:請求的url地址,post數據(json格式)
     * @Return:(json)
     * @Description:利用cURL發送get請求,獲取數據
     * @Author:helen zheng
     */
    function request_post($url,$data){
        //初始化cURL方法
        $ch = curl_init();
        //設置cURL參數
        $opts = array(
            //在局域網內訪問https站點時需要設置以下兩項,關閉ssl驗證!
            //此兩項正式上線時需要更改(不檢查和驗證認證)
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL            => $url,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $data
        );
        curl_setopt_array($ch,$opts);
        //執行cURL操作
        $output = curl_exec($ch);
        if(curl_errno($ch)){    //cURL操作發生錯誤處理。
            var_dump(curl_error($ch));
            die;
        }
        //關閉cURL
        curl_close($ch);
        $res = json_decode($output);
        return($res);   //返回json數據
    }

    /**
     * @FunctionDescription:下載多媒體文件方法
     * @Param:url
     * @Return:多媒體信息 array
     * @Description:
     * @Author:helen zheng
     */
    function downloadFile($url){
        //初始化cURL方法
        $ch = curl_init();
        //設置cURL參數
        $opts = array(
            //在局域網內訪問https站點時需要設置以下兩項,關閉ssl驗證!
            //此兩項正式上線時需要更改(不檢查和驗證認證)
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_URL            => $url,
            CURLOPT_HEADER         => 0,
            CURLOPT_NOBODY         => 0
        );
        curl_setopt_array($ch,$opts);
        //執行cURL操作
        $output = curl_exec($ch);
        $httpinfo = curl_getinfo($ch);
        if(curl_errno($ch)){
            var_dump(curl_error($ch));
        }
        //關閉cURL
        curl_close($ch);
        return array_merge(array('body'=>$output),array('header'=>$httpinfo));
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章