原理还是很简单,需要稍微懂一点php知识才能部署成功,这也是这个功能没有大范围普及的原因之一吧。
简单说下原理,第一步是请求授权,返回一个code,接着用code获取access token和uid,uid我们可以用来绑定用户信息,access token我们可以用来获取用户信息。我之前非常傻逼,居然用token来绑定用户,后来发现居然还是会变的,我了个擦。果断改成UID了。所以这里提醒大家,用第三方登录授权的时候一定不要使用token来绑定用户信息啊。
网上也有一些免费主题提供了这个功能,说实话不是自己写的提取出来还真是蛮麻烦的,而且我看过的都需要在数据库创建新的表象,显然我们不喜欢这样,本方法直接用了user_meta来存储数据,所以不需要数据库操作。
因为新浪微博无法获取邮箱,所以创建新用户后最后跳转到资料修改页面,如果你的主题自定义了这样的页面可以跳转到这里,没有的话可以条状到wp默认的页面。花了点时间完善了个人中心,当然细节还没有打磨,感受地址,需要登录哟,如果没登录可直接在下面用新浪微博登录,暂时是不支持普通注册的。
由于我们可能需要支持多个三方登陆,所以url中添加了几个额外判断的参数。
下面两个是数据传输参数,一个是模拟curl POST,一个是allow_url_popen
未开启的情况下使用curl,加入到funtions.php
中即可
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 ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); $ret = curl_exec ( $ch ); curl_close ( $ch ); return $ret; } 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; }
下面的代码是登录核心代码,关键地方我都注释了,也是加入到funtions.php
中即可
add_action( 'init', 'signup_social' ); function signup_social(){ if($_SERVER['REQUEST_METHOD'] == 'GET') { if (isset($_GET['code']) && isset($_GET['type']) && $_GET['type'] == 'sina') { $code = $_GET['code']; $url = "https://api.weibo.com/oauth2/access_token"; $data = "client_id=your_sina_appkey&your_client_secret=sina_client_secret&grant_type=authorization_code&redirect_uri=".urlencode (home_url())."&code=".$code;//替换成你自己的appkey和appsecret $output = json_decode(do_post($url,$data)); $sina_access_token = $output->access_token; $sina_uid = $output->uid; if(empty($sina_uid)){ wp_redirect(home_url('/?3'));//获取失败的时候直接返回首页 exit; } if(is_user_logged_in()){ $this_user = wp_get_current_user(); update_user_meta($this_user->ID ,"sina_uid",$sina_uid); update_user_meta($this_user->ID ,"sina_access_token",$sina_access_token); wp_redirect(home_url('/me/setting?4'));//已登录用户授权 }else{ $user_fb = get_users(array("meta_key "=>"sina_uid","meta_value"=>$sina_uid)); if(is_wp_error($user_fb) || !count($user_fb)){ $get_user_info = "https://api.weibo.com/2/users/show.json?uid=".$sina_uid."&access_token=".$sina_access_token; $data = get_url_contents ( $get_user_info ); $str = json_decode($data , true); $username = $str['screen_name']; $login_name = wp_create_nonce($sina_uid); $random_password = wp_generate_password( $length=12, $include_standard_special_chars=false ); $userdata=array( 'user_login' => $login_name, 'display_name' => $username, 'user_pass' => $random_password, 'nick_name' => $username ); $user_id = wp_insert_user( $userdata ); wp_signon(array("user_login"=>$login_name,"user_password"=>$random_password),false); update_user_meta($user_id ,"sina_uid",$sina_uid); update_user_meta($user_id ,"sina_access_token",$sina_access_token); wp_redirect(home_url('/?1'));//创建帐号成功 }else{ update_user_meta($user_fb[0]->ID ,"sina_access_token",$sina_access_token); wp_set_auth_cookie($user_fb[0]->ID); wp_redirect(home_url('/?2'));//已绑定,直接登录。 } } } } } function sina_login(){ return "https://api.weibo.com/oauth2/authorize?client_id=your_sina_appkey&response_type=code&redirect_uri=" . urlencode (home_url('/?type=sina'));//替换成你的appkey }
说明
- 在你想使用的地方<?php echo sina_login();?>即可
- 登录状态不显示按钮可以用is_user_logged_in()作为条件判断
- wp+redirect是链接跳转函数,以上代码中的跳转地址均可修改成你自己的
- 由于各种原因,可能不能保证每次授权都能成功。
给自己帐号授权的方法
- 先登录网站
- 点授权链接
- 完成授权
原则上复制粘贴就能生效,像条件判断之类的东西就不要问我了。
以上。
原文 http://fatesinger.com/615