好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

QQ登录集成到自己网站php代码 - php高级应用

QQ登录集成到自己网站php代码

我们现在在各大网站论坛都可以看到点击一个QQ图标就可以利用自己的QQ号在网站进行登录了,下面我来告诉你一段QQ登录集成到自己网站php代码,有需要的朋友可参考.

1.打开open.qq测试数据 添加创建应用:-》输入常规的数据,你会看到对应的APP ID和KEY值,这是对你身份证的唯一的验证.

2.打开 http://connect.qq测试数据/manage/ 点击->添加网站->输入相关信息,这里比较特别注意的是,回调地址那里填上你域名就可以了以上申核需要一到两天时间,耐心等待.

3.打开 http://wiki.opensns.qq测试数据/wiki/%E3%80%90QQ%E7%99%BB%E5%BD%95%E3%80%91%E7%BD%91%E7%AB%99%E6%8E%A5%E5%85%A5 找到SDK库下载,我在这里下载是官方的php SDK包,如果你的虚拟空间file_get_contents不技持https,可以考虑用curl函数来替代,好多童鞋常常因为获取不到access_token也就是这个原因,任何一个包不是一气呵成了,还需你配置相关的配置,这个繁索的调试过程我就在这里展开谈了,说说原理->通过你的网站登陆QQ state和scope->获得access_token->再获得每个QQ唯一的身份ID openid.

4.在这里你调试成功后,获得ID后,还需和你当前网站帐号绑定,才能下次登陆的时候自动去识别你的相关绑定帐号内容.

常见问题:

找到sssion.php session_save_path 加上注释//,注释掉设置路径

解决方法:

找到 Utils.php  function get_url_contents 函数内容直接用下面代码替代,因为file_get_content默认不支持访问https,如果要支持需配置php.ini,激活 php_openssl.dll 模块,这个大家百度配置一下便可,php代码如下:

$ch  = curl_init();      curl_setopt( $ch , CURLOPT_URL, $url );      curl_setopt( $ch , CURLOPT_SSL_VERIFYPEER, false);      curl_setopt( $ch , CURLOPT_SSL_VERIFYHOST, false);      curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1);      $result  = curl_exec( $ch );      return   $result  

下面是一个完整的实例,是一个QQ登录API示范接口,程序为PHP、具体代码如下:

