wordpress ·

WordPress 新浪微博登录集成攻略

原理还是很简单,需要稍微懂一点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

}

说明

  1. 在你想使用的地方<?php echo sina_login();?>即可
  2. 登录状态不显示按钮可以用is_user_logged_in()作为条件判断
  3. wp+redirect是链接跳转函数,以上代码中的跳转地址均可修改成你自己的
  4. 由于各种原因,可能不能保证每次授权都能成功。

给自己帐号授权的方法

  1. 先登录网站
  2. 点授权链接
  3. 完成授权

原则上复制粘贴就能生效,像条件判断之类的东西就不要问我了。

以上。

原文 http://fatesinger.com/615

参与评论