QQ登录OAuth2.0 php接入种
QQ登录OAuth2.0 php接入类
?
/**
?
*
?
* qq登录
?
* @author http://www.heui.org
?
*
?
*/
class
Oauth_qq
{
??
private
static
$_instance
;
??
private
$config
=
array
();
?
??
private
function
__construct(
$config
)
??
{
????
$this
->Oauth_qq(
$config
);
??
}
?
??
public
static
function
getInstance(
$config
)
??
{
????
if
(!isset(self::
$_instance
))
????
{
??????
$c
=
__CLASS__
;
??????
self::
$_instance
=
new
$c
(
$config
);
????
}
????
return
self::
$_instance
;
??
}
?
??
private
function
Oauth_qq(
$config
)
??
{
????
$this
->config =
$config
;
????
$_SESSION
[
"appid"
]??? =
$this
->config[
'appid'
];
????
$_SESSION
[
"appkey"
]?? =
$this
->config[
'appkey'
];
????
$_SESSION
[
"callback"
] =
$this
->config[
'callback'
];
????
$_SESSION
[
"scope"
] =
"get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo"
;
??
}
?
??
function
login()
??
{
????
$_SESSION
[
'state'
] = md5(uniqid(rand(), TRUE));
//CSRF protection
????
$login_url
=
"https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=
"
????
.
$_SESSION
[
"appid"
] .
"&redirect_uri="
. urlencode(
$_SESSION
[
"callback"
])
????
.
"&state="
.
$_SESSION
[
'state'
]
????
.
"&scope="
.
$_SESSION
[
"scope"
];
????
header(
"Location:$login_url"
);
??
}
?
??
function
callback()
??
{
????
if
(
$_REQUEST
[
'state'
] ==
$_SESSION
[
'state'
])
//csrf
????
{
??????
$token_url
=
"https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&
"
??????
.
"client_id="
.
$_SESSION
[
"appid"
].
"&redirect_uri="
. urlencode(
$_SESSION
[
"callback"
])
??????
.
"&client_secret="
.
$_SESSION
[
"appkey"
].
"&code="
.
$_REQUEST
[
"code"
];
?
??????
$response
= get_url_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 id="error">error:</h3>"
.
$msg
->error;
??????????
echo
"<h3 id="msg">msg? :</h3>"
.
$msg
->error_description;
??????????
exit
;
????????
}
??????
}
?
??????
$params
=
array
();
??????
parse_str
(
$response
,
$params
);
?
??????
$_SESSION
[
"access_token"
] =
$params
[
"access_token"
];
????
}
????
else
????
{
??????
echo
(
"The state does not match. You may be a victim of CSRF."
);
????
}
??
}
?
??
function
get_openid()
??
{
????
$graph_url
=
"https://graph.qq.com/oauth2.0/me?access_token=
"
????
.
$_SESSION
[
'access_token'
];
?
????
$str
? = get_url_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 id="error">error:</h3>"
.
$user
->error;
??????
echo
"<h3 id="msg">msg? :</h3>"
.
$user
->error_description;
??????
exit
;
????
}
?
????
//set openid to session
????
return
$_SESSION
[
"openid"
] =
$user
->openid;
??
}
?
??
function
get_user_info()
??
{
????
$get_user_info
=
"https://graph.qq.com/user/get_user_info?
"
????
.
"access_token="
.
$_SESSION
[
'access_token'
]
????
.
"&oauth_consumer_key="
.
$_SESSION
[
"appid"
]
????
.
"&openid="
.
$_SESSION
[
"openid"
]
????
.
"&format=json"
;
?
????
$info
= get_url_contents(
$get_user_info
);
????
$arr
= json_decode(
$info
, true);
?
????
return
$arr
;
??
}
?
??
public
function
__clone()
??
{
????
trigger_error(
'Clone is not allow'
,E_USER_ERROR);
??
}
?
}
?
/* 公用函数 */
if
(!function_exists(
"do_post"
))
{
??
function
do_post(
$url
,
$data
)
??
{
????
$ch
= curl_init();
????
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, TRUE);
????
curl_setopt(
$ch
, CURLOPT_POST, TRUE);
????
curl_setopt(
$ch
, CURLOPT_POSTFIELDS,
$data
);
????
curl_setopt(
$ch
, CURLOPT_URL,
$url
);
????
$ret
= curl_exec(
$ch
);
?
????
curl_close(
$ch
);
????
return
$ret
;
??
}
}
if
(!function_exists(
"get_url_contents"
))
{
??
function
get_url_contents(
$url
)
??
{
????
if
(
ini_get
(
"allow_url_fopen"
) ==
"1"
)
????
return
file_get_contents
(
$url
);
?
????
$ch
= curl_init();
????
curl_setopt(
$ch
, CURLOPT_RETURNTRANSFER, TRUE);
????
curl_setopt(
$ch
, CURLOPT_URL,
$url
);
????
$result
=? curl_exec(
$ch
);
????
curl_close(
$ch
);
?
????
return
$result
;
??
}
}
|
使用实例:
$config
[
'appid'
]??? =
''
;
$config
[
'appkey'
]?? =
''
;
$config
[
'callback'
] =
''
;
$o_qq
= Oauth_qq::getInstance(
$config
);
?
//then
$o_qq
->login();
//or
$o_qq
->callback();
$o_qq
->get_openid();
$o_qq
->get_user_info();
|
原文:http://www.heui.org/archives/454

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Pengenalan fungsi PHP—get_headers(): Gambaran keseluruhan mendapatkan maklumat pengepala respons URL: Dalam pembangunan PHP, kita selalunya perlu mendapatkan maklumat pengepala respons halaman web atau sumber jauh. Fungsi PHP get_headers() boleh dengan mudah mendapatkan maklumat pengepala respons URL sasaran dan mengembalikannya dalam bentuk tatasusunan. Artikel ini akan memperkenalkan penggunaan fungsi get_headers() dan menyediakan beberapa contoh kod yang berkaitan. Penggunaan fungsi get_headers(): get_header

