微信公众号开发!《二》

代码如下:

/* * ******************************************************
 *      @author Dragoners.Li <[email protected]>
 *      @link http://mp.weixin.qq.com/wiki/home/index.html
 *      @version 0.0.1
 *      @uses $wxApi = new WxApi();
 *      @package 微信API接口  
 * ****************************************************** */

header('Content-Type: text/html; charset=utf8');
date_default_timezone_set('Asia/Shanghai');


class Wechat {

    CONST API_PREFIX = 'https://api.weixin.qq.com/'; //接口url前缀

    private $_appID; //开发者ID   
    private $_appsecret; //开发者密码   
    private $_token; // 公众平台请求开发者时需要标记 
    private $_access_token = 'AccessToken'; //access_token 存放文件

    //构造方法

    public function __construct($appID, $appsecret, $token) {
        $this->_appID = $appID;
        $this->_appsecret = $appsecret;
        $this->_token = $token;
    }

    //接收处理消息
    public function responseMsg() {

        //$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        $postStr = file_get_contents("php://input");
        //调试错误:file_put_contents("log.php",$postStr);//写入文件 


        if (!empty($postStr)) {

            // 解析该xml字符串,利用simpleXML
            libxml_disable_entity_loader(true); //禁止xml实体解析,防止xml注入 
            //把 XML 字符串载入对象中。失败返回 false。
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); //从字符串获取simpleXML对象
            $MsgType = $postObj->MsgType; //消息类型            
            //file_put_contents("log.php",'消息类型:'.$MsgType."\n".$postStr."\n",FILE_APPEND);//记录用户发送的消息

            switch ($MsgType) {
                case 'text'://文本消息(表情也是文本类型消息)
                    echo $this->responseText($postObj);
                    break;

                case 'image'://图片消息             
                    echo $this->responseImage($postObj);
                    break;

                case 'voice'://语音消息             
                    echo $this->responseVoice($postObj);
                    break;

                case 'video'://视频消息
                    echo $this->responseVideo($postObj);
                    break;

                case 'shortvideo'://小视频消息 
                    $postObj->MediaId = 'QqEwwmMUL9LbGMDaaR3w1XWX0mNz_tVfsHjc_QZSom8f_TIcQw3DvjdKXuLmEVYV';
                    $postObj->ThumbMediaId = '4pdOpiLdN7eT9NnX1cOpS7illQtlxpcNdWVLxBDEROugx3Y571U_ssXbn6Sjlw1V';
                    echo $this->responseShortvideo($postObj);
                    break;

                case 'location'://地理位置消息
                    echo $this->responseLocation($postObj);
                    break;

                case 'link'://链接消息 
                    echo $this->responseLink($postObj);
                    break;

                case 'event'://接收事件推送           
                    echo $this->responseEvent($postObj);
                    break;

                case 'transfer_customer_service'://消息转发到多客服
                    $content = 'test';
                    echo $this->_sendLink($fromUsername, $toUsername, $time, $content, $msgId);
                    break;

                default ://其它类型消息  
                    echo $this->responseText($postObj);
            }
        } else {
            exit('');
        }
    }

############################################################################################################----私有发送方法start
    //接入服务验证
    public function valid() {
        $echoStr = $_GET["echostr"]; //随机字符串
        $signature = $_GET["signature"]; //微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数
        $timestamp = $_GET["timestamp"]; //时间戳
        $nonce = $_GET["nonce"]; //随机数   

        if (!$this->_token) {
            throw new Exception('TOKEN没有定义!');
        }

        $tmpArr = array($this->_token, $timestamp, $nonce); //将token、timestamp、nonce三个参数进行字典序排序
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr); //将三个参数字符串拼接成一个字符串进行sha1加密
        echo ($tmpStr == $signature) ? $echoStr : ''; //开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 
    }

    /**
     * 回复文本类型消息
     * @access private 私有方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $Content 回复文本内容  
     */
    private function _sendTextMsg($FromUserName, $ToUserName, $Content) {
        //回复文本类型消息模板
        $TextTpl = "
                    
                    
                    " . time() . "
                    
                    
                    ";
        return sprintf($TextTpl, $FromUserName, $ToUserName, $Content);
    }

