【github】QQ互联重写JDK

原创作品,转载前请联系我~


因为qq官方提供的jdk相当的不好修改,所以就参照新浪微博的jdk结构重新调整了下


我把项目托管到github上了,大家可以一起学习下,征集宝贵意见,一起进步!


下面是第一版的代码

<?php
/*
 * 自己写的腾讯QQ互联的类
 * 开始  2014-01-16 
 * 更新  2014-01-17
 * 更新历史 
 * 2014-01-17 修改post方法
 * diandianxiyu <diandianxiyu@foxmail.com>
 */

/**
 * 接口实际操作类
 */
class TengxunClientV2 {
    private  $keysArr,$OAuth;
            function __construct($access_token, $openid) {
        $this->keysArr = array(
            "oauth_consumer_key" => Yii::app()->params[‘QQ_APP_ID‘],
            "access_token" => $access_token,
            "openid" => $openid
        );
        
        $this->OAuth=new TengxunTOAuthV2($this->keysArr);
    }

    //===================调用接口的方法===================================//
    
    
    //---------------------------------------访问用户资料---------------------------------------------------------------------------------//
    
    /**
     * 取登录用户在QQ空间的信息,包括昵称、头像、性别及黄钻信息(包括黄钻等级、是否年费黄钻等)。
     * https://graph.qq.com/user/get_user_info
     * 参数:format:json,xml 返回的格式
     */
    function get_user_info($format = ‘json‘){
        $param=array(
             ‘format‘=>$format,
        );
        return $this->get(‘user/get_user_info‘,$param);
    }

    //---------------------------------------访问用户QQ会员信息------------------------------------------------------------------------//
    
    /**
     * 获取已登录用户的关于QQ会员业务的基本资料。
基本资料包括以下信息:是否为“普通包月会员”,是否为“年费会员”,QQ会员等级信息,是否为“豪华版QQ会员”,是否为“钻皇会员”,是否为“SVIP”。
     * https://graph.qq.com/user/get_vip_info
     * @param type $format json,xml 返回的格式
     * @return type
     */
     
    function get_vip_info($format = ‘json‘){
         $param=array(
             ‘format‘=>$format,
        );
         return $this->get(‘user/get_vip_info‘,$param);
    }
    /**
     * 获取已登录用户的关于QQ会员业务的详细资料。
详细资料包括:用户会员的历史属性,用户会员特权的到期时间,用户最后一次充值会员业务的支付渠道,用户开通会员的主要驱动因素。
     * https://graph.qq.com/user/get_vip_rich_info
     * @param type $format json,xml 返回的格式
     */
    function get_vip_rich_info($format = ‘json‘){
         $param=array(
             ‘format‘=>$format,
        );
         return $this->get(‘user/get_vip_rich_info‘,$param);
    }


    //-------------------------------------分享内容到我的腾讯微博--------------------------------------------------------------------//
    /**
     * 获取腾讯微博登录用户的用户资料
     * https://graph.qq.com/user/get_info
     * HTTP请求方式    GET
     * 参数:format:json,xml 返回的格式
     */
    function get_info($format = ‘json‘) {
        $param=array(
            ‘format‘=>$format,
        );
        return  $this->get(‘user/get_info‘, $param);
    }
    
     //-----------------------------------------获得我的微博好友信息------------------------------------------------------------------//
    /**
     * 获取登录用户的听众列表。
     * 
     * @param type $reqnum 请求获取的听众个数。取值范围为1-30。
     * @param type $startindex 请求获取听众列表的起始位置。第一页:0; 继续向下翻页:reqnum*(page-1)。
     * @param type $mode 获取听众信息的模式,默认值为0。0:旧模式,新添加的听众信息排在前面,最多只能拉取1000个听众的信息。 1:新模式,可以拉取所有听众的信息,暂时不支持排序。
     * @param type $install 判断获取的是安装应用的听众,还是未安装应用的听众。 0:不考虑该参数;1:获取已安装应用的听众信息; 2:获取未安装应用的听众信息。
     * @param type $sex 按性别过滤标识,默认为0。此参数当mode=0时使用,支持排序。 1:获取的是男性听众信息;2:获取的是女性听众信息; 0:不进行性别过滤,获取所有听众信息。
     * @param type $format
     */
    function get_fanslist($reqnum=10,$startindex=0,$mode=0,$install=0,$sex=0,$format=‘json‘){
        $param=array(
            ‘reqnum‘=>$reqnum,
            ‘startindex‘=>$startindex,
            ‘mode‘=>$mode,
            ‘install‘=>$install,
            ‘sex‘=>$sex,
            ‘format‘=>$format,
        );
        return  $this->get(‘relation/get_fanslist‘, $param);
    }
    