Kegagalan sesi biasanya disebabkan oleh tamat tempoh seumur hidup sesi atau penutupan pelayan. Penyelesaian: 1. Memanjangkan hayat sesi; 2. Gunakan storan berterusan;

Penyelesaian kepada masalah silang domain PHPSession Dalam pembangunan pemisahan front-end dan back-end, permintaan merentas domain telah menjadi kebiasaan. Apabila menangani isu merentas domain, kami biasanya melibatkan penggunaan dan pengurusan sesi. Walau bagaimanapun, disebabkan oleh sekatan dasar asal penyemak imbas, sesi tidak boleh dikongsi secara lalai merentas domain. Untuk menyelesaikan masalah ini, kita perlu menggunakan beberapa teknik dan kaedah untuk mencapai perkongsian sesi merentas domain. 1. Penggunaan kuki yang paling biasa untuk berkongsi sesi merentas domain

Sebab ralat adalah NameResolutionError(self.host,self,e)daripada, yang merupakan jenis pengecualian dalam pustaka urllib3 Sebab ralat ini adalah bahawa resolusi DNS gagal, iaitu nama hos atau alamat IP yang telah cuba diselesaikan tidak dapat ditemui. Ini mungkin disebabkan oleh alamat URL yang dimasukkan tidak betul atau pelayan DNS tidak tersedia buat sementara waktu. Bagaimana untuk menyelesaikan ralat ini Mungkin terdapat beberapa cara untuk menyelesaikan ralat ini: Semak sama ada alamat URL yang dimasukkan adalah betul dan pastikan ia boleh diakses Pastikan pelayan DNS tersedia, anda boleh cuba menggunakan arahan "ping" dalam baris arahan untuk menguji sama ada pelayan DNS tersedia Cuba akses tapak web menggunakan alamat IP dan bukannya nama hos jika di belakang proksi

Fungsi bermaksud fungsi. Ia adalah blok kod yang boleh digunakan semula dengan fungsi tertentu Ia boleh menerima parameter input, melakukan operasi tertentu, dan mengembalikan hasil daripada blok yang boleh digunakan semula. kod untuk meningkatkan kebolehgunaan semula dan kebolehselenggaraan kod.

Perbezaan: 1. Definisi yang berbeza, url ialah pencari sumber seragam, dan html ialah bahasa penanda hiperteks 2. Terdapat banyak url dalam html, tetapi hanya satu halaman html boleh wujud dalam url 3. html merujuk kepada; halaman web, dan url merujuk kepada alamat tapak web.

1. Melaksanakan log masuk SMS berdasarkan sesi 1.1 Carta alir log masuk SMS 1.2 Melaksanakan penghantaran kod pengesahan SMS Perihalan permintaan hujung hadapan: Penerangan kaedah permintaan POST laluan permintaan/pengguna/kod parameter permintaan telefon (nombor telefon) nilai pulangan Tiada antara muka belakang pelaksanaan: @Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){/1

Scrapy ialah rangka kerja perangkak Python yang berkuasa yang boleh digunakan untuk mendapatkan sejumlah besar data daripada Internet. Walau bagaimanapun, apabila membangunkan Scrapy, kami sering menghadapi masalah merangkak URL pendua, yang membuang banyak masa dan sumber serta menjejaskan kecekapan. Artikel ini akan memperkenalkan beberapa teknik pengoptimuman Scrapy untuk mengurangkan rangkak URL pendua dan meningkatkan kecekapan perangkak Scrapy. 1. Gunakan atribut start_urls dan allowed_domains dalam perangkak Scrapy untuk
