Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124

简单说下原理,第一步是请求授权,返回一个code,接着用code获取access token和uid,uid我们可以用来绑定用户信息,access token我们可以用来获取用户信息。
原理还是很简单,需要稍微懂一点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
}
原则上复制粘贴就能生效,像条件判断之类的东西就不要问我了。
以上。
原文 http://fatesinger.com/615