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

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Introduction à la fonction PHP — get_headers() : Présentation de l'obtention des informations d'en-tête de réponse de l'URL : Dans le développement PHP, nous avons souvent besoin d'obtenir les informations d'en-tête de réponse de la page Web ou de la ressource distante. La fonction PHP get_headers() peut facilement obtenir les informations d'en-tête de réponse de l'URL cible et les renvoyer sous la forme d'un tableau. Cet article présentera l'utilisation de la fonction get_headers() et fournira quelques exemples de code associés. Utilisation de la fonction get_headers() : get_header

L'échec de la session est généralement dû à l'expiration de la durée de vie de la session ou à l'arrêt du serveur. Les solutions : 1. Prolonger la durée de vie de la session ; 2. Utiliser le stockage persistant ; 3. Utiliser les cookies ; 4. Mettre à jour la session de manière asynchrone ; 5. Utiliser un middleware de gestion de session ;

Solution au problème inter-domaines de PHPSession Dans le développement de la séparation front-end et back-end, les requêtes inter-domaines sont devenues la norme. Lorsque nous traitons de problèmes interdomaines, nous impliquons généralement l'utilisation et la gestion de sessions. Cependant, en raison des restrictions de la politique d'origine du navigateur, les sessions ne peuvent pas être partagées par défaut entre les domaines. Afin de résoudre ce problème, nous devons utiliser certaines techniques et méthodes pour réaliser le partage de sessions entre domaines. 1. L'utilisation la plus courante des cookies pour partager des sessions entre domaines

La raison de l'erreur est NameResolutionError(self.host,self,e)frome, qui est un type d'exception dans la bibliothèque urllib3. La raison de cette erreur est que la résolution DNS a échoué, c'est-à-dire le nom d'hôte ou l'adresse IP qui était. La tentative de résolution n'a pas pu être trouvée. Cela peut être dû au fait que l'adresse URL saisie est incorrecte ou que le serveur DNS est temporairement indisponible. Comment résoudre cette erreur Il peut y avoir plusieurs façons de résoudre cette erreur : Vérifiez si l'adresse URL saisie est correcte et assurez-vous qu'elle est accessible Assurez-vous que le serveur DNS est disponible, vous pouvez essayer d'utiliser la commande "ping" dans la ligne de commande pour tester si le serveur DNS est disponible Essayez d'accéder au site Web en utilisant l'adresse IP au lieu du nom d'hôte si vous êtes derrière un proxy

Fonction signifie fonction. Il s'agit d'un bloc de code réutilisable avec des fonctions spécifiques. C'est l'un des composants de base d'un programme. Il peut accepter des paramètres d'entrée, effectuer des opérations spécifiques et renvoyer des résultats. code pour améliorer la réutilisabilité et la maintenabilité du code.

Différences : 1. Différentes définitions, l'URL est un localisateur de ressources uniforme et le HTML est un langage de balisage hypertexte ; 2. Il peut y avoir plusieurs URL dans un HTML, mais une seule page HTML peut exister dans une URL. 3. HTML fait référence à ; une page Web, et l'url fait référence à l'adresse du site Web.

1. Implémentation de la connexion SMS basée sur la session 1.1 Organigramme de connexion SMS 1.2 Implémentation de l'envoi du code de vérification SMS Description de la demande frontale : Description de la méthode de demande Chemin de requête POST/utilisateur/code paramètre de demande téléphone (numéro de téléphone) valeur de retour Aucune interface back-end implémentation : @Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1 Vérifiez le numéro de téléphone mobile si.

Scrapy est un puissant framework d'exploration Python qui peut être utilisé pour obtenir de grandes quantités de données sur Internet. Cependant, lors du développement de Scrapy, nous rencontrons souvent le problème de l'exploration des URL en double, ce qui fait perdre beaucoup de temps et de ressources et affecte l'efficacité. Cet article présentera quelques techniques d'optimisation de Scrapy pour réduire l'exploration des URL en double et améliorer l'efficacité des robots d'exploration Scrapy. 1. Utilisez les attributs start_urls et Allowed_domains dans le robot d'exploration Scrapy pour
