Maison >développement back-end >tutoriel php >Méthode PHP pour implémenter la connexion rapide QQ

Méthode PHP pour implémenter la connexion rapide QQ

高洛峰
高洛峰original
2016-12-30 13:49:352206parcourir

Avant-propos :

PHP implémente la connexion rapide QQ, répertoriant trois méthodes

Méthode 1 : orientée processus, l'adresse de rappel et la première connexion de déclenchement sont écrites sur une page de méthode [à cause de if Make un jugement】,

Méthodes 2 et 3 : orienté objet

1 Appelez d'abord la méthode de connexion et envoyez une demande à Tencent,
Tencent porte l'unique. paramètres correspondants de ce site Web OPENID, ACCESSTOKEN, retournez à la page de rappel correspondante,
3. Une fois que la page de rappel a reçu les paramètres de Tencent, elle utilise ces deux paramètres pour émettre la requête correspondante, par exemple interroger les données de l'utilisateur.
4. Tencent effectue les opérations correspondantes, telles que vous renvoyer les données de l'utilisateur

Même si vous ne le comprenez pas, cela n'a pas d'importance. Suivez mon processus ci-dessous pour vous en assurer. peut y parvenir.

Préparation précoce :

Lorsque vous utilisez les fonctions de Tencent, il faut leur dire bonjour !

Page d'accueil Internet de QQ : http://connect.qq.com/

Après avoir accédé au site Web, procédez comme suit :

1 Entrez sur le site officiel

.

Méthode PHP pour implémenter la connexion rapide QQ

2. Postulez pour créer une application [site Web]

Méthode PHP pour implémenter la connexion rapide QQ

3. Remplissez les informations requises

Notez l'adresse du site Web : remplissez Vous devez définir l'URL pour une connexion rapide, par exemple : http://www.test.com

Adresse de rappel : Après avoir envoyé une connexion rapide à QQ, Tencent vous donnera informations. Ces informations seront acceptées sur cette page. par exemple : http://www.test.com/accept_info.php

