微信公眾平臺介面API

Dragon.Spirit發表於2016-09-12
<?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));
    }

}

 轉自:http://blog.csdn.net/helencoder/article/details/50407905

相關文章