>  기사  >  백엔드 개발  >  Sina, Tencent 및 Taobao 로그인을 구현하는 PHP 코드

Sina, Tencent 및 Taobao 로그인을 구현하는 PHP 코드

WBOY
WBOY원래의
2016-07-25 08:56:181105검색
  1. session_start();

  2. class openlogin{
  3. public $_URL = "";
  4. 공개 $config = array();

  5. 공용 함수 __construct(){

  6. $this->openlogin();
  7. }
  8. 함수 openlogin(){

  9. }

  10. /*获取登陆页면URL*/

  11. public function login_url(){
  12. if(empty($this->config)){
  13. return false;
  14. }
  15. $config = $this->config;
  16. $login_url = $config['login_url'];
  17. $_SESSION['state'] = $state = md5( uniqid(rand(), TRUE));
  18. $array = array(
  19. "response_type"=>"code",
  20. "state" => $state,
  21. "client_id"= >$config['appkey'],
  22. "redirect_uri"=>urlencode( $config['redirect_uri'] )
  23. );

  24. $this->set($array);

  25. $url = $this->combineURL($login_url , $this->_param);
  26. if($url){
  27. @header( "위치:".$url);
  28. }else{
  29. return false;
  30. }
  31. }

  32. /*获取access_token*/

  33. public function get_access_token(){
  34. if(empty($this->config)){
  35. return false;
  36. }

  37. $config = $this->config;

  38. if(! $config['code'] = $_REQUEST['code'] ){

  39. return false;
  40. }

  41. $url = $config['authorization_url'];

  42. $state = $_SESSION['state'];
  43. $array = array(
  44. "grant_type"=>"authorization_code",
  45. " client_id" => $config['appkey'],
  46. "client_secret"=>$config['appsecret'],
  47. "code"=>$config['code'],
  48. "redirect_uri"=>urlencode( $config['redirect_uri'] ),
  49. "state"=>$state
  50. );
  51. $this->set($array);
  52. return $this->post_contents($url);
  53. }
  54. /* set $this->_param 数组*/
  55. 공용 함수 세트($array) {
  56. if(empty($array)){
  57. return false;
  58. }
  59. $this->_param = array();
  60. foreach($array as $name=> $value){
  61. $this->_param[$name] = $value;
  62. }
  63. }
  64. /**
  65. * post_contents
  66. * 서버는 post 요청을 통해 콘텐츠를 얻습니다
  67. * @param string $url 요청된 URL, spliced ​​​​
  68. * @return string 요청에 의해 반환된 콘텐츠
  69. */
  70. 공개 함수 post_contents($url) {
  71. if(empty($url)){
  72. return false;
  73. }
  74. $param = $this->combineURL("" , $this->_param);
  75. $ch = cur_init();
  76. // URL과 상호작용하는 URL
  77. 컬_setopt($ch, CURLOPT_URL, $url);
  78. 컬_setopt($ch, CURLOPT_FAILONERROR, false);
  79. 컬_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  80. 컬_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  81. 컬_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  82. 컬_setopt($ch, CURLOPT_POST, 1);
  83. 컬_setopt($ch, CURLOPT_POSTFIELDS, $param);
  84. // 抓取URL并把它传递给浏览器
  85. $reponse =curl_exec($ch);
  86. 컬_닫기($ch);
  87. $응답 반환;
  88. }
  89. /**
  90. * get_contents
  91. * 서버는 get 요청을 통해 콘텐츠를 얻습니다
  92. * @param string $url 요청된 URL, spliced ​​​​
  93. * @return string 요청에 의해 반환된 콘텐츠
  94. */
  95. 공개 함수 get_contents($url){
  96. $ch =curl_init();
  97. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  98. 컬_세톱($ch, CURLOPT_RETURNTRANSFER, TRUE);
  99. 컬_세톱($ch, CURLOPT_URL, $url);
  100. $response = 컬_exec($ch);
  101. 컬_닫기($ch);
  102. //-------请求为공간

  103. if(empty($response)){
  104. return false;
  105. }

  106. return $response;

  107. }

  108. /**

  109. * CombineURL
  110. * 연결된 URL
  111. * @param string $baseURL based on url
  112. * @param array $keysArr 매개변수 목록 배열
  113. * @return 문자열은 연결된 URL을 반환합니다
  114. */
  115. 공개 함수 CombineURL($baseURL,$keysArr){
  116. if( $baseURL=="" ){
  117. $combined = "";
  118. }else{
  119. $combined = $baseURL."?";
  120. }
  121. $valueArr = array();

  122. foreach($keysArr as $key => $val){

  123. $valueArr[] = "$key=$val";
  124. }

  125. $keyStr = implode("&",$valueArr);

  126. $combined .= ($keyStr);
  127. return $combined;
  128. }
  129. }
  130. //php实现QQ登录

  131. class qq_openlogin은 openlogin을 확장합니다.{
  132. private $openname = "qq";
  133. public $config = array(
  134. "appkey"=> ;"당신의 앱 키",
  135. "appsecret"=>"당신의 앱 비밀",
  136. "redirect_uri"=>"XXXXX",
  137. "login_url" => .com/oauth2.0/authorize",
  138. "scope"=>"get_user_info,add_share,list_album,add_album,upload_pic,add_topic,add_one_blog,add_weibo,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,
  139. get_info ,get_other_info,get_fanslist,get_idolist,add_idol,del_idol,get_tenpay_addr",
  140. "authorization_url"=>"https://graph.qq.com/oauth2.0/token"
  141. );

  142. function __construct()

  143. {
  144. $this->qq_openlogin();
  145. }
  146. function qq_openlogin(){
  147. parent::__construct();
  148. }< ;/p>
  149. function get_access_token(){

  150. $response = parent::get_access_token();
  151. /*检测错误是否发生*/
  152. if(strpos($response, "callback") !== false ){

  153. $lpos = strpos($response, "(");

  154. $rpos = strrpos($response, ")");
  155. $response = substr($response, $lpos 1, $rpos - $lpos - 1);
  156. $msg = json_decode($response);

  157. if(isset($msg->error)){

  158. return false;
  159. }
  160. }

  161. $params = array();

  162. parse_str($response, $params);
  163. /*access_token == $params[access_token]*/
  164. /*获取 openid */
  165. $ 응답 = $this->get_contents("https://graph.qq.com/oauth2.0/me?access_token=".$params['access_token']);

  166. if(strpos($response, "callback") !== false){

  167. $lpos = strpos($response, "(");

  168. $rpos = strrpos($response, ")");
  169. $response = substr($response, $lpos 1, $rpos - $lpos - 1);
  170. }

  171. $user = json_decode($response);

  172. if(isset($user->error)){
  173. return false;
  174. }
  175. /*

  176. 사용자 정보 획득에 필요한 매개변수: openid(사용자 ID, QQ 번호와 1:1 대응), access_token(Access_Token은 Authorization_Code를 사용하여 얻을 수 있음) access_token의 유효 기간은 3개월입니다.), oauth_consumer_key(사용자 appid), format(반환 형식)
  177. */
  178. /*데이터베이스 저장*/
  179. $open_param = array(
  180. "openid"= > ;$user->openid,
  181. "access_token"=>$params['access_token']
  182. );
  183. //
  184. $open_param['oauth_consumer_key'] = $this-> ; config['appkey'];
  185. $open_param['format'] = "json";
  186. /*splicing url*/
  187. $get_user_url = $this->combineURL("https:// graph .qq.com/user/get_user_info",$open_param);
  188. //사용자 정보 가져오기
  189. $userinfo = $this->get_contents($get_user_url);

  190. < p> ; $userinfo = json_decode($userinfo);

  191. return $userinfo;

  192. }
  193. }

  194. //php 구현 Weibo 로그인

  195. class weibo_openlogin 확장 openlogin{
  196. private $openname = "weibo";
  197. public $config = array(
  198. "appkey"=>"your appkey",
  199. "appsecret "=>"your appsecret",
  200. "login_url" => "https://api.weibo.com/oauth2/authorize",
  201. "redirect_uri"=>"XXXXXXX",
  202. "authorization_url"=>"https://api.weibo.com/oauth2/access_token"
  203. );

  204. 함수 __construct()

  205. {
  206. $ this->qq_openlogin();
  207. }
  208. 함수 qq_openlogin(){
  209. parent::__construct();
  210. }

  211. get_access_token(){

  212. $response = parent::get_access_token();
  213. $userinfo = json_decode($response);
  214. return $userinfo;
  215. }
  216. }

  217. //php는 Taobao 로그인을 구현합니다.

  218. class taobao_openlogin은 openlogin을 확장합니다.{
  219. private $openname = "taobao";
  220. public $config = array(
  221. "appkey"=>" your appkey",
  222. "appsecret"=>"appsecret",
  223. "redirect_uri"=>"XXXXX",
  224. "authorization_url"=>"https://oauth.taobao.com /token",
  225. "login_url"=>"https://oauth.taobao.com/authorize"
  226. );

  227. 함수 __construct()

  228. {
  229. $this->qq_openlogin();
  230. }
  231. 함수 qq_openlogin(){
  232. parent::__construct();
  233. }

  234. 함수 get_access_token(){

  235. $response = parent::get_access_token();
  236. $userinfo = json_decode($response);
  237. return $userinfo;
  238. }

  239. }

  240. if($_GET['openname']){
  241. $openname = $_GET['openname']."_openlogin";
  242. $openlogin = new $openname( );
  243. if(!isset($_REQUEST['code'])){
  244. //url 요청
  245. $url = $openlogin->login_url();
  246. if(!$url ){
  247. echo "0";
  248. exit();
  249. }
  250. }else{
  251. if(isset($_REQUEST["state"]) && ($_SESSION['state' ] != $_REQUEST["state"] )){
  252. echo "1";
  253. exit();
  254. }
  255. $rs = $openlogin->get_access_token();
  256. print_r( $rs );
  257. }
  258. }
  259. ?>