<?php  /**     * 申请http://connect.opensns.qq测试数据/apply     * 列表http://connect.opensns.qq测试数据/my     */     session_start();     $qq_oauth_config  =  array (          'oauth_consumer_key' => '*******' , //APP ID           'oauth_consumer_secret' => '******************' , //APP KEY           'oauth_callback' => "http://HdhCmsTestsunnyi.cn/qq.php?action=reg" ,//这里修改为当前脚本,但是要保留?action=reg          'oauth_request_token_url' => "http://openapi.qzone.qq测试数据/oauth/qzoneoauth_request_token" ,          'oauth_authorize_url' => 'http://openapi.qzone.qq测试数据/oauth/qzoneoauth_authorize' ,          'oauth_request_access_token_url' => 'http://openapi.qzone.qq测试数据/oauth/qzoneoauth_access_token' ,          'user_info_url'  =>  'http://openapi.qzone.qq测试数据/user/get_user_info' ,     );     $action  = isset( $_GET [ 'action' ]) ?  $_GET [ 'action' ] :  '' ;             $qq  =  new  qq_oauth( $qq_oauth_config );     switch ( $action ){          //用户登录 Step1:请求临时token           case   'login' :              $token  =  $qq ->oauth_request_token();              $_SESSION [ 'oauth_token_secret' ] =  $token [ 'oauth_token_secret' ];              $qq ->authorize( $token [ 'oauth_token' ]);          break ;          //Step4:Qzone引导用户跳转到第三方应用           case   'reg' :              $qq ->register_user();              $access_token  =  $qq ->request_access_token();              if ( $token  =  $qq ->save_access_token( $access_token )){                  //保存,一般发给用户cookie,以及用户入库                   //var_dump($token);                   $_SESSION [ 'oauth_token' ] =  $token [ 'oauth_token' ];                  $_SESSION [ 'oauth_token_secret' ] =  $token [ 'oauth_token_secret' ];                 $_SESSION [ 'openid' ] =  $token [ 'openid' ];                 header( 'Content-Type: text/html; charset=utf-8' );                  $user_info  = json_decode( $qq ->get_user_info());                  if ( $user_info ->ret!=0){                      exit ( "获取头像昵称时发生错误" . $user_info ->msg);                 }  else  {                      echo   'QQ昵称:' , $user_info ->nickname,                      '<img src="' , $user_info ->figureurl, '" />' ,                      '<img src="' , $user_info ->figureurl_1, '" />' ,                      '<img src="' , $user_info ->figureurl_2, '" />' ;                 }                              }          break ;          default  :     }             class  qq_oauth{          private   $config ;          function  __construct( $config ){              $this ->config =  $config ;         }          /**          * 返回配置          * @param string $name          *           */          function  C( $name ){              return  isset( $this ->config[ $name ]) ?   $this ->config[ $name ] : FALSE;        }          /**          * 构建请求URL          * @param string $url          * @param array $params          * @param string $oauth_token_secret          *           */          function  build_request_uri( $url , $params = array (), $oauth_token_secret = '' ){              $oauth_consumer_key  =  $this ->C( 'oauth_consumer_key' );              $oauth_consumer_secret  =  $this ->C( 'oauth_consumer_secret' );                           $params  =  array_merge ( array (                  'oauth_version' => '1.0' ,                  'oauth_signature_method' => 'HMAC-SHA1' ,                  'oauth_timestamp' =>time(),                  'oauth_nonce' =>rand(1000,99999999),                  'oauth_consumer_key' => $oauth_consumer_key ,             ), $params );              $encode_params  =  $params ;             ksort( $encode_params );              $oauth_signature  =  'GET&' .urlencode( $url ). '&' .urlencode(http_build_query( $encode_params ));              $oauth_signature  =  base64_encode (hash_hmac( 'sha1' , $oauth_signature , $oauth_consumer_secret . '&' . $oauth_token_secret ,true));             $params [ 'oauth_signature' ] =  $oauth_signature ;              return   $url . '?' .http_build_query( $params );         }          /**          * 校验回调是否返回约定的参数           */          function  check_callback(){              if (isset( $_GET [ 'oauth_token' ]))                  if (isset( $_GET [ 'openid' ]))                      if (isset( $_GET [ 'oauth_signature' ]))                          if (isset( $_GET [ 'timestamp' ]))                              if (isset( $_GET [ 'oauth_vericode' ]))                                  return  true;              return  false;         }                  function  get_contents( $url ){              $curl  = curl_init();             curl_setopt( $curl ,CURLOPT_RETURNTRANSFER,true);             curl_setopt( $curl ,CURLOPT_URL, $url );              return  curl_exec( $curl );         }          /**          * Step1:请求临时token、Step2:生成未授权的临时token          */          function  oauth_request_token(){              $url  =  $this ->build_request_uri( $this ->C( 'oauth_request_token_url' ));              $tmp_oauth_token  =  $this ->get_contents( $url );              parse_str ( $tmp_oauth_token );              /*             oauth_token 未授权的临时token             oauth_token_secret  token的密钥,该密钥仅限于临时token             error_code  错误码             */              if (isset( $error_code ))  exit ( $error_code );              return   array (                  'oauth_token' => $oauth_token ,                  'oauth_token_secret' => $oauth_token_secret             );         }          /**          * Step3:引导用户到Qzone的登录页          * @param string $oauth_token 未授权的临时token          */          function  authorize( $oauth_token ){              $str  =  "HTTP/1.1 302 Found" ;             header( $str );              $url  =  $this ->C( 'oauth_authorize_url' );              $query_strings  = http_build_query( array (                  'oauth_consumer_key' => $this ->C( 'oauth_consumer_key' ),                  'oauth_token' => $oauth_token ,                  'oauth_callback' => $this ->C( 'oauth_callback' ),             ));             header( 'Location: ' . $url . '?' . $query_strings );         }          /**          * Step4:Qzone引导用户跳转到第三方应用          * @return bool 验证是否有效           */          function  register_user(){              /*              * oauth_token  已授权的临时token              * openid   腾讯用户对外的统一ID,该OpenID与用户QQ号码一一对应              * oauth_signature  签名值,方便第三方来验证openid以及来源的可靠性。              *      使用HMAC-SHA1算法:              *      源串:openid+timestamp(串中间不要添加'+'符号)              *      密钥:oauth_consumer_secret              * timestamp    openid的时间戳              * oauth_vericode   授权验证码。              */              if ( $this ->check_callback()){                  //校验签名                   $signature  =  base64_encode (hash_hmac( 'sha1' , $_GET [ 'openid' ]. $_GET [ 'timestamp' ], $this ->C( 'oauth_consumer_secret' ),true));                  if (! empty empty ( $_GET [ 'oauth_signature' ]) &&  $signature == $_GET [ 'oauth_signature' ]){                      $_SESSION [ 'oauth_token' ] =  $_GET [ 'oauth_token' ];                      $_SESSION [ 'oauth_vericode' ] =  $_GET [ 'oauth_vericode' ];                      return ;                 }             }              //校验未通过               exit ( 'UNKNOW REQUEST' );         }          /**          * Step5:请求access token           */          function  request_access_token(){              $url  =  $this ->build_request_uri( $this ->C( 'oauth_request_access_token_url' ), array (                  'oauth_token' => $_SESSION [ 'oauth_token' ],                  'oauth_vericode' => $_SESSION [ 'oauth_vericode' ]             ), $_SESSION [ 'oauth_token_secret' ]);              return   $this ->get_contents( $url );         }          /**          * Step6:生成access token (保存access token)          *           * 关于access_token          * 目前access_token(及其secret)是长期有效的,和某一个openid对应,目前可以支持线下获取该openid的信息。           * 当然,用户有权限在Qzone这边删除对第三方的授权,此时该access_token会失效,需要重新走整个流程让用户授权。          * 以后会逐步丰富access_token的有效性,长期有效、短期有效、用户登录时才有效等。          */          function  save_access_token( $access_token_str ){              parse_str ( $access_token_str , $access_token_arr );              if (isset( $access_token_arr [ 'error_code' ])){                  return  FALSE;             }  else  {                  return   $access_token_arr ;             }         }          /**          * 目前腾讯仅开放该API          * 获取登录用户信息,目前可获取用户昵称及头像信息。          * http://openapi.qzone.qq测试数据/user/get_user_info          */          function  get_user_info(){              $url  =  $this ->build_request_uri( $this ->C( 'user_info_url' ), array (                  'oauth_token' => $_SESSION [ 'oauth_token' ],                  'openid' => $_SESSION [ 'openid' ],             ), $_SESSION [ 'oauth_token_secret' ]);              return   $this ->get_contents( $url );         }     }?> 

查看更多关于QQ登录集成到自己网站php代码 - php高级应用的详细内容...

  阅读:46次