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高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30100