zoukankan      html  css  js  c++  java
  • QQ登录api

      1 <?php
      2 namespace ApiMember;
      3 class QQConnect{
      4      /**
      5      * 获取QQconnect Login 跳转到的地址值
      6      * @return array 返回包含code state
      7      * 
      8 **/ 
      9  public function login($app_id, $callback, $scope){
     10         $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     11         $login_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=" 
     12             .$app_id. "&redirect_uri=" . urlencode($callback)
     13             . "&state=" . $_SESSION['state']
     14             . "&scope=".urlencode($scope);
     15 //显示出登录地址
     16          header('Location:'.$login_url);
     17     }
     18     /**
     19      * 获取access_token值
     20      * @return array 返回包含access_token,过期时间的数组
     21      * */
     22 private function get_token($app_id,$app_key,$code,$callback,$state){
     23         if($state !== $_SESSION['state']){
     24 return false;
     25 exit();
     26         }
     27            $url = "https://graph.qq.com/oauth2.0/token";
     28             $param = array(
     29                 "grant_type"    =>    "authorization_code",
     30                 "client_id"     =>    $app_id,
     31                 "client_secret" =>    $app_key,
     32                 "code"          =>    $code,
     33                 "state"         =>    $state,
     34                 "redirect_uri"  =>    $callback
     35             );
     36             $response = $this->get_url($url, $param);
     37             if($response == false) {
     38                 return false;
     39             }
     40             $params = array();
     41             parse_str($response, $params);
     42             return $params["access_token"];
     43 }
     44      
     45     /**
     46      * 获取client_id 和 openid
     47      * @param $access_token access_token验证码
     48      * @return array 返回包含 openid的数组
     49      * */
     50     private  function get_openid($access_token) {
     51         $url = "https://graph.qq.com/oauth2.0/me"; 
     52         $param = array(
     53             "access_token"    => $access_token
     54         );
     55         $response  = $this->get_url($url, $param);
     56         if($response == false) {
     57             return false;
     58         }
     59         if (strpos($response, "callback") !== false) {
     60             $lpos = strpos($response, "(");
     61             $rpos = strrpos($response, ")");
     62             $response  = substr($response, $lpos + 1, $rpos - $lpos -1);
     63         }
     64         $user = json_decode($response);
     65         if (isset($user->error) || $user->openid == "") {
     66             return false;
     67         }
     68         return $user->openid;
     69     }
     70     /**
     71      * 获取用户信息
     72      * @param $client_id
     73      * @param $access_token
     74      * @param $openid
     75      * @return array 用户的信息数组
     76      * */
     77     public function get_user_info($app_id,$token,$openid){
     78 $url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';
     79         $str = $this->get_url($url);
     80         if($str == false) {
     81         return false;
     82         }
     83         $arr = json_decode($str,true);
     84         return $arr;
     85 }
     86  
     87      /**
     88      * 请求URL地址,返回callback得到返回字符串
     89      * @param $url qq提供的api接口地址
     90      * */
     91     
     92     public function callback($app_id, $app_key, $callback) {
     93     $code = $_GET['code'];
     94     $state = $_GET['state'];
     95     $token = $this->get_token($app_id,$app_key,$code,$callback,$state);
     96     $openid = $this->get_openid($token);
     97     if(!$token || !$openid) {
     98     return false;
     99     exit();
    100     }
    101        return array('openid' => $openid, 'token' => $token);
    102     }
    103     
    104     
    105     /*
    106      * HTTP GET Request
    107     */
    108     private  function get_url($url, $param = null) {
    109     if($param != null) {
    110     $query = http_build_query($param);
    111     $url = $url . '?' . $query;
    112     }
    113     $ch = curl_init();
    114     if(stripos($url, "https://") !== false){
    115     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    116     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    117     }
    118     
    119     curl_setopt($ch, CURLOPT_URL, $url);
    120     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    121     $content = curl_exec($ch);
    122     $status = curl_getinfo($ch);
    123     curl_close($ch);
    124     if(intval($status["http_code"]) == 200) {
    125     return $content;
    126     }else{
    127     echo $status["http_code"];
    128     return false;
    129     }
    130     }
    131     
    132     /*
    133      * HTTP POST Request
    134     */
    135     private  function post_url($url, $params) {
    136     $ch = curl_init();
    137     if(stripos($url, "https://") !== false) {
    138     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    139     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    140     }
    141     
    142     curl_setopt($ch, CURLOPT_URL, $url);
    143     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
    144     curl_setopt($ch, CURLOPT_POST, true);
    145     curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    146     $content = curl_exec($ch);
    147     $status = curl_getinfo($ch);
    148     curl_close($ch);
    149     if(intval($status["http_code"]) == 200) {
    150     return $content;
    151     } else {
    152     return false;
    153     }
    154     }
    155 }
  • 相关阅读:
    详解 ASP.NET异步
    web开发中对网站建设
    《如何学习C++语言》和《如何学习C语言》
    WCF体系架构(之一:Client与Server信息交互处理流程初略介绍)
    常用的shell命令
    功能最强大的.Net代码生成器——EasyCode,欢迎使用
    对面向对象设计原则的总结
    学习之模块架构 DotNetNuke 6
    软件测试
    微软开放ASP.NET MVC 4、Web API和Web Pages v2的源代码
  • 原文地址:https://www.cnblogs.com/CHEUNGKAMING/p/4378604.html
Copyright © 2011-2022 走看看