thinkPHP3.2 第三方登录(QQ登录)
来源:互联网 发布:淘宝介入是什么意思 编辑:程序博客网 时间:2024/05/21 06:44
<?php
namespace Home\Controller;
use Think\Controller;
class LoginController extends PublicController {
//APP ID
public $app_id="你的app_id";
//APP KEY
public $app_key="你的app_key";
//回调地址
public $callBackUrl="http://域名/项目名/Home/Login/userinfo";
public function index(){
header('Location:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=你的app_id&redirect_uri=http://域名/项目名/Home/Login/userinfo&state=state&scope=get_user_info,list_album,upload_pic,do_like');
}
public function userinfo(){
//第一步,获取code(访问index即可)
$code=$_GET['code'];
//echo $code;
$state=$_GET['state'];
//第二步,获取access_token
$access_token=$this->getAccessToken($code);
echo $access_token.'<br>';
//第三步,获取openid
$openid=$this->get_openid($access_token);
echo $openid.'<br>';
//第四步,获取用户信息
$app_id=$this->app_id;
$userinfo=$this->get_user_info($app_id,$access_token,$openid);
echo $userinfo['nickname'];
print_r($userinfo);
}
/**
* 获取access_token值
* @return array 返回包含access_token,过期时间的数组
* */
public function getAccessToken($code){
$url = "https://graph.qq.com/oauth2.0/token";
$param = array(
"grant_type" => "authorization_code",
"client_id" => $this->app_id,
"client_secret" => $this->app_key,
"code" => $code,
"state" => "state",
"redirect_uri" => $this->callBackUrl
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
$params = array();
parse_str($response, $params);
return $params["access_token"];
}
/**
* 获取client_id 和 openid
* @param $access_token access_token验证码
* @return array 返回包含 openid的数组
* */
private function get_openid($access_token) {
$url = "https://graph.qq.com/oauth2.0/me";
$param = array(
"access_token" => $access_token
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
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) || $user->openid == "") {
return false;
}
return $user->openid;
}
/**
* 获取用户信息
* @param $client_id
* @param $access_token
* @param $openid
* @return array 用户的信息数组
* */
public function get_user_info($app_id,$token,$openid){
$url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';
$str = $this->get_url($url);
if($str == false) {
return false;
}
$arr = json_decode($str,true);
return $arr;
}
//CURL GET
public function get_url($url, $param = null) {
if($param != null) {
$query = http_build_query($param);
$url = $url . '?' . $query;
}
$ch = curl_init();
if(stripos($url, "https://") !== false){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
}else{
echo $status["http_code"];
return false;
}
}
/*
* HTTP POST Request
*/
public function post_url($url, $params) {
$ch = curl_init();
if(stripos($url, "https://") !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
} else {
return false;
}
}
//json_encode转换中文解决方法
public function encode_json($str){
$code = json_encode($str);
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
create_function(
'$matches',
'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
),
$code);
}
}
namespace Home\Controller;
use Think\Controller;
class LoginController extends PublicController {
//APP ID
public $app_id="你的app_id";
//APP KEY
public $app_key="你的app_key";
//回调地址
public $callBackUrl="http://域名/项目名/Home/Login/userinfo";
public function index(){
header('Location:https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=你的app_id&redirect_uri=http://域名/项目名/Home/Login/userinfo&state=state&scope=get_user_info,list_album,upload_pic,do_like');
}
public function userinfo(){
//第一步,获取code(访问index即可)
$code=$_GET['code'];
//echo $code;
$state=$_GET['state'];
//第二步,获取access_token
$access_token=$this->getAccessToken($code);
echo $access_token.'<br>';
//第三步,获取openid
$openid=$this->get_openid($access_token);
echo $openid.'<br>';
//第四步,获取用户信息
$app_id=$this->app_id;
$userinfo=$this->get_user_info($app_id,$access_token,$openid);
echo $userinfo['nickname'];
print_r($userinfo);
}
/**
* 获取access_token值
* @return array 返回包含access_token,过期时间的数组
* */
public function getAccessToken($code){
$url = "https://graph.qq.com/oauth2.0/token";
$param = array(
"grant_type" => "authorization_code",
"client_id" => $this->app_id,
"client_secret" => $this->app_key,
"code" => $code,
"state" => "state",
"redirect_uri" => $this->callBackUrl
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
$params = array();
parse_str($response, $params);
return $params["access_token"];
}
/**
* 获取client_id 和 openid
* @param $access_token access_token验证码
* @return array 返回包含 openid的数组
* */
private function get_openid($access_token) {
$url = "https://graph.qq.com/oauth2.0/me";
$param = array(
"access_token" => $access_token
);
$response = $this->get_url($url, $param);
if($response == false) {
return false;
}
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) || $user->openid == "") {
return false;
}
return $user->openid;
}
/**
* 获取用户信息
* @param $client_id
* @param $access_token
* @param $openid
* @return array 用户的信息数组
* */
public function get_user_info($app_id,$token,$openid){
$url = 'https://graph.qq.com/user/get_user_info?oauth_consumer_key='.$app_id.'&access_token='.$token.'&openid='.$openid.'&format=json';
$str = $this->get_url($url);
if($str == false) {
return false;
}
$arr = json_decode($str,true);
return $arr;
}
//CURL GET
public function get_url($url, $param = null) {
if($param != null) {
$query = http_build_query($param);
$url = $url . '?' . $query;
}
$ch = curl_init();
if(stripos($url, "https://") !== false){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
}else{
echo $status["http_code"];
return false;
}
}
/*
* HTTP POST Request
*/
public function post_url($url, $params) {
$ch = curl_init();
if(stripos($url, "https://") !== false) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$content = curl_exec($ch);
$status = curl_getinfo($ch);
curl_close($ch);
if(intval($status["http_code"]) == 200) {
return $content;
} else {
return false;
}
}
//json_encode转换中文解决方法
public function encode_json($str){
$code = json_encode($str);
return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
create_function(
'$matches',
'return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UCS-2BE");'
),
$code);
}
}
阅读全文
0 1
- thinkPHP3.2 第三方登录(QQ登录)
- thinkPHP3.2.2使用thinkSDK实现第三方登录(以QQ登录)为例。
- 第三方登录(QQ登录)
- QQ第三方登录
- QQ第三方登录
- QQ第三方登录
- QQ第三方登录
- QQ第三方登录
- 第三方qq登录
- QQ第三方登录
- QQ第三方登录
- QQ第三方登录
- 第三方登录QQ
- QQ第三方登录
- qq第三方登录
- qq第三方登录
- 第三方QQ登录
- QQ第三方登录
- Select2开源项目如何轻松加入到项目中
- Android Ndk开发配置
- 第1章初见网络爬虫
- 程序员生涯
- NanoPC-T2(S5P4418)无法通过Android usb host API识别两个以上USB设备
- thinkPHP3.2 第三方登录(QQ登录)
- bootbox中文
- Java 连接虚拟机上的 redis
- IOS 从app store下载运行ios9.3以下的系统就崩溃
- Oracle数据库卸载
- 根据宝宝生日返回当前宝宝年龄
- xcode8.2.1支持iOS8.3.1系统 添加设备依赖库文件
- hibernate学习之核心api
- neo4j 的使用说明(三)