############################################################################################################----私有发送方法end   
############################################################################################################----response

    /**
     * 回复文本类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $Content 回复文本内容  
     */
    protected function responseText($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = $postObj->CreateTime; //消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)         
        $Content = $postObj->Content; //文本消息内容   

        switch ($Content) {

            case '?':
            case '帮助':
            case 'help':
                $Content = '【菜单】--HELPER帮助手册!' . "\n";
                $Content .= '[?]输入(?,帮助,help)获取帮助!' . "\n";
                $Content .= '[1]输入(1,新闻,news)获取图文!' . "\n";
                $Content .= '[2]输入(2,GET)获取GET参数!' . "\n";
                $Content .= '[3]输入(3)获取超链接!' . "\n";
                $Content .= '[4]输入(4)获取access_token!' . "\n";
                $Content .= '[5]输入(5)获取菜单' . "\n";
                $Content .= '[6]输入(6)获取微信ip地址!' . "\n";
                $Content .= '[7]输入(7)设置菜单!' . "\n";
                $Content .= '[8]输入(8)删除菜单!' . "\n";
                $Content .= '[9]输入(9)获取用户列表!' . "\n";
                $Content .= '[10]输入(10)长连接转短链接!' . "\n";
                $Content .= '[11]输入(11)微信智能接口!' . "\n";
                $Content .= '[12]输入(12)单独获取用户!' . "\n";
                $Content .= '[13]输入(13)批量获取用户!' . "\n";
                $Content .= '[14]输入(14)设置备注名!' . "\n";
                $Content .= '[15]输入(15)设置标签,不能重复!' . "\n";
                $Content .= '[16]输入(16)获取标签!' . "\n";
                $Content .= '[17]输入(17)更新标签!' . "\n";
                $Content .= '[18]输入(18)删除标签!' . "\n";
                $Content .= '[19]输入(19)获取标签下粉丝!' . "\n";
                $Content .= '[20]输入(20)批量为用户打标签!' . "\n";
                $Content .= '[21]输入(21)批量为用户去标签!' . "\n";
                $Content .= '[22]输入(22)获取用户标签列表!' . "\n";
                $Content .= '[23]输入(23)获取公众号黑名单!' . "\n";
                $Content .= '[24]输入(24)设置拉黑用户!' . "\n";
                $Content .= '[25]输入(25)取消拉黑用户!' . "\n";
                $Content .= '[26]输入(26)临时二维码int型!' . "\n";
                $Content .= '[27]输入(27)临时二维码string型!' . "\n";
                $Content .= '[28]输入(28)永久二维码int型!' . "\n";
                $Content .= '[29]输入(29)永久二维码string型!' . "\n";
                $Content .= '[30]输入(30)用ticket换取二维码!' . "\n";
                $Content .= '[31]输入(31)获取用户增减数据!' . "\n";
                $Content .= '[32]输入(32)获取累计用户数据!' . "\n";
                $Content .= '[33]输入(33)图文分析数据接口!' . "\n";
                $Content .= '[34]输入(34)消息分析数据接口!' . "\n";
                $Content .= '[35]输入(35)接口分析数据接口!' . "\n";
                $Content .= '[36]输入(36)发送图片!' . "\n";
                $Content .= '[37]输入(37)发送语音!' . "\n";
                $Content .= '[38]输入(38)发送音乐!' . "\n";
                $Content .= '[39]输入(39)发送链接(暂无用)!' . "\n";
                $Content .= '[40]输入(40)发送小视频(暂无用)!' . "\n";
                $Content .= '[41]输入(41)发送视频(暂无用)!' . "\n";
                $Content .= '[42]输入(42)上传文件!' . "\n";
                $Content .= '[43]输入(43)获取素材总数!' . "\n";
                $Content .= '[44]输入(44)获取素材列表!' . "\n";
                $Content .= '[..]发送图片原样返回!' . "\n";
                $Content .= '[..]发送语音原样返回!' . "\n";
                $Content .= '[..]发送位置会随机返回附近学校,公交站等信息!' . "\n";
                $Content .= '[..]输入其它文字则聊天机器人响应给微信用户!' . "\n";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 1:
            case 'news':
            case '新闻'://图文news 
                $Articles = array(
                    array('Title' => '欢迎关注我', 'Description' => 'Dragoners.li 2013.12.23', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '七', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '夕', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '情', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '人', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '节', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '快', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                    array('Title' => '乐', 'Description' => '描述一', 'PicUrl' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0', 'Url' => 'http://wx.qlogo.cn/mmopen/Q3auHgzwzM5cbPqO7GLSGhDVYQdUibUu4s1qOsHQPF9hZlN2QLKvPfAgeyAU3iapgjzziaVd0pPhaSCqyeRuEPBrQ/0'),
                );
                echo $this->responseNews($FromUserName, $ToUserName, $Articles);
                break;

            case 2:
            case 'GET': //获取GET参数   
                echo $this->_sendTextMsg($FromUserName, $ToUserName, json_encode($_GET));
                break;

            case 3: //超链接
                $Content = "百度一下";
                $Content.= " || http://www.baidu.com";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 4: //获取access_token
                $Content = $this->getAccessToken();
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 5: //获取菜单
                $Content = $this->getMenu();
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 6: //获取微信ip地址
                $Content = $this->getWeChatIp();
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 7: //设置菜单
                $data = <<setMenu($data);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 8: //删除菜单
                $Content = $this->delMenu();
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 9://获取用户列表 
                $UserList = $this->getUserList();
                $Content = json_encode($UserList);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 10: //短链接
                $data = array('action' => 'long2short', 'long_url' => 'http://dragonersli.github.io/');
                $Content = $this->getShortUrl($data); //返回短链接地址
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 11://微信智能接口 
                $data['query'] = '杭州到厦门火车票';
                $data['city'] = '杭州';
                $data['category'] = 'flight,hotel,weather,train';
                $data['appid'] = $this->_appID;
                $data['uid'] = 'oLjeBuHzd9SWstbNnukN7uv2ES1k';
                $Content = $this->sendSemantic($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 12: //单独获取用户
                $data = array('openid' => 'oLjeBuHzd9SWstbNnukN7uv2ES1k', 'lang' => 'zh_CN');
                $Content = $this->getUserInfo($data); //单独获取 
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 13: //批量获取用户
                $data = array(
                    'user_list' => array(
                        array('openid' => 'oLjeBuCC9qrbqSSQnIaTmzUxJhIE', 'lang' => 'zh_CN'),
                        array('openid' => 'oLjeBuH1k2aaz3MxdYq8krdTJCqs', 'lang' => 'zh_CN')
                    )
                );
                $Content = $this->getUserInfo($data); //批量获取 
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 14://设置备注名
                $data = array('openid' => 'oLjeBuHzd9SWstbNnukN7uv2ES1k', 'remark' => '李世龙');
                $Content = $this->setRemark($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 15://设置标签,不能重复
                $data = array('tag' => array('name' => 'test'));
                $Content = $this->setTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 16://获取标签 
                $Content = $this->getTags();
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 17://更新标签
                $data = array('tag' => array('id' => 125, 'name' => 'testabc'));
                $Content = $this->upTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 18://删除标签 
                $data = array('tag' => array('id' => 125));
                $Content = $this->delTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 19://获取标签下粉丝
                $data = array('tagid' => 2, 'next_openid' => '');
                $Content = $this->getTagsUser($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 20://批量为用户打标签
                $data = array('openid_list' => array('oLjeBuKBI6hNtLGLnQGBeCPxlIIg', 'oLjeBuEy2SfJd3LD4ae3UAkAgBBg'), 'tagid' => 125);
                $Content = $this->setUserTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 21://批量为用户去标签
                $data = array('openid_list' => array('oLjeBuKBI6hNtLGLnQGBeCPxlIIg', 'oLjeBuEy2SfJd3LD4ae3UAkAgBBg'), 'tagid' => 125);
                $Content = $this->delUserTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 22://获取用户身上的标签列表
                $data = array('openid' => 'oLjeBuKBI6hNtLGLnQGBeCPxlIIg');
                $Content = $this->getUserTags($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 23://获取公众号的黑名单列表
                $data = array('begin_openid' => '');
                $Content = $this->getBlackList($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 24://设置拉黑用户
                $data = array('opened_list' => array('oLjeBuCC9qrbqSSQnIaTmzUxJhIE', 'oLjeBuHzd9SWstbNnukN7uv2ES1k'));
                $Content = $this->setBlackList($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 25://取消拉黑用户
                $data = array('opened_list' => array('oLjeBuCC9qrbqSSQnIaTmzUxJhIE', 'oLjeBuHzd9SWstbNnukN7uv2ES1k'));
                $Content = $this->delBlackList($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 26://临时二维码int    
                $Content = $this->setQrcode($data = 123, $type = 0, $expire_seconds);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 27://临时二维码str    
                $Content = $this->setQrcode($data = 'test', $type = 1, $expire_seconds);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 28://永久二维码int   
                $Content = $this->setQrcode($data = 123, $type = 2);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 29://永久二维码str   
                $Content = $this->setQrcode($data = 'test', $type = 3);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 30://通过ticket换取二维码  
                $Content = $this->setQrcode($data = 'test', $type = 3);
                //$Content = json_encode($Content); 
                $file = 'qrcode.jpeg';
                $this->getQrcode($Content->ticket, $file);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, 'http://quda.septwolves.cn/' . $file);
                break;

            case 31://获取用户增减数据
                $data = array('begin_date' => date('2017-08-21'), 'end_date' => date('2017-08-27'));
                $Content = $this->getUserSC($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 32://获取累计用户数据 
                $data = array('begin_date' => date('2017-08-24'), 'end_date' => date('2017-08-25'));
                $Content = $this->getUserSC($data, 0);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 33://图文分析数据接口 
                $data = array('begin_date' => date('2017-08-18'), 'end_date' => date('2017-08-18'));
                $Content = $this->getArticleSC($data, 0);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 34://消息分析数据接口 
                $data = array('begin_date' => date('2016-08-18'), 'end_date' => date('2016-08-18'));
                $Content = $this->getUpStremMsg($data, 0);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 35://接口分析数据接口
                $data = array('begin_date' => date('2016-08-18'), 'end_date' => date('2016-08-18'));
                $Content = $this->getInterface($data, 1);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 36:////发送图片(MediaId会过期) 
                $postObj->MediaId = 'ytjjOxXoaI7cTbS__0KJvJUVFVHfkHymr1fLQTyKx6D-QI4yjXUfdCG8BclXavgk'; //图片消息媒体id,可以调用多媒体文件下载接口拉取数据。   
                echo $this->responseImage($postObj);
                break;

            case 37://语音(MediaId会过期)
                $postObj->MediaId = 'lsqKNHUUy1z5lomHmQiqJgk8n_ChKDeAOQAPY7ag8aRKqt3AF3EKeUJLcPnecMlp'; //语音消息媒体id,可以调用多媒体文件下载接口拉取数据。 
                echo $this->responseVoice($postObj);
                break;

            case 38://音乐music
            case 'music':
            case '音乐':
                $postObj->ThumbMediaId = '8zEV7SrAvoAmv2WWD7Z3owf14A2LFXmAPVHuUPOjRQnx28Uh9Zr-d0hfXKmqiPbB';
                $postObj->Title = "测试音乐发送";
                $postObj->Description = "DragonersLi专辑";
                $postObj->MusicUrl = "http://so1.111ttt.com:8282/2017/4/05m/10/298101104389.m4a?tflag=1503583813&pin=1f08816f2b7b487ad249dd680cf931aa&ip=115.192.190.0#.mp3";
                $postObj->HQMusicUrl = 'http://so1.111ttt.com:8282/2017/4/05m/10/298101104389.m4a?tflag=1503583813&pin=1f08816f2b7b487ad249dd680cf931aa&ip=115.192.190.0#.mp3'; //高质量音乐链接,WIFI环境优先使用该链接播放音乐
                echo $this->responseMusic($postObj);
                break;

            case 39://链接link  (暂无用)
                echo $this->responseLink($postObj);
                break;

            case 40://小视频Shortvideo  (暂无用)
                echo $this->responseShortvideo($postObj);
                break;

            case 41://视频Video  (暂无用)
                echo $this->responseVideo($postObj);
                break;

            case 42://上传文件根据media_id获取上传的文件 (image,video,thumb)
                $Content = $this->setUpLoadFile($file = './qrcode.jpeg', $type = 'image'); //上传图片文件
                $FileName = $this->getUpLoadImage($Content, $ext = '.jpeg'); //获取上传的图片
                echo $this->_sendTextMsg($FromUserName, $ToUserName, 'http://quda.septwolves.cn/' . $FileName);
                break;

            case 43: //获取素材总数
                $Content = $this->getMaterialCount();
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 44: //获取素材列表(image、video、voice、news)
                $data = array('type' => 'image', 'offset' => 0, 'count' => 20);
                $Content = $this->getMaterialList($data);
                $Content = json_encode($Content);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            default://聊天机器人响应给微信用户   

                $url = 'http://api.douqq.com/?key=dWFQRnZHa2d3cU1lemtRPXZEUT1lTno1QXdvQUFBPT0&msg=' . $Content;
                //$Content = '机器人回答不了你的,他爸爸可以回答! '; 
                $Content = func_send_request($url);
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
        }
    }

    /**
     * 回复图片类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $MediaId 回复通过素材管理中的接口上传多媒体文件,得到的id
     */
    protected function responseImage($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = time(); //$postObj->CreateTime;//消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)
        $PicUrl = $postObj->PicUrl; //图片链接(由系统生成)
        $MediaId = $postObj->MediaId; //图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

        if (empty($MediaId)) {
            $MediaId_Arr = array(
                'ytjjOxXoaI7cTbS__0KJvJUVFVHfkHymr1fLQTyKx6D-QI4yjXUfdCG8BclXavgk',
                'ytjjOxXoaI7cTbS__0KJvJUVFVHfkHymr1fLQTyKx6D-QI4yjXUfdCG8BclXavgk',
            );
            $Rand_Key = mt_rand(0, count($MediaId_Arr) - 1);
            $MediaId = $MediaId_Arr[$Rand_Key];
        }
        //回复图片类型消息模板
        $ImageTpl = "
                    
                    
                    %s
                    
                    
                    
                    
                    ";
        return sprintf($ImageTpl, $FromUserName, $ToUserName, $CreateTime, $MediaId);
    }

    /**
     * 回复语音类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $MediaId 回复通过素材管理中的接口上传多媒体文件,得到的id
     */
    protected function responseVoice($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = time(); //$postObj->CreateTime;//消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)
        $Format = $postObj->Format; //语音格式,如amr,speex等
        $MediaId = $postObj->MediaId; //语音消息媒体id,可以调用多媒体文件下载接口拉取数据。

        if (empty($MediaId)) {
            $MediaId_Arr = array(
                'iEuuFm_y9rADnKs9sncvwF7odJV0RO1qoeXVELwSuOp9dSfjujeTMf0359ycxNry',
                '9LKafxeFynf5YKNJ7OZajpf9hBw-tlO5teiMhH8qcgd3SLc3zuSryLJ2T94q_2iI',
            );
            $Rand_Key = mt_rand(0, count($MediaId_Arr) - 1);
            $MediaId = $MediaId_Arr[$Rand_Key];
        }
        //回复语音类型消息模板
        $VoiceTpl = "
                    
                    
                    %s
                    
                    
                    
                    
                    ";
        echo sprintf($VoiceTpl, $FromUserName, $ToUserName, $CreateTime, $MediaId);
    }

    /**
     * 回复视频类型消息 Receive
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $MediaId 回复通过素材管理中的接口上传多媒体文件,得到的id
     */
    protected function responseVideo($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = time(); //$postObj->CreateTime;//消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)
        $ThumbMediaId = $postObj->ThumbMediaId; //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
        $MediaId = $postObj->MediaId; //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。

        $Title = "测试视频标题";
        $Description = "测试视频描述";
        if (empty($MediaId)) {
            $MediaId = 'QqEwwmMUL9LbGMDaaR3w1XWX0mNz_tVfsHjc_QZSom8f_TIcQw3DvjdKXuLmEVYV';
            $ThumbMediaId = '4pdOpiLdN7eT9NnX1cOpS7illQtlxpcNdWVLxBDEROugx3Y571U_ssXbn6Sjlw1V';
        }
        //回复视频类型消息模板
        $VideoTpl = "
                    
                    
                    %s
                    
                     
                    ";
        return sprintf($VideoTpl, $FromUserName, $ToUserName, $CreateTime, $MediaId, $Title, $Description);
    }

    /**
     * 回复小视频类型消息 Receive
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $MediaId 回复通过素材管理中的接口上传多媒体文件,得到的id
     */
    protected function responseShortvideo($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = $postObj->CreateTime; //消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)
        $ThumbMediaId = $postObj->ThumbMediaId; //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
        $MediaId = $postObj->MediaId; //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 

        if (empty($MediaId)) {
            $MediaId = 'QqEwwmMUL9LbGMDaaR3w1XWX0mNz_tVfsHjc_QZSom8f_TIcQw3DvjdKXuLmEVYV';
            $ThumbMediaId = '4pdOpiLdN7eT9NnX1cOpS7illQtlxpcNdWVLxBDEROugx3Y571U_ssXbn6Sjlw1V';
        }
        //回复小视频类型消息模板
        $ShortvideoTpl = "
                        
                        
                        %s
                        
                        
                        
                        %s
                        ";
        return sprintf($ShortvideoTpl, $FromUserName, $ToUserName, $CreateTime, $MediaId, $ThumbMediaId, $MsgId);
    }

    /**
     * 回复音乐类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $MediaId 回复通过素材管理中的接口上传多媒体文件,得到的id
     */
    protected function responseMusic($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = time(); //$postObj->CreateTime;//消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)
        $ThumbMediaId = $postObj->ThumbMediaId; //视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
        $MediaId = $postObj->MediaId; //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。 
        $Title = $postObj->Title; // 
        $Description = $postObj->Description; // 
        $MusicUrl = $postObj->MusicUrl; // 
        $HQMusicUrl = $postObj->HQMusicUrl; // 


        if (empty($ThumbMediaId)) {

            $Title = "一千个伤心的理由";
            $Description = "张学友专辑";
            $MusicUrl = "http://so1.111ttt.com:8282/2017/4/05m/10/298101104389.m4a?tflag=1503583813&pin=1f08816f2b7b487ad249dd680cf931aa&ip=115.192.190.0#.mp3";
            $HQMusicUrl = 'http://so1.111ttt.com:8282/2017/4/05m/10/298101104389.m4a?tflag=1503583813&pin=1f08816f2b7b487ad249dd680cf931aa&ip=115.192.190.0#.mp3'; //高质量音乐链接,WIFI环境优先使用该链接播放音乐
            $ThumbMediaId = '8zEV7SrAvoAmv2WWD7Z3owf14A2LFXmAPVHuUPOjRQnx28Uh9Zr-d0hfXKmqiPbB';
        }
        //回复音乐类型消息模板
        $MusicTpl = "
                    
                    
                    %s
                    
                    
                    <![CDATA[%s]]>
                    
                    
                    
                    
                    
                    ";
        return sprintf($MusicTpl, $FromUserName, $ToUserName, $CreateTime, $Title, $Description, $MusicURL, $HQMusicUrl, $ThumbMediaId);
    }

    /**
     * 根据地理位置回复图文类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     * @param $Location_X  
     * @param $Location_Y  
     * @param $Scale  
     * @param $Label
     * @return 
     */
    protected function responseLocation($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = $postObj->CreateTime; //消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)

        $Location_X = $postObj->Location_X; //地理位置维度
        $Location_Y = $postObj->Location_Y; //地理位置经度
        $Scale = $postObj->Scale; //地图缩放大小
        $Label = $postObj->Label; //地理位置信息   
        // 利用位置获取信息
        //位置静态图片:
        //http://api.map.baidu.com/staticimage?center=120.144787,30.277945&width=80&height=80&zoom=11 
        //位置跳转url:
        //http://api.map.baidu.com/staticimage?width=80&height=80¢er=120.144787,30.277945&zoom=15&markers=120.144787,30.277945&markerStyles=l,
        //百度LBS圆形范围查询:
        //域名:http://api.map.baidu.com ;服务名:staticimage; 版本号:v2

        $url = 'http://api.map.baidu.com/place/v2/search?query=%s&location=%s&radius=%s&output=%s&ak=%s';

        $Query_Arr = array('酒店', '医院', '学校', '饭店', '超市', 'KTV', '电影院', '景点', '公交站', '加油站', '便利店', '卫生间');
        $Rand_Key = mt_rand(0, count($Query_Arr) - 1);
        $query = $Query_Arr[$Rand_Key];

        $location = $Location_X . ',' . $Location_Y;
        $radius = 2000;
        $output = 'json';
        $ak = '8ca41b249958ea355cf084a22b5d5e9c'; //用户的访问密钥 //482ff15b50811908fe1abba5977b8d98
        $url = sprintf($url, urlencode($query), $location, $radius, $output, $ak);
        $res = func_send_request($url);
        $obj = json_decode($res);
        $list = array();
        if (!$obj->status) {//返回信息 message:ok
            foreach ($obj->results as $k => $v) {
                if ($k < 8) {//以前最多news返回10条记录,现在最多8条,多了,全不返回
                    $width = $k ? 80 : 640;
                    $hight = $k ? 80 : 640;
                    $Articles[$k]['Title'] = $v->name;
                    $Articles[$k]['Description'] = " 地址:" . $v->address . ( empty($v->telephone) ? '' : " 电话:" . $v->telephone );
                    $Articles[$k]['PicUrl'] = "http://api.map.baidu.com/staticimage?width=" . $width . "&height=" . $hight . "¢er=" . $v->location->lng . ',' . $v->location->lat . "&zoom=15&markers=" . $v->location->lng . ',' . $v->location->lat . "&markerStyles=l,";
                    $Articles[$k]['Url'] = "http://api.map.baidu.com/place/detail?uid=" . $v->uid . "&output=html&src=" . $v->name . "&output=html";
                }
            }

            echo $this->responseNews($FromUserName, $ToUserName, $Articles);
        } else {
            $Content = '获取位置信息失败!\n 你的坐标为:\n 经度:' . $Location_Y . ',纬度:' . $Location_X . "\n" . '你所在的位置为:' . $Label;
            echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
        }
    }

    /**
     * 回复链接消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者 
     * @return 
     */
    protected function responseLink() {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = time(); //$postObj->CreateTime;//消息创建时间(整型)
        $MsgId = $postObj->MsgId ? $postObj->MsgId : 0; //消息ID(64位整型)(事件类型无此字段)

        $Title = '百度'; //消息标题
        $Description = '百度一下,你就知道!'; //消息描述
        $Url = 'http://www.baidu.com/'; //消息链接
        //回复链接消息模板
        $LinkTpl = "
                    
                    
                    %s
                    
                    <![CDATA[%s]]>
                    
                    
                    %s
                    ";
        return sprintf($LinkTpl, $FromUserName, $ToUserName, $CreateTime, $Title, $Description, $Url, $MsgId);
    }

    /**
     * 回复图文类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者
     */
    protected function responseNews($FromUserName, $ToUserName, $Articles = array()) {


        $ArticleCount = count($Articles);

        //回复图文类型消息模板
        $NewsTpl = "  
                    
                    
                    " . time() . "
                     
                    %s
                    ";
        foreach ($Articles as $k => $v) {
            $NewsTpl.= "
                    <![CDATA[{$v['Title']}]]> 
                    
                    
                    
                    ";
        }
        $NewsTpl.="
                   ";
        return sprintf($NewsTpl, $FromUserName, $ToUserName, $ArticleCount);
    }

    /**
     * 回复事件类型消息
     * @access protected 受保护方法
     * @param $FromUserName 发送者
     * @param $ToUserName 接收者 
     * @return 
     */
    protected function responseEvent($postObj) {

        $FromUserName = $postObj->FromUserName; //发送者账号
        $ToUserName = $postObj->ToUserName; //接收者账号
        $CreateTime = $postObj->CreateTime; //消息创建时间(整型) 
        $Event = $postObj->Event; //事件类型 

        switch ($Event) {

            case 'subscribe'://subscribe(订阅)                
                $Content = "欢迎订阅我!~";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'unsubscribe'://unsubscribe(取消订阅)  
                $Content = "不要离开我!/(ㄒoㄒ)/~~";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'scancode_push'://扫码推事件  
            case 'scancode_waitmsg'://扫码带提示 

                $EventKey = $postObj->EventKey; //由开发者在创建菜单时设定事件KEY值,qrscene_为前缀,后面为二维码的参数值 
                $ScanCodeInfo = $postObj->ScanCodeInfo; //扫描信息
                $ScanType = $postObj->ScanType; // 扫描类型,一般是qrcode
                $ScanResult = $postObj->ScanResult; // 扫描结果,即二维码对应的字符串信息 
                $Content = $Event . "---" . $EventKey . "---" . $ScanCodeInfo . "---" . $ScanType . "---" . $ScanResult . "---scancode_push || scancode_waitmsg";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'pic_sysphoto'://弹出系统拍照发图的事件推送 
            case 'pic_photo_or_album'://弹出拍照或者相册发图的事件推送
            case 'pic_weixin'://弹出微信相册发图器的事件推送 

                $EventKey = $postObj->EventKey; //事件KEY值,由开发者在创建菜单时设定,qrscene_为前缀,后面为二维码的参数值 
                $SendPicsInfo = $postObj->SendPicsInfo; // 发送的图片信息 
                $Count = $postObj->Count; // 发送的图片数量
                $PicList = $postObj->PicList; //图片列表
                $PicMd5Sum = $postObj->PicMd5Sum; //图片的MD5值,开发者若需要,可用于验证接收到图片
                $Content = $Event . "---" . $EventKey . "---" . $SendPicsInfo . "---" . $Count . "---" . $PicList . "---" . $PicMd5Sum . "---pic_sysphoto || pic_photo_or_album || pic_weixin";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'location_select'://弹出地理位置选择器的事件推送 
                $EventKey = $postObj->EventKey; //事件KEY值,由开发者在创建菜单时设定,qrscene_为前缀,后面为二维码的参数值 
                if ($EventKey == 'location_1') {//事件,位置  
                    //如果菜单type为location_select,且key为location_1则执行此步骤!
                }
                $SendLocationInfo = $postObj->SendLocationInfo; // 发送的位置信息
                $Location_X = $postObj->Location_X; // X坐标信息
                $Location_Y = $postObj->Location_Y; // Y坐标信息
                $Scale = $postObj->Scale; //精度,可理解为精度或者比例尺、越精细的话 scale越高
                $Label = $postObj->Label; //地理位置的字符串信息
                $Poiname = $postObj->Poiname; //朋友圈POI的名字,可能为空
                $Content = $Event . "---" . $EventKey . "---" . $SendLocationInfo . "---" . $Location_X . "---" . $Location_Y . "---" . $Scale . "---" . $Label . "---" . $Poiname . "---location_select";
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'qualification_verify_success'://资质认证成功(此时立即获得接口权限) 
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'qualification_verify_fail'://资质认证失败
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'naming_verify_success'://名称认证成功(即命名成功)
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'naming_verify_fail'://名称认证失败(这时虽然客户端不打勾,但仍有接口权限)
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'annual_renew'://年审通知 
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'verify_expired'://认证过期失效通知
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'SCAN'://扫描带参数二维码事件            
                $EventKey = $postObj->EventKey; //事件KEY值,qrscene_为前缀,后面为二维码的参数值
                $Ticket = $postObj->Ticket; //二维码的ticket,可用来换取二维码图片 
                $Content = '你点击了菜单,携带的KEY为: ' . $EventKey . "\n Ticket为:" . $Ticket;
                $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'LOCATION'://上报地理位置事件;提供位置信息按钮打开,每次进入客户端都会发送位置给公众账号
                $Latitude = $postObj->Latitude; //地理位置纬度
                $Longitude = $postObj->Longitude; //地理位置经度
                $Precision = $postObj->Precision; //地理位置精度 
                //location_1
                $Content = "\n 你的上报地理位置为: \n 维度:" . $Latitude . "\n 经度:" . $Longitude . "\n 精度:" . $Precision;
                //file_put_contents('./location.php',$Content,FILE_APPEND);


                if (!file_exists('./location.php')) {//地理位置文件不存在   
                    $Content.= "①点击公众账号资料!\r ②打开提供位置信息,点击确定!\r ③退出然后重新进入就OK啦!~";
                }
                $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'CLICK'://自定义菜单事件
                $EventKey = $postObj->EventKey; //事件KEY值,qrscene_为前缀,后面为二维码的参数值  

                switch ($EventKey) {
                    case 'CLICK_UNBD'://解除绑定
                        $Content = '解除绑定成功!';
                        break;

                    case 'CLICK_1_1':
                        $Content = "查看我申请的淘宝任务信息,请点击这里
                                    \n查看我申请的新浪任务信息,请点击这里
                                    \n查看我申请的百度任务信息,请点击这里";
                        break;

                    default:
                        $Content = '你点击了菜单,携带的KEY为: ' . $EventKey;
                }
                echo $this->_sendTextMsg($FromUserName, $ToUserName, $Content);
                break;

            case 'VIEW'://点击菜单跳转事件
                //Event类型为VIEW时,$EventKey为菜单设置的跳转url    
                $this->_sendTextMsg($FromUserName, $ToUserName, $EventKey);
                break;
        }
    }

############################################################################################################----response
// 创建标签 
//标签名(30个字符以内)
    public function setTags($data) {

        if (!empty($data['tag']['name'])) {//创建标签
            $url = 'https://api.weixin.qq.com/cgi-bin/tags/create?access_token=' . $this->getAccessToken();
            $data = json_encode($data);
            $data = func_send_request($url, $data);
            //file_put_contents('tags.php',$data);
            $obj = json_decode($data);
            return $obj->tag->id ? $obj : $obj->errmsg;
        }
    }

//更新标签
//标签名(30个字符以内)
    public function upTags($data) {

        if (!empty($data['tag']['id']) && !empty($data['tag']['name'])) {//更新标签 
            $url = 'https://api.weixin.qq.com/cgi-bin/tags/update?access_token=' . $this->getAccessToken();
            $data = json_encode($data);
            $data = func_send_request($url, $data);
            //file_put_contents('tags.php',$data);
            $obj = json_decode($data);
            return $obj->errcode ? '更新失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '更新成功!成功信息为:' . $obj->errmsg;
        }
    }

//删除标签
//标签名(30个字符以内)
    public function delTags($data) {

        if (!empty($data['tag']['id'])) {//删除标签 
            $url = 'https://api.weixin.qq.com/cgi-bin/tags/delete?access_token=' . $this->getAccessToken();
            $data = json_encode($data);
            $data = func_send_request($url, $data);
            //file_put_contents('tags.php',$data);
            $obj = json_decode($data);
            return $obj->errcode ? '删除失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '删除成功!成功信息为:' . $obj->errmsg;
        }
    }

//获取标签
    public function getTags() {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/get?access_token=' . $this->getAccessToken();
        $data = func_send_request($url);
        //file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj;
    }

//获取标签下粉丝列表 
    public function getTagsUser($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/user/tag/get?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        //file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '获取标签下粉丝列表失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : $obj;
    }

//批量为用户打标签
    public function setUserTags($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchtagging?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        //file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '批量为用户打标签失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '批量为用户打标签成功!成功信息为:' . $obj->errmsg;
    }

//批量为用户去标签
    public function delUserTags($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchuntagging?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        // file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '批量为用户去标签失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '批量为用户去标签成功!成功信息为:' . $obj->errmsg;
    }

//获取用户身上的标签列表
    public function getUserTags($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/getidlist?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        // file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '批量为用户去标签失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : $obj->tagid_list;
    }

//获取公众号的黑名单列表
    public function getBlackList($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/members/getblacklist?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        //file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '获取公众号的黑名单列表失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : $obj;
    }

//拉黑用户
    public function setBlackList($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchblacklist?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        // file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '拉黑用户失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '拉黑用户成功!成功信息为:' . $obj->errmsg;
    }

//取消拉黑用户
    public function delBlackList($data) {
        $url = 'https://api.weixin.qq.com/cgi-bin/tags/members/batchunblacklist?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $data = func_send_request($url, $data);
        // file_put_contents('tags.php',$data);
        $obj = json_decode($data);
        return $obj->errcode ? '取消拉黑用户失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '取消拉黑用户成功!成功信息为:' . $obj->errmsg;
    }

//临时二维码请求说明
//expire_seconds:该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
//action_name:二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值
//action_info:二维码详细信息
//scene_id:场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)
//scene_str:场景值ID(字符串形式的ID),字符串类型,长度限制为1到64   
//临时二维码int
//{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} 
//临时二维码str
// {"expire_seconds": 604800, "action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}} 
//永久二维码int
//{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}
//永久二维码str
//{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}

    public function setQrcode($data, $type = 0, $expire_seconds = 604800) {
        switch ($type) {
            case 0:
            default:
                $arr['expire_seconds'] = $expire_seconds;
                $arr['action_name'] = 'QR_SCENE';
                $arr['action_info'] = array('scene' => array('scene_id' => $data));
                break;


            case 1:
                $arr['expire_seconds'] = $expire_seconds;
                $arr['action_name'] = 'QR_STR_SCENE';
                $arr['action_info'] = array('scene' => array('scene_str' => $data));
                break;


            case 2:
                $arr['action_name'] = 'QR_LIMIT_SCENE';
                $arr['action_info'] = array('scene' => array('scene_id' => $data));
                break;


            case 3:
                $arr['action_name'] = 'QR_LIMIT_STR_SCENE';
                $arr['action_info'] = array('scene' => array('scene_str' => $data));
                break;
        }
        $url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=' . $this->getAccessToken();
        $data = json_encode($arr);
        $data = func_send_request($url, $data);
        $obj = json_decode($data);
        return $obj;
    }

    /*
     * 通过ticket换取二维码
     * HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
     * 提醒:TICKET记得进行UrlEncode
     * @param $content
     * @param $file './Public/images/'.time().'.jpg'
     * @param $type
     * @param $expire
     * */

    public function getQrcode($ticket, $file = false) {

        $url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' . urlencode($ticket);
        $res = file_get_contents($url);

        if ($file) {
            file_put_contents($file, $res);
        } else {
            header('Content-Type: image/jpeg');
            echo $res;
        }
    }

    /*
     * 获取用户增减数据 
     * 获取累计用户数据
     * @param $begin_date  获取数据的起始日期,begin_date和end_date的差值需小于“最大时间跨度”(比如最大时间跨度为1时,begin_date和end_date的差值只能为0,才能小于1),否则会报错  
     * @param $end_date    获取数据的结束日期,end_date允许设置的最大值为昨日
      最大时间跨度是指一次接口调用时最大可获取数据的时间范围,如最大时间跨度为7是指最多一次性获取7天的数据。access_token的实际值请通过“获取access_token”来获取。
      ref_date  数据的日期
      user_source   用户的渠道,数值代表的含义如下:
      0代表其他合计 1代表公众号搜索 17代表名片分享 30代表扫描二维码 43代表图文页右上角菜单 51代表支付后关注(在支付完成页) 57代表图文页内公众号名称 75代表公众号文章广告 78代表朋友圈广告
      new_user  新增的用户数量
      cancel_user   取消关注的用户数量,new_user减去cancel_user即为净增用户数量
      cumulate_user 总用户量
     * return    getusersummary  getusercumulate
      $wechat->getUserSC($type='getusersummary',array('begin_date'=>'','end_date'=>''));
      $wechat->getUserSC($type='getusercumulate',array('begin_date'=>'','end_date'=>''));

     */

    public function getUserSC($data = array(), $type = 0) {
        $type = $type ? 'getusersummary' : 'getusercumulate';
        $url = 'https://api.weixin.qq.com/datacube/' . $type . '?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $res = json_decode($res);
        return isset($res->errcode) ? $res->errmsg : $res->list;
    }

//图文分享数据接口
    public function getArticleSC($data = array(), $type = 0) {

        switch ($type) {
            case 0:
            default:
                $type = 'getarticlesummary'; //获取图文群发每日数据 1day
                break;

            case 1:
                $type = 'getarticletotal'; //获取图文群发总数据 1day 
                break;

            case 2:
                $type = 'getuserread'; //获取图文统计数据 3day
                break;

            case 3:
                $type = 'getuserreadhour'; //获取图文统计分时数据 1day
                break;

            case 4:
                $type = 'getusershare'; //获取图文分享转发数据 7day
                break;

            case 5:
                $type = 'getusersharehour'; //获取图文分享转发分时数据 1day
                break;
        }
        $url = 'https://api.weixin.qq.com/datacube/' . $type . '?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $res = json_decode($res);
        return isset($res->errcode) ? $res->errmsg : $res->list;
    }

//消息分析数据接口
    public function getUpStremMsg($data, $type = 0) {

        switch ($type) {
            case 0:
            default:
                $type = 'getupstreammsg'; //获取消息发送概况数据 7day
                break;

            case 1:
                $type = 'getupstreammsghour'; //获取消息分送分时数据 1day
                break;

            case 2:
                $type = 'getupstreammsgweek'; //获取消息发送周数据 30day
                break;

            case 3:
                $type = 'getupstreammsgmonth'; //获取消息发送月数据 30day
                break;

            case 4:
                $type = 'getupstreammsgdist'; //获取消息发送分布数据 15day
                break;

            case 5:
                $type = 'getupstreammsgdistweek'; //获取消息发送分布周数据 30day
                break;

            case 6:
                $type = 'getupstreammsgdistmonth'; //获取消息发送分布月数据 30day
                break;
        }
        $url = 'https://api.weixin.qq.com/datacube/' . $type . '?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $res = json_decode($res);
        return isset($res->errcode) ? $res->errmsg : $res->list;
    }

//接口分析数据接口
    public function getInterface($data, $type = 0) {

        switch ($type) {
            case 0:
            default:
                $type = 'getinterfacesummary'; //获取接口分析数据 30day
                break;

            case 1:
                $type = 'getinterfacesummaryhour'; //获取接口分析分时数据 1day
                break;
        }
        $url = 'https://api.weixin.qq.com/datacube/' . $type . '?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $res = json_decode($res);
        return isset($res->errcode) ? $res->errmsg : $res->list;
    }

    /*
     * 用户管理,创建分组
     * @param $title 创建的分组名称
     * @return bool true false
      $wechat->setUserGroup($data = array('group'=>array('name'=>'groupname')));
     */

    public function setUserGroup($data = array()) {

        $url = 'https://api.weixin.qq.com/cgi-bin/groups/create?access_token=' . $this->getAccessToken();

        $data = json_encode($data);
        $result = $this->_requestData($url, $data, true);
        $result = json_decode($result);
        return $result->group->id ? true : false;
    }

    /*
     * 用户管理,查询所有分组
     * return    GET方式获取数据
     * groups   公众平台分组信息列表
     * id       分组id,由微信分配
     * name     分组名字,UTF8编码
     * count        分组内用户数量
      $wechat->getUserGroup();
     */

    public function getUserGroup() {

        $url = 'https://api.weixin.qq.com/cgi-bin/groups/get?access_token=' . $this->getAccessToken();

        $result = $this->_requestData($url);
        $result = json_decode($result);
        return empty($result->groups) ? array() : $result->groups;
    }

    /*
     * 查询用户所在分组
     * @param    $openID 用户OpenID
     * return    GroupID  用户分组ID
     * $wechat->getUserGroupIDbyOpenID($data = array('openid'=>'oLjeBuCC9qrbqSSQnIaTmzUxJhIE'));  
     */

    public function getUserGroupIDbyOpenID($data = array()) {

        $url = 'https://api.weixin.qq.com/cgi-bin/groups/getid?access_token=' . $this->getAccessToken();

        $data = json_encode($data);
        $result = $this->_requestData($url, $data, true);
        $result = json_decode($result);
        return $result->groupid;
    }

    /*
     * 修改分组名
     * @param    $id 分组ID   由微信分配
     * @param    $name 分组名称(30个字符以内)
     * return    bool ture false
      $wechat->resetUserGroup($data = array('group'=>array('id'=>116,'name'=>'helper')));
     */

    public function resetUserGroup($data = array()) {

        $url = 'https://api.weixin.qq.com/cgi-bin/groups/update?access_token=' . $this->getAccessToken();

        $data = json_encode($data);
        $result = $this->_requestData($url, $data, true);
        $result = json_decode($result);
        return $result->errcode ? false : true;
    }

    /*
     * 移动用户分组
     * @param    $openid 用户唯一标示
     * @param    $to_groupid 移到该分组ID 
     * @param    $openid_list 用户唯一标识符openid的列表(size不能超过50)
     * @param    $to_groupid 移到该分组ID
      $wechat->moveUserGroup($data = array('openid'=>'oLjeBuCC9qrbqSSQnIaTmzUxJhIE','to_groupid'=>0));
      $wechat->moveUserGroup($data = array('openid_list'=>array('oLjeBuH1k2aaz3MxdYq8krdTJCqs','oLjeBuM1HEGfUsL3mMxOergWhW0U'),'to_groupid'=>0));

     */

    public function moveUserGroup($data = array()) {

        if (isset($data['openid_list']) && is_array($data['openid_list'])) {//批量移动用户分组 
            $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/batchupdate?access_token=' . $this->getAccessToken();
        } else {
            $url = 'https://api.weixin.qq.com/cgi-bin/groups/members/update?access_token=' . $this->getAccessToken();
        }
        $data = json_encode($data);
        $result = $this->_requestData($url, $data, true);
        $result = json_decode($result);
        return $result->errcode ? false : true;
    }

    /*
     * 删除分组 
     * @param    $id  分组ID 
     * return    bool ture false
      $wechat->delUserGroup($data = array('group'=>array('id'=>116));
     */

    public function delUserGroup($data = array()) {

        $url = 'https://api.weixin.qq.com/cgi-bin/groups/delete?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $result = $this->_requestData($url, $data, true);
        $result = json_decode($result);
        return $result->errcode ? false : true;
    }

    /*
     * 设置备注名 
     * @param    $openid  用户标识 
     * @param    $remark  新的备注名,长度必须小于30字符 
     * return    bool ture false
      $wechat->setRemark($data = array('openid'=>'oLjeBuCC9qrbqSSQnIaTmzUxJhIE','remark'=>'备注名称'));
     */

    public function setRemark($data) {

        $url = 'https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return ($obj->errcode ? '设置备注名失败!失败信息为:' : '设置备注名成功!成功信息为:' ) . $obj->errmsg;
    }

    /*
     * 获取用户列表
     * @param $next_openid 第一个拉取的OPENID,不填默认从头开始拉取
     * total    关注该公众账号的总用户数
     * count    拉取的OPENID个数,最大值为10000
     * data 列表数据,OPENID的列表
     * next_openid  拉取列表的最后一个用户的OPENID 
     */

    public function getUserList($next_openid = '') {
        $url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=' . $this->getAccessToken() . '&next_openid=' . $next_openid;
        $res = func_send_request($url);
        return json_decode($res);
    }

    /*
     * 获取用户基本信息(包括UnionID机制)
     * @param    $openid  用户标识 
     * @param    $lang  zh_CN返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
     * return    bool ture false
      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
     * $wechat->getUserInfo($data = array('openid'=>'oLjeBuCC9qrbqSSQnIaTmzUxJhIE','lang'=>'zh_CN'));//单独获取
     * $wechat->getUserInfo($data = 
      array('user_list'=>
      array(
      array('openid'=>'oLjeBuCC9qrbqSSQnIaTmzUxJhIE','lang'=>'zh_CN'),
      array('openid'=>'oLjeBuH1k2aaz3MxdYq8krdTJCqs','lang'=>'zh_CN'))
      )
      );//批量获取
     */

    public function getUserInfo($data) {

        if (isset($data['user_list']) && is_array($data['user_list'])) {//批量获取用户
            $url = 'https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=' . $this->getAccessToken();
            $data = json_encode($data);
            $res = func_send_request($url, $data);
        } else { //单独获取
            $url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=' . $this->getAccessToken() . '&openid=' . $data['openid'] . '&lang=' . $data['lang'];
            $res = func_send_request($url);
        }
        $obj = json_decode($res);
        return $obj;
    }

    /*
     * 长链接转短链接接口
     * @param $action  此处填long2short,代表长链接转短链接
     * @param $long_url  需要转换的长链接,支持http://、https://、weixin://wxpay 格式的url
     * return $short_url or false
     * 参数:array('action'=>'long2short','long_url'=>'http://www.baidu.com/');
     */

    public function getShortUrl($data = array()) {

        $url = 'https://api.weixin.qq.com/cgi-bin/shorturl?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return $obj->errcode ? '转换短链接失败!失败信息为:' . $obj->errmsg : $obj->short_url;
    }

//发送语义理解请求
    public function sendSemantic($data = array()) {
        $url = 'https://api.weixin.qq.com/semantic/semproxy/search?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return $obj->errcode ? $obj->errmsg : $obj;
    }

//获取素材总数,调用该接口需https协议
//1.永久素材的总数,也会计算公众平台官网素材管理中的素材
//2.图片和图文消息素材(包括单图文和多图文)的总数上限为5000,其他素材的总数上限为1000 
    public function getMaterialCount() {
        $url = 'https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=' . $this->getAccessToken();
        $res = func_send_request($url);
        $obj = json_decode($res);
        return $obj->errcode ? $obj->errmsg : $obj;
    }

//获取素材列表,调用该接口需https协议
//1、获取永久素材的列表,也包含公众号在公众平台官网素材管理模块中新建的图文消息、语音、视频等素材
//2、临时素材无法通过本接口获取 
//type:素材的类型,图片(image)、视频(video)、语音 (voice)、图文(news)
//offset:从全部素材的该偏移位置开始返回,0表示从第一个素材 返回
//count:返回素材的数量,取值在1到20之间
    public function getMaterialList($data = array()) {
        $url = 'https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=' . $this->getAccessToken();
        $data = json_encode($data);
        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return $obj->errcode ? $obj->errmsg : $obj;
    }

    /**
     * 上传临时素材
     * @demo https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
     * @access private 私有方法
     * @param $file 文件名
     * @param $type 类型(图片:image;语音:voice;视频:video;缩略图:thumb)
     * @param $media form-data中媒体文件标识,有filename、filelength、content-type等信息  
     * 图片(image): 128K,支持JPG格式
     * 语音(voice):256K,播放长度不超过60s,支持AMR\MP3格式
     * 视频(video):1MB,支持MP4格式
     * 缩略图(thumb):64KB,支持JPG格式
     * 图片等只保存三天,三天后失效 
     * @param unknown_type $file
     * @param unknown_type $type
     * @return unknown 
     * @return {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
     */
    public function setUpLoadFile($file, $type) {
        if (!in_array($type, array('image', 'voice', 'video', 'thumb')))
            return FALSE;
        $ch = curl_init();
        //加@符号curl就会把它当成是文件上传处理
        $data = array('img' => '@' . $file);
        curl_setopt($ch, CURLOPT_URL, 'http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=' . $this->getAccessToken() . '&type=' . $type);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $result = curl_exec($ch);
        if (curl_errno($ch)) {
            return FALSE;
        }
        curl_close($ch);
        $result = json_decode($result);
        if (isset($result->media_id))
            return $result->media_id;
        return FALSE;
    }

//获取上传的图片
    public function getUpLoadImage($media_id, $ext = '.jpeg') {
        $url = 'https://api.weixin.qq.com/cgi-bin/media/get?access_token=' . $this->getAccessToken() . '&media_id=' . $media_id;
        $res = func_send_request($url);
        $file_name = $media_id . $ext;
        $file = file_put_contents($file_name, $res);
        return $file_name;
    }

//上传永久素材
    public function setUpLoadFiles($file, $type = 'image') {
        
    }

//新增永久图文素材
    public function setUpLoadArticles($data = array()) {
        $url = 'https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=' . $this->getAccessToken();
        $data = '{
  "articles": [{
       "title": "hello,world!",
       "thumb_media_id": "xxxxxxxx!",
       "author": "test",
       "digest": "hello,world!",
       "show_cover_pic":0,
       "content": "hello,world!",
       "content_source_url": "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=" 
    }, 
 ]
}';
        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return $obj->media_id;
    }

############################################################################################################    
############################################################################################################    

    /**
     * 获取access_token
     * @access public  
     * @method GET
     * @param $appid 第三方用户唯一凭证   
     * @param $appsecret 第三方用户唯一凭证密钥    
     * @return  access_token    获取到的凭证
     * @$this->_access_token 存储token的临时文件
     * @return  expires_in  凭证有效时间,单位:秒(7200)  
     * $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
     */
    public function getAccessToken() {

        if (file_exists($this->_access_token)) {
            $str = file_get_contents($this->_access_token);
            $obj = unserialize($str);
            if ((time() - filemtime($this->_access_token)) < $obj->expires_in) {
                return $obj->access_token;
                exit; //存在有效access_token直接返回
            }
        }

        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->_appID}&secret={$this->_appsecret}";

        $res = func_send_request($url);
        $obj = json_decode($res);
        if ($obj->errcode) {
            return "获取 access_token 失败,返回错误信息为:" . $obj->errmsg;
        } else {

            file_put_contents($this->_access_token, serialize($obj));
            return $obj->access_token;
        }
    }

    /**
     * 获取菜单
     * @access public  
     * @param $access_token    
     * @return  
     */
    public function getMenu() {

        $url = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" . $this->getAccessToken();
        $res = func_send_request($url);
        $obj = json_decode($res);
        return $obj->errcode ? "获取微信菜单失败,返回错误信息为:" . $obj->errmsg : "获取微信菜单成功,返回成功信息为:" . json_encode($obj->menu);
    }

    /**
     * 创建菜单
     * @access public  
     * @param $access_token    
     * @return  
     */
    public function setMenu($data) {
        $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" . $this->getAccessToken();

        $res = func_send_request($url, $data);
        $obj = json_decode($res);
        return $obj->errcode ? "设置微信菜单失败,返回错误信息为:" . $obj->errmsg : "设置微信菜单成功,返回成功信息为:" . $obj->errmsg;
    }

    /*
     * 自定义菜单删除接口
     * GET方式:https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN
     * @param $access_token 公众号的access_token
     * return {"errcode":0,"errmsg":"ok"}
     */

    public function delMenu() {
        $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" . $this->getAccessToken();
        $res = func_send_request($url);
        $obj = json_decode($res);
        return $obj->errcode ? '删除微信菜单失败!错误代码为:' . $obj->errcode . ',错误信息为:' . $obj->errmsg : '删除微信菜单成功!成功信息为:' . $obj->errmsg;
    }

    /*
     * 获取微信服务器IP地址
     * GET方式:https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN
     * @param $access_token 公众号的access_token
     * return ip_list {"ip_list":["127.0.0.1","127.0.0.1"]}
     */

    public function getWeChatIp() {
        $url = "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" . $this->getAccessToken();
        $res = func_send_request($url);
        $res = json_decode($res);
        return $res->ip_list;
    }

}

//发送HTTP request请求get or post
function func_send_request($url, $data, $refererUrl = '', $method = 'POST', $contentType = 'application/json', $timeout = 30, $proxy = false) {
    $ch = null;
    if ('POST' === strtoupper($method)) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        if ($refererUrl) {
            curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
        }
        if ($contentType) {
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:' . $contentType));
        }
        if (is_string($data)) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        } else {
            curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        }
    } else if ('GET' === strtoupper($method)) {
        if (is_string($data)) {
            $real_url = $url . (strpos($url, '?') === false ? '?' : '') . $data;
        } else {
            $real_url = $url . (strpos($url, '?') === false ? '?' : '') . http_build_query($data);
        }

        $ch = curl_init($real_url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:' . $contentType));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        if ($refererUrl) {
            curl_setopt($ch, CURLOPT_REFERER, $refererUrl);
        }
    } else {
        $args = func_get_args();
        return false;
    }

    if ($proxy) {
        curl_setopt($ch, CURLOPT_PROXY, $proxy);
    }
    $ret = curl_exec($ch);
    $info = curl_getinfo($ch);
    $contents = array(
        'httpInfo' => array(
            'send' => $data,
            'url' => $url,
            'ret' => $ret,
            'http' => $info,
        )
    );

    curl_close($ch);
    return $ret;
} 

你可能感兴趣的:(微信公众号开发!《二》)