210 lines
7.0 KiB
PHP
210 lines
7.0 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace addons\third\controller;
|
||
|
|
||
|
use addons\third\library\Application;
|
||
|
use app\common\controller\Api as commonApi;
|
||
|
use addons\third\library\Service;
|
||
|
use addons\third\model\Third;
|
||
|
use app\common\library\Sms;
|
||
|
use fast\Random;
|
||
|
use think\Config;
|
||
|
use think\Session;
|
||
|
use think\Validate;
|
||
|
|
||
|
/**
|
||
|
* 第三方登录插件
|
||
|
*/
|
||
|
class Api extends commonApi
|
||
|
{
|
||
|
protected $noNeedLogin = ['getAuthUrl', 'callback', 'account', 'getOpenidCallback']; // 无需登录即可访问的方法,同时也无需鉴权了
|
||
|
protected $noNeedRight = ['*']; // 无需鉴权即可访问的方法
|
||
|
|
||
|
protected $app = null;
|
||
|
protected $options = [];
|
||
|
protected $config = null;
|
||
|
|
||
|
public function _initialize()
|
||
|
{
|
||
|
//跨域检测
|
||
|
check_cors_request();
|
||
|
//设置session_id
|
||
|
Config::set('session.id', $this->request->server("HTTP_SID"));
|
||
|
|
||
|
parent::_initialize();
|
||
|
$this->config = get_addon_config('third');
|
||
|
$name = $this->request->request('addon');
|
||
|
if (!$name && get_addon_info($name)) {
|
||
|
//判断是否有插件标识,如果有插件标识则取指定插件中的配置
|
||
|
$config = get_addon_config($name);
|
||
|
$this->config = array_merge($this->config, array_intersect_key($config, array_flip(['qq', 'wechat', 'wechatweb', 'weibo'])));
|
||
|
}
|
||
|
$this->app = new Application($this->config);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取授权链接
|
||
|
*/
|
||
|
public function getAuthUrl()
|
||
|
{
|
||
|
$url = $this->request->param('url', '', 'trim');
|
||
|
$scope = $this->request->param('scope', '', 'trim');
|
||
|
$platform = $this->request->param('platform');
|
||
|
if (!$url || !$platform || !isset($this->config[$platform])) {
|
||
|
$this->error('参数错误');
|
||
|
}
|
||
|
$this->config[$platform]['callback'] = $url;
|
||
|
|
||
|
//判断是否静默授权
|
||
|
if ($scope) {
|
||
|
$this->config[$platform]['scope'] = $scope;
|
||
|
}
|
||
|
$this->app = new Application($this->config);
|
||
|
if (!$this->app->{$platform}) {
|
||
|
$this->error(__('参数错误'));
|
||
|
}
|
||
|
$this->success('', $this->app->{$platform}->getAuthorizeUrl());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 授权回调的请求
|
||
|
*/
|
||
|
public function callback()
|
||
|
{
|
||
|
$platform = $this->request->param('platform');
|
||
|
$apptype = $this->request->param('apptype');
|
||
|
$base = $this->request->param('base', 0); //只返回基础信息
|
||
|
$bind = $this->request->param('bind', 1); //默认要求绑定账号
|
||
|
|
||
|
if (!$this->app->{$platform}) {
|
||
|
$this->error(__('参数错误'));
|
||
|
}
|
||
|
$userinfo = $this->app->{$platform}->getUserInfo($this->request->param('', null, null));
|
||
|
if (!$userinfo) {
|
||
|
$this->error(__('操作失败'));
|
||
|
}
|
||
|
if ($base) {
|
||
|
$this->success("授权成功!", $userinfo['userinfo']);
|
||
|
}
|
||
|
|
||
|
$userinfo['apptype'] = $apptype ?: Service::getApptype();
|
||
|
$userinfo['platform'] = $platform;
|
||
|
|
||
|
$third = [
|
||
|
'avatar' => $userinfo['userinfo']['avatar'],
|
||
|
'nickname' => $userinfo['userinfo']['nickname']
|
||
|
];
|
||
|
|
||
|
$user = null;
|
||
|
$config = get_addon_config('third');
|
||
|
if (!$bind || $this->auth->isLogin() || Service::isBindThird($userinfo['platform'], $userinfo['openid'], $userinfo['apptype'], $userinfo['unionid']) || !$config['bindaccount']) {
|
||
|
$result = Service::connect($userinfo['platform'], $userinfo);
|
||
|
if (!$result) {
|
||
|
$this->error('授权登录失败');
|
||
|
}
|
||
|
$user = $this->auth->getUserinfo();
|
||
|
} else {
|
||
|
$user = false;
|
||
|
Session::set('third-userinfo', $userinfo);
|
||
|
}
|
||
|
$this->success("授权成功!", ['user' => $user, 'third' => $third, 'openid' => $userinfo['openid']]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取Openid回调
|
||
|
*/
|
||
|
public function getOpenidCallback()
|
||
|
{
|
||
|
$platform = $this->request->param('platform');
|
||
|
if (!$this->app->{$platform}) {
|
||
|
$this->error(__('参数错误'));
|
||
|
}
|
||
|
$userinfo = $this->app->{$platform}->getUserInfo($this->request->param('', null, null));
|
||
|
if (!$userinfo) {
|
||
|
$this->error(__('操作失败'));
|
||
|
}
|
||
|
|
||
|
$this->success('', ['openid' => $userinfo['openid']]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 登录或创建账号
|
||
|
*/
|
||
|
public function account()
|
||
|
{
|
||
|
if ($this->request->isPost()) {
|
||
|
$params = Session::get('third-userinfo');
|
||
|
$mobile = $this->request->post('mobile', '');
|
||
|
$code = $this->request->post('code', $this->request->post('captcha'));
|
||
|
$token = $this->request->post('__token__');
|
||
|
$rule = [
|
||
|
'mobile' => 'require|regex:/^1\d{10}$/',
|
||
|
'__token__' => 'require|token',
|
||
|
];
|
||
|
$msg = [
|
||
|
'mobile' => 'Mobile is incorrect',
|
||
|
];
|
||
|
$data = [
|
||
|
'mobile' => $mobile,
|
||
|
'__token__' => $token,
|
||
|
];
|
||
|
$ret = Sms::check($mobile, $code, 'bind');
|
||
|
if (!$ret) {
|
||
|
$this->error(__('验证码错误'));
|
||
|
}
|
||
|
$validate = new Validate($rule, $msg);
|
||
|
$result = $validate->check($data);
|
||
|
if (!$result) {
|
||
|
$this->error(__($validate->getError()), ['__token__' => $this->request->token()]);
|
||
|
}
|
||
|
|
||
|
$userinfo = \app\common\model\User::where('mobile', $mobile)->find();
|
||
|
if ($userinfo) {
|
||
|
$isBind = Third::where('platform', $params['platform'])->where('user_id', $userinfo['id'])->find();
|
||
|
if ($isBind) {
|
||
|
$this->error('该手机号已经占用');
|
||
|
}
|
||
|
$result = $this->auth->direct($userinfo->id);
|
||
|
} else {
|
||
|
$result = $this->auth->register($mobile, Random::alnum(), '', $mobile, $params['userinfo'] ?? []);
|
||
|
}
|
||
|
|
||
|
if ($result) {
|
||
|
$result = Service::connect($params['platform'], $params);
|
||
|
if (!$result) {
|
||
|
$this->error('授权登录失败');
|
||
|
}
|
||
|
$this->success(__('绑定账号成功'), ['userinfo' => $this->auth->getUserinfo()]);
|
||
|
} else {
|
||
|
$this->error($this->auth->getError(), ['__token__' => $this->request->token()]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 获取第三方登录绑定列表
|
||
|
*/
|
||
|
public function getBindList()
|
||
|
{
|
||
|
$thirdList = Third::where('user_id', $this->auth->id)->field('user_id,platform,apptype')->select();
|
||
|
$this->success('', collection($thirdList)->toArray());
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 解绑
|
||
|
*/
|
||
|
public function unbind()
|
||
|
{
|
||
|
$platform = $this->request->post("platform");
|
||
|
$apptype = $this->request->post("apptype");
|
||
|
$exist = Third::where('user_id', $this->auth->id)->where('platform', $platform)->where('apptype', $apptype)->find();
|
||
|
if ($exist) {
|
||
|
$this->success("解绑成功");
|
||
|
} else {
|
||
|
$this->error("未找到相关数据");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|