357 lines
14 KiB
PHP
357 lines
14 KiB
PHP
|
<?php
|
|||
|
/*
|
|||
|
Plugin Name: QuickAuthLogin
|
|||
|
Plugin URI: https://github.com/mr-wixy/QuickAuthLogin-WP
|
|||
|
Description: QuickAuth微信扫码登陆插件
|
|||
|
Version: 0.9.0
|
|||
|
Author: wixy
|
|||
|
Author URI: https://blog.wixy.cn/
|
|||
|
*/
|
|||
|
|
|||
|
//自定义登录按钮
|
|||
|
function custom_login_button() {
|
|||
|
echo '<button class="button button-primary button-large" style="color:#fff;background: #2a0; float: right; margin: 18px 0 5px 10px; min-height: 32px;" href="" type="button" onClick="openLogin()">微信登陆</button><br />';
|
|||
|
}
|
|||
|
add_action('login_form', 'custom_login_button');
|
|||
|
|
|||
|
//自定义显示错误消息
|
|||
|
function custom_login_message(){
|
|||
|
$msg = $_GET['err_msg'];
|
|||
|
if($msg){
|
|||
|
echo '<div id="login_error">'.$msg.'<br></div>';
|
|||
|
}
|
|||
|
}
|
|||
|
add_action( 'login_message', 'custom_login_message');
|
|||
|
|
|||
|
//登录按钮调用函数
|
|||
|
function custom_html() {
|
|||
|
if(get_option("qauth_options")["qauth_appkey"]){
|
|||
|
$url = get_option("qauth_options")["qauth_api"].'/qrconnect?appkey='.get_option("qauth_options")["qauth_appkey"].'&state=login&popup=true';
|
|||
|
echo '<script>
|
|||
|
function openLogin(){
|
|||
|
var iTop = (window.screen.availHeight - 30 - 600) / 2;
|
|||
|
var iLeft = (window.screen.availWidth - 10 - 500) / 2;
|
|||
|
window.open ("'.$url.'","QuickAuth登录","width=500,height=600,top="+iTop+",left="+iLeft);
|
|||
|
}
|
|||
|
</script>
|
|||
|
';
|
|||
|
}
|
|||
|
else{
|
|||
|
echo '<script>function openLogin(){alert("请先完成QuickAuth的相关配置!");}</script>';
|
|||
|
}
|
|||
|
}
|
|||
|
add_action('login_footer', 'custom_html');
|
|||
|
|
|||
|
//回调接口定义
|
|||
|
add_action( 'rest_api_init', function () {
|
|||
|
register_rest_route( 'wp/v2', '/qauth_login', array(
|
|||
|
'methods' => 'GET',
|
|||
|
'callback' => 'qauth_login',
|
|||
|
) );
|
|||
|
} );
|
|||
|
|
|||
|
function qauth_login() {
|
|||
|
$code = $_GET['code'];
|
|||
|
$state = $_GET['state'];
|
|||
|
if(!$code || !$state){
|
|||
|
wp_redirect(wp_login_url(get_permalink()));
|
|||
|
exit;
|
|||
|
}
|
|||
|
|
|||
|
$response = wp_remote_get( get_option("qauth_options")["qauth_api"].'/user?code='.$code.'&appkey='.get_option("qauth_options")["qauth_appkey"].'&secret='.get_option("qauth_options")["qauth_usersecret"] );
|
|||
|
$body = wp_remote_retrieve_body( $response );
|
|||
|
$content_obj = json_decode($body);
|
|||
|
if($content_obj->code === 0){
|
|||
|
if($state == "binding"){
|
|||
|
wp_redirect( home_url().'/wp-admin/admin.php?page=qauth_binding&openId='.$content_obj->res->openId.'&nickName='.$content_obj->res->nickName.'&avatarUrl='.urlencode($content_obj->res->avatarUrl) );
|
|||
|
}
|
|||
|
else{
|
|||
|
$user_query = new WP_User_Query( array( 'meta_key' => 'qa_openid', 'meta_value' => $content_obj->res->openId) );
|
|||
|
|
|||
|
if($user_query->get_results()){
|
|||
|
$login_user=$user_query->get_results()[0]->data;
|
|||
|
wp_set_current_user( $login_user->ID);
|
|||
|
wp_set_auth_cookie( $login_user->ID);
|
|||
|
wp_redirect( home_url().'/wp-admin' );
|
|||
|
exit;
|
|||
|
}
|
|||
|
else{
|
|||
|
if(get_option('qauth_options')['qauth_auto_register']){
|
|||
|
$newUserName = 'wx_'.$content_obj->res->nickName;
|
|||
|
$user_id = username_exists($newUserName);
|
|||
|
if($user_id){
|
|||
|
$newUserName = $newUserName.'_'.substr(md5(uniqid(microtime())), 0, 4);
|
|||
|
}
|
|||
|
$random_password = substr(md5(uniqid(microtime())), 0, 6);
|
|||
|
$user_id = wp_create_user($newUserName, $random_password, $newUserName.'@qauth.cn');
|
|||
|
add_user_meta($user_id, 'qa_openid', $content_obj->res->openId);
|
|||
|
add_user_meta($user_id, 'qa_nickname', $content_obj->res->nickName);
|
|||
|
add_user_meta($user_id, 'qa_avatarurl', $content_obj->res->avatarUrl);
|
|||
|
wp_set_current_user( $user_id);
|
|||
|
wp_set_auth_cookie( $user_id);
|
|||
|
wp_redirect( home_url().'/wp-admin' );
|
|||
|
exit;
|
|||
|
}else{
|
|||
|
wp_redirect( home_url().'/wp-login.php?err_msg='.urlencode('未绑定微信用户禁止登陆'));
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
wp_redirect( home_url().'/wp-login.php?err_msg='.urlencode('QuickAuth接口调用出错【'.$content_obj->msg.'】'));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function qauth_preprocess_pages($value){
|
|||
|
global $pagenow;
|
|||
|
$page = (isset($_REQUEST['page']) ? $_REQUEST['page'] : false);
|
|||
|
if($pagenow=='admin.php' && $page=='qauth_binding'){
|
|||
|
$user_query = new WP_User_Query( array( 'meta_key' => 'qa_openid', 'meta_value' => $content_obj->res->openId) );
|
|||
|
if($user_query->get_results()){
|
|||
|
if($_GET['openId']){
|
|||
|
wp_redirect( home_url().'/wp-admin/admin.php?page=qauth_binding&err_msg=alreadyuse');
|
|||
|
exit;
|
|||
|
}
|
|||
|
}
|
|||
|
else{
|
|||
|
$current_user = wp_get_current_user();
|
|||
|
$openid = get_user_meta($current_user->data->ID, 'qa_openid', true);
|
|||
|
$nickName = get_user_meta($current_user->data->ID, 'qa_nickname', true);
|
|||
|
$avatarUrl = get_user_meta($current_user->data->ID, 'qa_avatarurl', true);
|
|||
|
|
|||
|
if($_GET['openId']){
|
|||
|
$uId = $_GET['openId'];
|
|||
|
$uName = $_GET['nickName'];
|
|||
|
$uAvatar = $_GET['avatarUrl'];
|
|||
|
|
|||
|
$current_user = wp_get_current_user();
|
|||
|
|
|||
|
if($openid){
|
|||
|
update_user_meta($current_user->data->ID, 'qa_openid', $uId);
|
|||
|
}
|
|||
|
else{
|
|||
|
add_user_meta($current_user->data->ID, 'qa_openid', $uId);
|
|||
|
}
|
|||
|
|
|||
|
if($nickName){
|
|||
|
update_user_meta($current_user->data->ID, 'qa_nickname', $uName);
|
|||
|
}
|
|||
|
else{
|
|||
|
add_user_meta($current_user->data->ID, 'qa_nickname', $uName);
|
|||
|
}
|
|||
|
|
|||
|
if($avatarUrl){
|
|||
|
update_user_meta($current_user->data->ID, 'qa_avatarurl', urldecode($uAvatar));
|
|||
|
}
|
|||
|
else{
|
|||
|
add_user_meta($current_user->data->ID, 'qa_avatarurl', urldecode($uAvatar));
|
|||
|
}
|
|||
|
|
|||
|
wp_redirect( home_url().'/wp-admin/admin.php?page=qauth_binding');
|
|||
|
exit;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
add_action('admin_init', 'qauth_preprocess_pages');
|
|||
|
|
|||
|
//新增菜单
|
|||
|
function qauth_options_page() {
|
|||
|
add_menu_page(
|
|||
|
'QuickAuth',
|
|||
|
'微信绑定',
|
|||
|
'read',
|
|||
|
'qauth_binding',
|
|||
|
'qauth_user_binding_html',
|
|||
|
plugins_url('QuickAuthLogin/wechat.png')
|
|||
|
);
|
|||
|
add_submenu_page(
|
|||
|
'plugins.php',
|
|||
|
'QuickAuth设置',
|
|||
|
'QuickAuth设置',
|
|||
|
'manage_options',
|
|||
|
'qauth',
|
|||
|
'qauth_options_page_html'
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
function qauth_user_binding_html(){
|
|||
|
?>
|
|||
|
<div class=wrap>
|
|||
|
<div class="wrap">
|
|||
|
<h2>微信账户绑定</h2>
|
|||
|
|
|||
|
<?php update_qauth_binding();
|
|||
|
$current_user = wp_get_current_user();
|
|||
|
$openid = get_user_meta($current_user->data->ID, 'qa_openid', true);
|
|||
|
$nickName = get_user_meta($current_user->data->ID, 'qa_nickname', true);
|
|||
|
$avatarUrl = get_user_meta($current_user->data->ID, 'qa_avatarurl', true);
|
|||
|
?>
|
|||
|
|
|||
|
|
|||
|
<div class="qrlogin">
|
|||
|
<form method="post">
|
|||
|
<h3>当前账号:<?=$current_user->data->user_login?></h3>
|
|||
|
<?php if($openid):?>
|
|||
|
<p>已绑微信:<? echo $nickName;?> </p>
|
|||
|
<div id="qrimg" style="margin-bottom:30px"> <img src="<? echo $avatarUrl;?>"></div>
|
|||
|
<input type="submit" class="button button-primary" name="submit" value="重置绑定数据">
|
|||
|
<?php else : ?>
|
|||
|
<p id='msg'>尚未绑定微信账号</p><hr/>
|
|||
|
<button class="button button-primary" type="button" onclick="openLogin()">绑定微信</button>
|
|||
|
<?php endif; ?>
|
|||
|
</form>
|
|||
|
</div>
|
|||
|
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<?php
|
|||
|
|
|||
|
if(get_option("qauth_options")["qauth_appkey"]){
|
|||
|
$url = get_option("qauth_options")["qauth_api"].'/qrconnect?appkey='.get_option("qauth_options")["qauth_appkey"].'&state=binding&popup=true';
|
|||
|
echo '<script>
|
|||
|
function openLogin(){
|
|||
|
var iTop = (window.screen.availHeight - 30 - 600) / 2;
|
|||
|
var iLeft = (window.screen.availWidth - 10 - 500) / 2;
|
|||
|
window.open ("'.$url.'","QuickAuth登录","width=500,height=600,top="+iTop+",left="+iLeft);
|
|||
|
}
|
|||
|
</script>';
|
|||
|
}
|
|||
|
else{
|
|||
|
if(current_user_can('manage_options')){
|
|||
|
echo '<script>function openLogin(){
|
|||
|
alert("请先完成QuickAuth的相关配置!");
|
|||
|
location.href="'.home_url().'/wp-admin/plugins.php?page=qauth";
|
|||
|
}</script>';
|
|||
|
}else{
|
|||
|
echo '<script>function openLogin(){
|
|||
|
alert("请联系管理员完成QuickAuth的相关配置!");}</script>';
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function update_qauth_binding(){
|
|||
|
if($_GET['err_msg']){
|
|||
|
if($_GET['err_msg'] == 'alreadyuse'){
|
|||
|
echo '<p style="color:red;">该微信账号已经被其他用户绑定</p>';
|
|||
|
}
|
|||
|
}
|
|||
|
$current_user = wp_get_current_user();
|
|||
|
$openid = get_user_meta($current_user->data->ID, 'qa_openid', true);
|
|||
|
$nickName = get_user_meta($current_user->data->ID, 'qa_nickname', true);
|
|||
|
$avatarUrl = get_user_meta($current_user->data->ID, 'qa_avatarurl', true);
|
|||
|
|
|||
|
if($_POST['submit']){
|
|||
|
delete_user_meta($current_user->data->ID, 'qa_openid', $openid);
|
|||
|
delete_user_meta($current_user->data->ID, 'qa_nickname', $nickName);
|
|||
|
delete_user_meta($current_user->data->ID, 'qa_avatarurl', $avatarUrl);
|
|||
|
echo '<p style="color:green;">重置成功</p>';
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function qauth_options_page_html() {
|
|||
|
if (!current_user_can('manage_options')){
|
|||
|
return;
|
|||
|
}
|
|||
|
?>
|
|||
|
|
|||
|
<div class=wrap>
|
|||
|
<div class="wrap">
|
|||
|
<h2>QuickAuth设置</h2>
|
|||
|
<?php update_qauth_options(); ?>
|
|||
|
<ul class="typecho-option">
|
|||
|
<li><label class="typecho-label">使用说明:</label>
|
|||
|
<ol>
|
|||
|
<li><p class="description">登陆 <a target="_blank" href="https://qauth.cn">QuickAuth</a>网站</p></li>
|
|||
|
<li><p class="description"><a target="_blank" href="https://qauth.cn/app">创建应用</a> 并填写相关信息(回调地址请填写https://博客域名/index.php/wp-json/wp/v2/qauth_login)</p></li>
|
|||
|
<li><p class="description"><a target="_blank" href="https://qauth.cn/app">发布</a> 应用</p></li>
|
|||
|
<li><p class="description">在此页面中配置 AppKey和UserSecret</p></li>
|
|||
|
</ol>
|
|||
|
</li>
|
|||
|
</ul>
|
|||
|
<form method="post">
|
|||
|
<div style="margin:10px;">
|
|||
|
<label style="display:block;margin:10px 0;">QuickAuthApi<small>(默认配置,正常情况无需修改)</small></label>
|
|||
|
<input class="regular-text code" type="text" name="QauthApi" value="<?php echo get_option('qauth_options')['qauth_api'];?>"/>
|
|||
|
</div>
|
|||
|
<div style="margin:10px;">
|
|||
|
<label style="display:block;margin:10px 0;">AppKey <a href="https://qauth.cn/app" target="_blank">获取</a></label>
|
|||
|
<input class="regular-text code" type="text" name="QauthAppKey" value="<?php echo get_option('qauth_options')['qauth_appkey'];?>"/>
|
|||
|
</div>
|
|||
|
<div style="margin:10px;"><label style="display:block;margin:10px 0;">UserSecret <a href="https://qauth.cn/config/secret" target="_blank">获取</a></label><input class="regular-text code" type="text" name="QauthUserSecret" value="<?php echo get_option('qauth_options')['qauth_usersecret'];?>"/></div>
|
|||
|
<div style="margin:10px;">
|
|||
|
<label style="display:block;margin:10px 0;">未绑定用户自动注册</label>
|
|||
|
|
|||
|
<?php if(get_option('qauth_options')['qauth_auto_register']):?>
|
|||
|
<input class="regular-text code" type="checkbox" name="QauthAutoRegister" value="<?php echo get_option('qauth_options')['qauth_auto_register'];?>" checked="checked"/>
|
|||
|
<?php else : ?>
|
|||
|
<input class="regular-text code" type="checkbox" name="QauthAutoRegister" value="<?php echo get_option('qauth_options')['qauth_auto_register'];?>"/>
|
|||
|
<?php endif; ?>
|
|||
|
</div>
|
|||
|
<div style="margin:10px;"><input class="button button-primary" type="submit" name="submit" value="保存"/></div>
|
|||
|
</form>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<?php
|
|||
|
}
|
|||
|
|
|||
|
function update_qauth_options(){
|
|||
|
if($_POST['submit']){
|
|||
|
if($_POST['QauthAutoRegister'] === null){
|
|||
|
$auto_register = false;
|
|||
|
}
|
|||
|
else{
|
|||
|
$auto_register = true;
|
|||
|
}
|
|||
|
$flag = false;
|
|||
|
$data_r = [
|
|||
|
'qauth_api' => $_POST['QauthApi'],
|
|||
|
'qauth_appkey' => $_POST['QauthAppKey'],
|
|||
|
'qauth_usersecret' => $_POST['QauthUserSecret'],
|
|||
|
'qauth_auto_register' => $auto_register,
|
|||
|
];
|
|||
|
if($_POST['QauthApi'] && $_POST['QauthAppKey'] && $_POST['QauthUserSecret']){
|
|||
|
update_option('qauth_options',$data_r);
|
|||
|
$flag = true;
|
|||
|
}
|
|||
|
if($flag){
|
|||
|
echo '<p style="color:green;">保存成功</p>';
|
|||
|
}else{
|
|||
|
echo '<p style="color:red;">保存失败</p>';
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
add_action( 'admin_menu', 'qauth_options_page' );
|
|||
|
|
|||
|
function qauth_login_rewrites_init(){
|
|||
|
add_rewrite_rule(
|
|||
|
'qauthlogin/(.+)\$',
|
|||
|
'index.php?&code=$matches[1]',
|
|||
|
'top'
|
|||
|
);
|
|||
|
flush_rewrite_rules();
|
|||
|
}
|
|||
|
add_action( 'init', 'qauth_login_rewrites_init' );
|
|||
|
|
|||
|
function qauth_setup() {
|
|||
|
$data_r = [
|
|||
|
'qauth_api' => 'https://api.qauth.cn' ,
|
|||
|
'qauth_appkey' => '',
|
|||
|
'qauth_usersecret' => '',
|
|||
|
'qauth_auto_register' => false
|
|||
|
];
|
|||
|
add_option('qauth_options', $data_r);
|
|||
|
}
|
|||
|
|
|||
|
function qauth_install() {
|
|||
|
qauth_setup();
|
|||
|
flush_rewrite_rules();
|
|||
|
}
|
|||
|
register_activation_hook( __FILE__, 'qauth_install' );
|
|||
|
|
|||
|
function qauth_deactivation() {
|
|||
|
flush_rewrite_rules();
|
|||
|
}
|
|||
|
register_deactivation_hook( __FILE__, 'qauth_deactivation' );
|