     /**
     * 获取登录用户收听的人的列表。
     * 
     * @param type $reqnum 请求获取收听的个数。取值范围为1-30。
     * @param type $startindex 请求获取收听列表的起始位置。第一页:0; 继续向下翻页:reqnum*(page-1)。
     * @param type $mode 获取收听信息的模式,默认值为0。0:旧模式,新添加的听众信息排在前面,最多只能拉取1000个收听的信息。 1:新模式,可以拉取所有收听的信息,暂时不支持排序。
     * @param type $install 判断获取的是安装应用的收听,还是未安装应用的收听。 0:不考虑该参数;1:获取已安装应用的收听信息; 2:获取未安装应用的收听信息。
     * @param type $sex 按性别过滤标识,默认为0。此参数当mode=0时使用,支持排序。 1:获取的是男性收听信息;2:获取的是女性收听信息; 0:不进行性别过滤,获取所有收听信息。
     * @param type $format
     */
    function get_idollist($reqnum=10,$startindex=0,$mode=0,$install=0,$sex=0,$format=‘json‘){
        $param=array(
            ‘reqnum‘=>$reqnum,
            ‘startindex‘=>$startindex,
            ‘mode‘=>$mode,
            ‘install‘=>$install,
            ‘sex‘=>$sex,
            ‘format‘=>$format,
        );
        return  $this->get(‘relation/get_idollist‘, $param);
    }
    
    /**
     * 发表一条微博信息(纯文本)到腾讯微博平台上。 注意连续两次发布的微博内容不可以重复。
     * https://graph.qq.com/t/add_t
     */
    function add_t($content,$format=‘json‘){
         $param=array(
            ‘content‘=>$content,
            ‘format‘=>$format,
        );
        return $this->post(‘t/add_t‘, $param);
    }
    
    /**
     * 代理get,直接返回数组
     * @param type $url
     * @param type $param
     * @param type $ismerge
     * @return type
     */
    private function get($url,$param,$ismerge){
        return $this->objToArr(json_decode($this->OAuth->get($url, $param,$ismerge)));
    }
    
    /**
     * 代理post,直接返回数组
     * @param type $url
     * @param type $param
     * @param type $ismerge
     * @return type
     */
    private function post($url,$param,$ismerge){
        return $this->objToArr(json_decode($this->OAuth->post($url, $param,$ismerge)));
    }
    //=======================私有方法==================================//
     //php 对象到数组转换
     private function objToArr($obj) {
        if (!is_object($obj) && !is_array($obj)) {
            return $obj;
        }
        $arr = array();
        foreach ($obj as $k => $v) {
            $arr[$k] = $this->objToArr($v);
        }
        return $arr;
    }
    

}

/**
 * 认证类
 */
class TengxunTOAuthV2 {

    private  $apiUrl=‘https://graph.qq.com/‘;
    private $keyarr;
    private $oauthkey;
            
    function __construct($keyarr) {
        $this->keyarr=$keyarr;
        $this->oauthkey=array(
            "appid" => Yii::app()->params[‘QQ_APP_ID‘],
            "appkey" => Yii::app()->params[‘QQ_APP_KEY‘],
            "callback" => Yii::app()->params[‘QQ_callback‘],
            "scope" => Yii::app()->params[‘QQ_scope‘],
            "errorReport" => Yii::app()->params[‘QQ_errorReport‘],
            "storageType" => Yii::app()->params[‘QQ_storageType‘],
        );
    }
    //================通过Authorization Code获取Access Token======================//
    
    public function getAccessTokenByCode($code,$state){
        //https://graph.qq.com/oauth2.0/token
        //?grant_type=authorization_code&client_id=[YOUR_APP_ID]&client_secret=[YOUR_APP_Key]
        //&code=[The_AUTHORIZATION_CODE]&state=[The_CLIENT_STATE]&redirect_uri=[YOUR_REDIRECT_URI]
        $oauthkey=$this->oauthkey;
         $param=array(
            ‘grant_type‘=>‘authorization_code‘,
            ‘client_id‘=>  $oauthkey[‘appid‘],
            ‘client_secret‘=>$oauthkey[‘appkey‘],
            ‘code‘=>$code,
            ‘state‘=>$state,
            ‘redirect_uri‘=>$oauthkey[‘callback‘],
        );
        //return $param;
         $tokenstring=$this->get("oauth2.0/token", $param,false);
        return $this->returnStringToArray($tokenstring);
        //return explode("&", $this->get("oauth2.0/token", $param,0));
    }
    //====================使用Access Token来获取用户的OpenID=====================//
    
