274 lines
11 KiB
PHP
274 lines
11 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace app\api\controller\auth;
|
|
|
|
use app\api\controller\Base;
|
|
use app\api\validate\auth\ThirdPartyAuthValidate;
|
|
use app\service\api\auth\ThirdPartyAuthService;
|
|
use core\tool\Json;
|
|
use madong\swagger\annotation\response\SimpleResponse;
|
|
use madong\swagger\attribute\AllowAnonymous;
|
|
use support\Request;
|
|
use support\Response;
|
|
|
|
/**
|
|
* 第三方认证控制器
|
|
*/
|
|
class ThirdPartyAuthController extends Base
|
|
{
|
|
public function __construct(ThirdPartyAuthService $service, ThirdPartyAuthValidate $validate)
|
|
{
|
|
$this->service = $service;
|
|
$this->validate = $validate;
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/qq/callback',
|
|
summary: 'QQ回调',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'scene', description: '场景ID', in: 'query', required: true),
|
|
new \OpenApi\Attributes\Parameter(name: 'code', description: '授权码', in: 'query', required: true),
|
|
]
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function qqCallback(Request $request): Response
|
|
{
|
|
try {
|
|
$scene = $request->input('scene');
|
|
$code = $request->input('code');
|
|
|
|
if (empty($scene) || empty($code)) {
|
|
throw new \Exception('参数错误', 400);
|
|
}
|
|
|
|
$this->service->handleQqCallback($scene, $code);
|
|
return Json::success('绑定成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/wechat/callback',
|
|
summary: '微信回调',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'scene', description: '场景ID', in: 'query', required: true),
|
|
new \OpenApi\Attributes\Parameter(name: 'code', description: '授权码', in: 'query', required: true),
|
|
]
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function wechatCallback(Request $request): Response
|
|
{
|
|
try {
|
|
$scene = $request->input('scene');
|
|
$code = $request->input('code');
|
|
|
|
if (empty($scene) || empty($code)) {
|
|
throw new \Exception('参数错误', 400);
|
|
}
|
|
|
|
$this->service->handleWechatCallback($scene, $code);
|
|
return Json::success('绑定成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/weibo/callback',
|
|
summary: '微博回调',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'scene', description: '场景ID', in: 'query', required: true),
|
|
new \OpenApi\Attributes\Parameter(name: 'code', description: '授权码', in: 'query', required: true),
|
|
]
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function weiboCallback(Request $request): Response
|
|
{
|
|
try {
|
|
$scene = $request->input('scene');
|
|
$code = $request->input('code');
|
|
|
|
if (empty($scene) || empty($code)) {
|
|
throw new \Exception('参数错误', 400);
|
|
}
|
|
|
|
$this->service->handleWeiboCallback($scene, $code);
|
|
return Json::success('绑定成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/douyin/callback',
|
|
summary: '抖音回调',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'scene', description: '场景ID', in: 'query', required: true),
|
|
new \OpenApi\Attributes\Parameter(name: 'code', description: '授权码', in: 'query', required: true),
|
|
]
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function douyinCallback(Request $request): Response
|
|
{
|
|
try {
|
|
$scene = $request->input('scene');
|
|
$code = $request->input('code');
|
|
if (empty($scene) || empty($code)) {
|
|
throw new \Exception('参数错误', 400);
|
|
}
|
|
$this->service->handleDouyinCallback($scene, $code);
|
|
return Json::success('绑定成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/third-party/list',
|
|
summary: '获取第三方绑定列表',
|
|
tags: ['第三方认证'],
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function getThirdPartyList(): Response
|
|
{
|
|
try {
|
|
$result = $this->service->getThirdPartyList();
|
|
return Json::success('获取成功', $result);
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Post(
|
|
path: '/auth/third-party/bind',
|
|
summary: '绑定第三方账号',
|
|
requestBody: new \OpenApi\Attributes\RequestBody(
|
|
required: true,
|
|
content: new \OpenApi\Attributes\MediaType(
|
|
mediaType: 'application/json',
|
|
schema: new \OpenApi\Attributes\Schema(
|
|
properties: [
|
|
new \OpenApi\Attributes\Property(property: 'platform', description: '平台类型', type: 'integer'),
|
|
new \OpenApi\Attributes\Property(property: 'openid', description: 'OpenID', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'unionid', description: 'UnionID', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'nickname', description: '昵称', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'avatar', description: '头像', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'gender', description: '性别', type: 'integer'),
|
|
new \OpenApi\Attributes\Property(property: 'country', description: '国家', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'province', description: '省份', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'city', description: '城市', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'access_token', description: '访问令牌', type: 'string'),
|
|
new \OpenApi\Attributes\Property(property: 'refresh_token', description: '刷新令牌', type: 'string'),
|
|
]
|
|
)
|
|
)
|
|
),
|
|
tags: ['第三方认证']
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function bindThirdParty(Request $request): Response
|
|
{
|
|
try {
|
|
$validate = new ThirdPartyAuthValidate();
|
|
$data = $request->all();
|
|
if (!$validate->scene('bind')->check($data)) {
|
|
throw new \Exception($validate->getError());
|
|
};
|
|
$this->service->bindThirdParty($data);
|
|
return Json::success('绑定成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Delete(
|
|
path: '/auth/third-party/unbind/{platform}',
|
|
summary: '解绑第三方账号',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'platform', description: '平台类型', in: 'path', required: true),
|
|
]
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function unbindThirdParty(Request $request, int $platform): Response
|
|
{
|
|
try {
|
|
$this->service->unbindThirdParty($platform);
|
|
return Json::success('解绑成功');
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Post(
|
|
path: '/auth/third-party/qr-code',
|
|
summary: '生成第三方绑定二维码',
|
|
requestBody: new \OpenApi\Attributes\RequestBody(
|
|
required: true,
|
|
content: new \OpenApi\Attributes\MediaType(
|
|
mediaType: 'application/json',
|
|
schema: new \OpenApi\Attributes\Schema(
|
|
properties: [
|
|
new \OpenApi\Attributes\Property(property: 'platform', description: '平台类型', type: 'integer'),
|
|
]
|
|
)
|
|
)
|
|
),
|
|
tags: ['第三方认证'],
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function generateBindQrCode(Request $request): Response
|
|
{
|
|
try {
|
|
$platform = $request->post('platform');
|
|
if (empty($platform)) {
|
|
throw new \Exception('平台类型不能为空', 400);
|
|
}
|
|
|
|
$result = $this->service->generateBindQrCode(['platform' => $platform]);
|
|
return Json::success('生成成功', $result);
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
|
|
#[\OpenApi\Attributes\Get(
|
|
path: '/auth/third-party/qr-status',
|
|
summary: '检查绑定二维码状态',
|
|
tags: ['第三方认证'],
|
|
parameters: [
|
|
new \OpenApi\Attributes\Parameter(name: 'scene_id', description: '场景ID', in: 'query', required: true),
|
|
],
|
|
)]
|
|
#[SimpleResponse(schema: [], example: [])]
|
|
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
|
public function checkBindQrStatus(Request $request): Response
|
|
{
|
|
try {
|
|
$sceneId = $request->input('scene_id');
|
|
if (empty($sceneId)) {
|
|
throw new \Exception('场景ID不能为空', 400);
|
|
}
|
|
|
|
$result = $this->service->checkBindQrStatus($sceneId);
|
|
return Json::success('检查成功', $result);
|
|
} catch (\Exception $e) {
|
|
return Json::fail($e->getMessage(), [], $e->getCode() ?: -1);
|
|
}
|
|
}
|
|
}
|