[Pour le remplissage détaillé des candidatures, veuillez consulter les conseils officiels, je n'entrerai pas dans les détails ici]

Méthode PHP pour implémenter la connexion rapide QQ

4. Une fois la candidature réussie, complétez les informations

Méthode PHP pour implémenter la connexion rapide QQ

exigences finales, obtenez APP_ID, APP_KEY

5. >

dans Écrivez-le dans votre fichier PHP correspondant, comme suit

Méthode 1, méthode orientée processus

Utilisation : Après avoir configuré $app_id, $app_secret, $my_url, copiez les autres tels quels, et $ user_data est les informations de connexion renvoyées
Code :

Méthode 2, orientée objet à l'aide de la classe QQ_LoginAction.class
//应用的APPID 
   $app_id = "你的APPID"; 
   //应用的APPKEY 
   $app_secret = "你的APPKEY"; 
   //【成功授权】后的回调地址,即此地址在腾讯的信息中有储存 
   $my_url = "你的回调网址"; 
  
   //Step1:获取Authorization Code 
   session_start(); 
   $code = $_REQUEST["code"];//存放Authorization Code 
   if(empty($code)) 
   { 
    //state参数用于防止CSRF攻击,成功授权后回调时会原样带回 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); 
    //拼接URL 
    $dialog_url = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id="
     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
     . $_SESSION['state']; 
    echo("<script> top.location.href=&#39;" . $dialog_url . "&#39;</script>"); 
   } 
  
   //Step2:通过Authorization Code获取Access Token 
   if($_REQUEST[&#39;state&#39;] == $_SESSION[&#39;state&#39;] || 1) 
   { 
    //拼接URL 
    $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)//如果登录用户临时改变主意取消了,返回true!==false,否则执行step3 
    { 
     $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; 
     } 
    } 
  
    //Step3:使用Access Token来获取用户的OpenID 
    $params = array(); 
    parse_str($response, $params);//把传回来的数据参数变量化 
    $graph_url = "https://graph.qq.com/oauth2.0/me?access_token=".$params[&#39;access_token&#39;]; 
    $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);//存放返回的数据 client_id ,openid 
    if (isset($user->error)) 
    { 
     echo "<h3>error:</h3>" . $user->error; 
     echo "<h3>msg :</h3>" . $user->error_description; 
     exit; 
    } 
    //echo("Hello " . $user->openid); 
    //echo("Hello " . $params[&#39;access_token&#39;]); 
  
    //Step4:使用<span style="font-family: Arial, Helvetica, sans-serif;">openid,</span><span style="font-family: Arial, Helvetica, sans-serif;">access_token来获取所接受的用户信息。</span> 
    $user_data_url = "https://graph.qq.com/user/get_user_info?access_token={$params[&#39;access_token&#39;]}&oauth_consumer_key={$app_id}&openid={$user->openid}&format=json"; 
      
    $user_data = file_get_contents($user_data_url);//此为获取到的user信息 
    } 
    else
    { 
     echo("The state does not match. You may be a victim of CSRF."); 
    }
Méthode d'utilisation :

1. Configurer correctement APPID, APPKEY CALLBACK (rappel. URL) dans QQ_LoginAction.class
2 Dans la méthode appelante, le code est :

3 Dans la page de rappel, le code est :
$qq_login = new \Component\QQ_LoginAction();    //引入此类文件即可 
$qq_login->qq_login();          //调用登录方法,向腾讯发出快速登录请求

4. . $user_data sont les données utilisateur renvoyées.
$qc = new \Component\QQ_LoginAction(); 
$acs = $qc->qq_callback();<span style="white-space:pre">    //access_token 
$oid=$qc->get_openid();<span style="white-space:pre">     //openid 
$user_data = $qc->get_user_info();<span style="white-space:pre">  //get_user_info()为获得该用户的信息,其他操作方法见API文档
Code du fichier 5.QQ_LoginAction.class.php : [ThinkPHP3.2 utilisé]


Troisième méthode, orientée objet utilisant le SDK fourni par Tencent
<?php 
namespace Component; 
  
session_start(); 
define(&#39;APPID&#39;,&#39;XXXX&#39;);   //appid 
define(&#39;APPKEY&#39;,&#39;XXXX&#39;);  //appkey 
define(&#39;CALLBACK&#39;,&#39;XXXX&#39;);  //回调地址 
define(&#39;SCOPE&#39;,&#39;get_user_info,list_album,add_album,upload_pic,add_topic,add_weibo&#39;);  //授权接口列表 
class QQ_LoginAction { 
 const GET_AUTH_CODE_URL = "https://graph.qq.com/oauth2.0/authorize"; 
 const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token"; 
 const GET_OPENID_URL = "https://graph.qq.com/oauth2.0/me"; 
 private $APIMap = array( 
  "get_user_info" => array(   //获取用户资料 
   "https://graph.qq.com/user/get_user_info", 
   array("format" => "json"), 
  ), 
  "add_t" => array(    //发布一条普通微博 
   "https://graph.qq.com/t/add_t", 
   array("format" => "json", "content","#clientip","#longitude","#latitude","#compatibleflag"), 
   "POST"
  ), 
  "add_pic_t" => array(    //发布一条图片微博 
   "https://graph.qq.com/t/add_pic_t", 
   array("content", "pic", "format" => "json", "#clientip", "#longitude", "#latitude", "#syncflag", "#compatiblefalg"), 
   "POST"
  ), 
  "del_t" => array(      //删除一条微博 
   "https://graph.qq.com/t/del_t", 
   array("id", "format" => "json"), 
   "POST"
  ), 
  "get_repost_list" => array(    //获取单条微博的转发或点评列表 
   "https://graph.qq.com/t/get_repost_list", 
   array("flag", "rootid", "pageflag", "pagetime", "reqnum", "twitterid", "format" => "json") 
  ), 
  "get_info" => array(     //获取当前用户资料 
   "https://graph.qq.com/user/get_info", 
   array("format" => "json") 
  ), 
  "get_other_info" => array(    //获取其他用户资料 
   "https://graph.qq.com/user/get_other_info", 
   array("format" => "json", "#name-1", "#fopenid-1") 
  ), 
  "get_fanslist" => array( 
   "https://graph.qq.com/relation/get_fanslist", //我的微博粉丝列表 
   array("format" => "json", "reqnum", "startindex", "#mode", "#install", "#sex") 
  ), 
  "get_idollist" => array( 
   "https://graph.qq.com/relation/get_idollist", //我的微博收听列表 
   array("format" => "json", "reqnum", "startindex", "#mode", "#install") 
  ), 
  "add_idol" => array( 
   "https://graph.qq.com/relation/add_idol",  //微博收听某用户 
   array("format" => "json", "#name-1", "#fopenids-1"), 
   "POST"
  ), 
  "del_idol" => array(   //微博取消收听某用户 
   "https://graph.qq.com/relation/del_idol", 
   array("format" => "json", "#name-1", "#fopenid-1"), 
   "POST"
  ) 
 ); 
 private $keysArr; 
 function __construct(){ 
  if($_SESSION["openid"]){ 
   $this->keysArr = array( 
    "oauth_consumer_key" => APPID, 
    "access_token" => $_SESSION[&#39;access_token&#39;], 
    "openid" => $_SESSION["openid"] 
   ); 
  }else{ 
   $this->keysArr = array( 
    "oauth_consumer_key" => APPID 
   ); 
  } 
 } 
 public function qq_login(){ 
  //-------生成唯一随机串防CSRF攻击 
  $_SESSION[&#39;state&#39;] = md5(uniqid(rand(), TRUE)); 
  $keysArr = array( 
   "response_type" => "code", 
   "client_id" => APPID, 
   "redirect_uri" => CALLBACK, 
   "state" => $_SESSION[&#39;state&#39;], 
   "scope" => SCOPE 
  ); 
  $login_url = self::GET_AUTH_CODE_URL.&#39;?&#39;.http_build_query($keysArr); 
  header("Location:$login_url"); 
 } 
 public function qq_callback(){ 
  //--------验证state防止CSRF攻击 
  if($_GET[&#39;state&#39;] != $_SESSION[&#39;state&#39;]){ 
   return false; 
  } 
  //-------请求参数列表 
  $keysArr = array( 
   "grant_type" => "authorization_code", 
   "client_id" => APPID, 
   "redirect_uri" => CALLBACK, 
   "client_secret" => APPKEY, 
   "code" => $_GET[&#39;code&#39;] 
  ); 
  //------构造请求access_token的url 
  $token_url = self::GET_ACCESS_TOKEN_URL.&#39;?&#39;.http_build_query($keysArr); 
  $response = $this->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)){ 
    $this->showError($msg->error, $msg->error_description); 
   } 
  } 
  $params = array(); 
  parse_str($response, $params); 
  $_SESSION["access_token"]=$params["access_token"]; 
  $this->keysArr[&#39;access_token&#39;]=$params[&#39;access_token&#39;]; 
  return $params["access_token"]; 
 } 
  
 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)){ 
   return false; 
  } 
  return $response; 
 } 
 public function get_openid(){ 
  //-------请求参数列表 
  $keysArr = array( 
   "access_token" => $_SESSION["access_token"] 
  ); 
  $graph_url = self::GET_OPENID_URL.&#39;?&#39;.http_build_query($keysArr); 
  $response = $this->get_contents($graph_url); 
  //--------检测错误是否发生 
  if(strpos($response, "callback") !== false){ 
   $lpos = strpos($response, "("); 
   $rpos = strrpos($response, ")"); 
   $response = substr($response, $lpos + 1, $rpos - $lpos -1); 
  } 
  $user = json_decode($response); 
  if(isset($user->error)){ 
   $this->showError($user->error, $user->error_description); 
  } 
  //------记录openid 
  $_SESSION[&#39;openid&#39;]=$user->openid; 
  $this->keysArr[&#39;openid&#39;]=$user->openid; 
  return $user->openid; 
 } 
  
 /** 
  * showError 
  * 显示错误信息 
  * @param int $code 错误代码 
  * @param string $description 描述信息(可选) 
  */
 public function showError($code, $description = &#39;$&#39;){ 
   echo "<meta charset=\"UTF-8\">"; 
   echo "<h3>error:</h3>$code"; 
   echo "<h3>msg :</h3>$description"; 
   exit(); 
 } 
  
 /** 
  * _call 
  * 魔术方法,做api调用转发 
  * @param string $name 调用的方法名称 
  * @param array $arg  参数列表数组 
  * @since 5.0 
  * @return array   返加调用结果数组 
  */
 public function __call($name,$arg){ 
  //如果APIMap不存在相应的api 
  if(empty($this->APIMap[$name])){ 
   $this->showError("api调用名称错误","不存在的API: <span style=&#39;color:red;&#39;>$name</span>"); 
  } 
  //从APIMap获取api相应参数 
  $baseUrl = $this->APIMap[$name][0]; 
  $argsList = $this->APIMap[$name][1]; 
  $method = isset($this->APIMap[$name][2]) ? $this->APIMap[$name][2] : "GET"; 
  if(empty($arg)){ 
   $arg[0] = null; 
  } 
  $responseArr = json_decode($this->_applyAPI($arg[0], $argsList, $baseUrl, $method),true); 
  //检查返回ret判断api是否成功调用 
  if($responseArr[&#39;ret&#39;] == 0){ 
   return $responseArr; 
  }else{ 
   $this->showError($responseArr[&#39;ret&#39;], $responseArr[&#39;msg&#39;]); 
  } 
 } 
  
 //调用相应api 
 private function _applyAPI($arr, $argsList, $baseUrl, $method){ 
  $pre = "#"; 
  $keysArr = $this->keysArr; 
  $optionArgList = array();//一些多项选填参数必选一的情形 
  foreach($argsList as $key => $val){ 
   $tmpKey = $key; 
   $tmpVal = $val; 
   if(!is_string($key)){ 
    $tmpKey = $val; 
    if(strpos($val,$pre) === 0){ 
     $tmpVal = $pre; 
     $tmpKey = substr($tmpKey,1); 
     if(preg_match("/-(\d$)/", $tmpKey, $res)){ 
      $tmpKey = str_replace($res[0], "", $tmpKey); 
      $optionArgList[]= $tmpKey; 
     } 
    }else{ 
     $tmpVal = null; 
    } 
   } 
   //-----如果没有设置相应的参数 
   if(!isset($arr[$tmpKey]) || $arr[$tmpKey] === ""){ 
    if($tmpVal == $pre){ 
     continue; 
    }else if($tmpVal){//则使用默认的值 
     $arr[$tmpKey] = $tmpVal; 
    }else{ 
     $this->showError("api调用参数错误","未传入参数$tmpKey"); 
    } 
   } 
   $keysArr[$tmpKey] = $arr[$tmpKey]; 
  } 
  //检查选填参数必填一的情形 
  if(count($optionArgList)!=0){ 
   $n = 0; 
   foreach($optionArgList as $val){ 
    if(in_array($val, array_keys($keysArr))){ 
     $n++; 
    } 
   } 
   if(!$n){ 
    $str = implode(",",$optionArgList); 
    $this->showError("api调用参数错误",$str."必填一个"); 
   } 
  } 
  if($method == "POST"){ 
   $response = $this->post($baseUrl, $keysArr, 0); 
  }else if($method == "GET"){ 
   $baseUrl=$baseUrl.&#39;?&#39;.http_build_query($keysArr); 
   $response = $this->get_contents($baseUrl); 
  } 
  return $response; 
 } 
  
 public function post($url, $keysArr, $flag = 0){ 
  $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, $url); 
  $ret = curl_exec($ch); 
  curl_close($ch); 
  return $ret; 
 } 
}
Méthode d'utilisation : Tencent SDK, API écriture Il est très détaillé et ne sera pas répété

Adresse : http://wiki.connect.qq.com/Website access summary

De cette façon, la connexion rapide QQ est en fait très réussie. simple. Vous pouvez l'essayer. Essayez-le.

Si quelque chose n'est pas clair, vous pouvez lire l'introduction officielle pour plus de détails,


Conseils : Comment tester la connexion rapide QQ localement

Méthode : Modifier le fichier de configuration HOST

Ouvrir. C :WindowsSystem32driversetchost
2. Ajoutez 127.0.0.1 www.test.com
puis utilisez.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles sur la façon d'implémenter la connexion rapide QQ avec PHP, veuillez faire attention au site Web chinois de PHP !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn