qq登录ecshop,系统最新接口OAuth2.0代码分析

    qq登录需要分为五个步骤:

     在这说的这五部主要是获取信息的步骤,至于咋样去申请qq的AIP那就不介绍了。

     第一步:获取access_token

        QQ登录OAuth2.0提供了两种获取access_token的方法,分别是:server-side模式和client-side模式。腾讯建议使用的是server-side模式。

下面是第一步获取access_token的代码,其中state是为了防止CSRF攻击的一个必须填写值,至于填写什么那就看个人爱好了。                                                                             
$dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);

    第二部:根据access_token获得对应用户身份的openid
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($back_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);

    第三部:根据access_token与openid调用OpenAPI                                         
   $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);

  第四部:根据获取信息等到用户的信息
      $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;

    得到的用户信息是一个json需要转换,至于咋样转json在这里就不做介绍,我在下一个步骤会直接用ecshop的方法来解决。

  第五步:数据的处理与整合                                                                                                在这一步 大家就可以各抒己见了,可以整合ecshop也可以整合其他的系统。               
require(ROOT_PATH . “includes/cls_json.php”);
    $json   = new JSON;
    $user_info  = $json->decode(get_contents($info));
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;

   我的关于QQ登录ecshop OAuth2.0的接口就已经大概的介绍完了,下面我把代码贴出供大家研究,

qq.php

<?php
session_start();
define(“IN_ECS”, true);
require(dirname(__FILE__) . “/includes/init.php”);
include_once(ROOT_PATH . “includes/lib_transaction.php”);
include_once(ROOT_PATH . “includes/lib_passport.php”);
//应用的APPID
$app_id = “申请的APPID”;
//应用的APPKEY
$app_secret = “申请的APPKEY”;
//成功授权后的回调地址
$my_url = “回调地址,我这以网址加/qq.php”;
/*第一步*/
$code = $_REQUEST[“code”];
if(empty($code))
{
   $_SESSION[“state”] = md5(uniqid(rand(), TRUE));    
   $dialog_url = “https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&state=”.$_SESSION[“state”];
    header(“Location: “.$dialog_url.”\n”);
}
/*第二部*/
if($_REQUEST[“state”] == $_SESSION[“state”])
{
    $token_url = “https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&”.”client_id=”.$app_id.”&redirect_uri=”.urlencode($my_url).”&client_secret=”.$app_secret.”&code=”.$code;
    $response = file_get_contents($token_url);
    if (strpos($response, “callback”) !== false)
    {
        $lpos = strpos($response, “(“);
        $rpos = strrpos($response, “)”);
        $response  = substr($response, $lpos 1, $rpos – $lpos -1);
        $msg = json_decode($response);
        if (isset($msg->error))
        {
            echo “<h3>error:</h3>” . $msg->error;
            echo “<h3>msg  :</h3>” . $msg->error_description;
            exit;
        }
    }
    /*第三步*/
    $params = array();
    parse_str($response, $params);
    $graph_url = “https://graph.qq.com/oauth2.0/me?access_token=”.$params[“access_token”];
    $str  = file_get_contents($graph_url);
    if (strpos($str, “callback”) !== false)
    {
        $lpos = strpos($str, “(“);
        $rpos = strrpos($str, “)”);
        $str  = substr($str, $lpos 1, $rpos – $lpos -1);
    }
    $user = json_decode($str);
    if (isset($user->error))
    {
        echo “<h3>error:</h3>” . $user->error;
        echo “<h3>msg  :</h3>” . $user->error_description;
        exit;
    }
    /*第四部 数据处理*/
    $info = “https://graph.qq.com/user/get_user_info?access_token=”.$params[“access_token”].”&oauth_consumer_key=100346418&openid=”.$user->openid.”&format=json “;
    require(ROOT_PATH . “includes/cls_json.php”);
    $json = new JSON;
    $user_info  = $json->decode(get_contents($info));
  /*这里特变说明一下*/

   $user_info的值是登陆返回的数据,包括OPENID,昵称,头像等信息。程序员可针对自己的系统处理数据,这里需要注意的是
    $_SESSION[“oauth_token”] = $params[“access_token”];
    $_SESSION[“openid”] = $user->openid;
    $username=$user_info->nickname;
    $password=time();//随便弄个密码
    $email=$_SESSION[“openid”].”@qq.com”;//没有返回邮箱
    $back_act =”user.php”;
    /* 检测用户名 */
    if (check_user($username)!==false){//账号存在直接完成登录

        /*判断openID*/

      if($db->getOne(“SELECT COUNT(*) FROM “.$ecs->table(“users”).” WHERE user_name=”$username” AND openid=””.$_SESSION[“openid”].”””)==1){

            set_session($username);
          //$GLOBALS[“user”]->set_cookie($username);
          header(“Location: user.php\n”);
          exit;

       }

      else

     {

            show_message(“对不起,用户名”.$username.”已经存在!”);

       }
       
    }else{
        $reg_date = time();
        $password =md5($password);
        $GLOBALS[“db”]->query(“INSERT INTO ” . $GLOBALS[“ecs”]->table(“users”) . “(`user_name`, `password`, `reg_time`, `last_login`, `openid`) VALUES (“$username”, “$password”, “$reg_date”, “$reg_date”, “$_SESSION[“openid”]”)”);//账号不存在 就写入数据库 并登陆
        set_session($username);
        //$GLOBALS[“user”]->set_cookie($username);
        header(“Location: user.php\n”);
        exit;
    }
    
}
else
{
    echo(“The state does not match. You may be a victim of CSRF.”);
}
 
function set_session($username=””)
{
    $sql = “SELECT user_id, password, email FROM ” . $GLOBALS[“ecs”]->table(“users”) . ” WHERE user_name=”$username” LIMIT 1″;
    $row = $GLOBALS[“db”]->getRow($sql);

    if ($row)
    {
        $_SESSION[“user_id”]   = $row[“user_id”];
        $_SESSION[“user_name”] = $username;
        $_SESSION[“email”]     = $row[“email”];
    }
}
function check_user($username)
{
    $sql = “SELECT user_id FROM ” . $GLOBALS[“ecs”]->table(“users”). ” WHERE user_name=”$username””;
    $row = $GLOBALS[“db”]->getRow($sql);
    if (!empty($row)){ return true; }else{return false;}
}
function get_contents($url)
{
       $curl = curl_init();
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($curl,CURLOPT_URL,$url);
        return curl_exec($curl);

}