    public  function getOpenIDByAccessToken($accesstoken){
         $param=array(
             ‘access_token‘=>$accesstoken
             );
         $response=  $this->get(‘oauth2.0/me‘, $param);
         if (strpos($response, "callback") !== false) {

            $lpos = strpos($response, "(");
            $rpos = strrpos($response, ")");
            $response = substr($response, $lpos + 1, $rpos - $lpos - 1);
        }
         $arr=json_decode($response);
         return array(
             ‘openid‘=>$arr->openid
         );
    }
    //===============通过Authorization Code获取Access Token 和 OpenID=================//
    
    function getAccessTokenOpenIDByCode($code,$state){
        $tokenarr=  $this->getAccessTokenOpenIDByCode($code, $state);
        $openidarr=  $this->getOpenIDByAccessToken($tokenarr[‘access_token‘]);
        return array_merge($openidarr,$tokenarr);
        
    }
    //=======================获取数据===================================//

    /**
     * combineURL
     * 拼接url
     * @param string $baseURL   基于的url
     * @param array  $keysArr   参数列表数组
     * @return string           返回拼接的url
     */
    public function combineURL($baseURL, $keysArr,$ismerge=true) {
      //  $ismerge=$ismerge?$ismerge:1;
        $combined =  $this->apiUrl. $baseURL . "?";
        $valueArr = array();
        //合并数组
        $oatharr=  $this->keyarr;
        if($ismerge){
          
        $keysArr=  array_merge($oatharr,$keysArr);
       }
        foreach ($keysArr as $key => $val) {
            $valueArr[] = "$key=$val";
        }

        $keyStr = implode("&", $valueArr);
        $combined .= ($keyStr);
        return $combined;
    }
    /**
     * 合并数组到参数中,目的是将token和openid传入参数中
     * @param type $keysArr
     */
    function combineArr($keysArr){
        //合并数组
        $oatharr=  $this->keyarr;
        $keys=  array_merge($oatharr,$keysArr);
        return $keys;
    }

    /**
     * get_contents
     * 服务器通过get请求获得内容
     * @param string $url       请求的url,拼接后的
     * @return string           请求返回的内容
     */
    public function get_contents($url) {
        if (ini_get("allow_url_fopen") == "1") {
            $response = file_get_contents($url);
        } else {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_URL, $url);
            $response = curl_exec($ch);
            curl_close($ch);
        }

        //-------请求为空
        if (empty($response)) {
           // $this->error->showError("50001");
        }

        return $response;
    }
    /**
     * get
     * get方式请求资源
     * @param string $url     基于的baseUrl
     * @param array $keysArr  参数列表数组      
     * @return string         返回的资源内容
     */
    public function get($url, $keysArr,$ismerge) {
        $combined = $this->combineURL($url, $keysArr,$ismerge);
        return $this->get_contents($combined);
    }

    /**
     * post
     * post方式请求资源
     * @param string $url       基于的baseUrl
     * @param array $keysArr    请求的参数列表
     * @param int $flag         标志位
     * @return string           返回的资源内容
     */
    public function post($url, $keysArr, $flag = 0) {
        $combined=  $this->combineURL($url);
   
        $keysArr=  $this->combineArr($keysArr);
        $ch = curl_init();
        if (!$flag)
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
        curl_setopt($ch, CURLOPT_URL, $combined);
        $ret = curl_exec($ch);

        curl_close($ch);
 
        return $ret;
    }
    
    
    //=======================私有方法==================================//
    /**
     * 将格式为 access_token=YOUR_ACCESS_TOKEN&expires_in=3600 的字符串转化成数组
     */
    private function returnStringToArray($string){
        //$string="access_token=YOUR_ACCESS_TOKEN&expires_in=3600&reesasdasd=safdsa";
        $arr1=  explode(‘&‘, $string);
        $arr2=array();
        foreach ($arr1 as $key => $value) {
            $arr=  explode("=", $value);
            $arr2[$arr[0]]=$arr[1];
        }
        return $arr2;
    }
    
    

}



【github】QQ互联重写JDK

上一篇:主打「意识学习」的瑞士人工智能初创公司Demiurge融资950万美元


下一篇:【Django框架】学习及其【数据库对接技术】 学习&&开发笔记【入门篇】