코드 복사

附,人人网登陆代码。

  1. class renren_openlogin은 openlogin을 확장합니다.{

  2. private $openname = "renren";
  3. public $config = array(
  4. "appid"=>"your appid",
  5. "appkey"=>"your appkey",
  6. "appsecret"=>"your secret key",
  7. "redirect_uri"=>"XXXXXX",
  8. "authorization_url"=>"https://graph.renren.com/oauth/token",
  9. "login_url"=>"https: //graph.renren.com/oauth/authorize"
  10. );

  11. function __construct()

  12. {
  13. $this->qq_openlogin();
  14. }
  15. function qq_openlogin(){
  16. parent::__construct();
  17. }< ;/p>
  18. 함수 get_access_token(){

  19. $response = parent::get_access_token();

  20. $userinfo = json_decode($response);

  21. return $userinfo;

  22. /*
  23. access_token:获取的Access Token;
  24. expires_in:Access Token의 유效期,以秒为单位;
  25. refresh_token:용于刷新Access Token의 Refresh Token,长期有效,不会过期;
  26. 범위:액세스 토큰最终的访问范围,既用户实际授予的权限列表(用户在授权页face时,有可能会取消掉某些请求的权限)。关于权限的具体信息请参考
  27. */
  28. }

  29. /*获取登陆页면URL*/

  30. public function login_url(){
  31. if(empty($this->config)){
  32. return false;
  33. }
  34. $config = $this->config;
  35. $login_url = $config['login_url'];
  36. $array = array(
  37. "response_type"=> ;"code",
  38. "client_id"=>$config['appid'],
  39. "redirect_uri"=>urlencode( $config['redirect_uri'] )
  40. );
  41. $this->set($array);

  42. $url = $this->combineURL($login_url , $this->_param);

  43. if($url){

  44. @header("Location:".$url);
  45. }else{
  46. return false;
  47. }
  48. }
  49. }

复代代码


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.