初始化本地仓库
This commit is contained in:
@@ -0,0 +1,358 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\api\controller\auth;
|
||||
|
||||
use app\api\controller\Base;
|
||||
use app\api\validate\auth\LoginValidate;
|
||||
use app\api\validate\auth\RegisterValidate;
|
||||
use app\service\api\auth\AuthService;
|
||||
use core\captcha\Captcha;
|
||||
use core\tool\Json;
|
||||
use Exception;
|
||||
use madong\swagger\annotation\response\SimpleResponse;
|
||||
use madong\swagger\attribute\AllowAnonymous;
|
||||
use OpenApi\Attributes as OA;
|
||||
use support\Container;
|
||||
use Webman\Http\Request;
|
||||
use Webman\Http\Response;
|
||||
|
||||
/**
|
||||
* 认证控制器
|
||||
*/
|
||||
#[OA\Tag(name: '认证模块')]
|
||||
final class AuthController extends Base
|
||||
{
|
||||
public function __construct(AuthService $service)
|
||||
{
|
||||
$this->service = $service;
|
||||
}
|
||||
|
||||
#[OA\Post(
|
||||
path: '/auth/login',
|
||||
summary: '用户登录',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['username', 'password'],
|
||||
properties: [
|
||||
new OA\Property(property: 'username', description: '用户名/手机号/邮箱', type: 'string'),
|
||||
new OA\Property(property: 'password', description: '密码', type: 'string'),
|
||||
new OA\Property(property: 'captcha', description: '验证码', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '登录成功'),
|
||||
new OA\Response(response: 400, description: '参数错误'),
|
||||
new OA\Response(response: 401, description: '登录失败'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: ['token' => 'string'])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function login(Request $request): Response
|
||||
{
|
||||
try {
|
||||
/** @var LoginValidate $validate */
|
||||
$validate = Container::make(LoginValidate::class);
|
||||
if (!$validate->scene('login')->check($request->post())) {
|
||||
throw new Exception($validate->getError());
|
||||
}
|
||||
$data = $request->all();
|
||||
$result = $this->service->login($data);
|
||||
return Json::success($result);
|
||||
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机验证码登录
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/login/mobile',
|
||||
summary: '手机验证码登录',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['mobile', 'code'],
|
||||
properties: [
|
||||
new OA\Property(property: 'mobile', description: '手机号', type: 'string'),
|
||||
new OA\Property(property: 'code', description: '验证码', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证'],
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: ['token' => 'string'])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function loginWithMobile(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$result = $this->service->loginWithMobile($data);
|
||||
return Json::success($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户退出登录
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/logout',
|
||||
summary: '用户退出登录',
|
||||
tags: ['认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '退出成功'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
/** @Route(methods=["POST"], path="/auth/logout") */
|
||||
public function logout(): Response
|
||||
{
|
||||
$result = $this->service->logout();
|
||||
return Json::success($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户注册
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/register',
|
||||
summary: '用户注册',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['username', 'password'],
|
||||
properties: [
|
||||
new OA\Property(property: 'username', description: '用户名', type: 'string'),
|
||||
new OA\Property(property: 'password', description: '密码', type: 'string'),
|
||||
new OA\Property(property: 'email', description: '邮箱', type: 'string'),
|
||||
new OA\Property(property: 'mobile', description: '手机号', type: 'string'),
|
||||
new OA\Property(property: 'pid', description: '推荐人ID', type: 'integer'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证'],
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function register(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$validate = Container::make(RegisterValidate::class);
|
||||
if (!$validate->scene('register')->check($request->post())) {
|
||||
throw new Exception($validate->getError());
|
||||
}
|
||||
$captcha = Container::make(Captcha::class);
|
||||
if (!$captcha->check($request->input('captcha_key', ''), $request->input('captcha_code', ''))) {
|
||||
throw new Exception('验证码错误');
|
||||
}
|
||||
$data = $request->all();
|
||||
$result = $this->service->register($data);
|
||||
return Json::success($result);
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 手机号注册
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/register/mobile',
|
||||
summary: '手机号注册',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['mobile', 'code', 'password'],
|
||||
properties: [
|
||||
new OA\Property(property: 'mobile', description: '手机号', type: 'string'),
|
||||
new OA\Property(property: 'code', description: '验证码', type: 'string'),
|
||||
new OA\Property(property: 'password', description: '密码', type: 'string'),
|
||||
new OA\Property(property: 'pid', description: '推荐人ID', type: 'integer'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function registerWithMobile(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$data = $request->post();
|
||||
$result = $this->service->registerWithMobile($data);
|
||||
return Json::success($result);
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绑定手机号
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/bind',
|
||||
summary: '绑定手机号',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['mobile', 'code'],
|
||||
properties: [
|
||||
new OA\Property(property: 'mobile', description: '手机号', type: 'string'),
|
||||
new OA\Property(property: 'code', description: '验证码', type: 'string'),
|
||||
new OA\Property(property: 'pid', description: '推荐人ID', type: 'integer'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function bindMobile(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$result = $this->service->bindMobile($data);
|
||||
return Json::success($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 验证邮箱和验证码(忘记密码第一步)
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/verify-email',
|
||||
summary: '验证邮箱和验证码',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['email', 'code', 'captcha_key'],
|
||||
properties: [
|
||||
new OA\Property(property: 'email', description: '邮箱地址', type: 'string'),
|
||||
new OA\Property(property: 'code', description: '邮箱验证码', type: 'string'),
|
||||
new OA\Property(property: 'captcha_key', description: '验证码key', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function verifyEmail(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$data = $request->post();
|
||||
$result = $this->service->verifyEmail($data);
|
||||
return Json::success($result);
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送邮箱验证码
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/send-email-code',
|
||||
summary: '发送邮箱验证码',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['email', 'captcha_key', 'captcha_code'],
|
||||
properties: [
|
||||
new OA\Property(property: 'email', description: '邮箱地址', type: 'string'),
|
||||
new OA\Property(property: 'captcha_key', description: '图片验证码key', type: 'string'),
|
||||
new OA\Property(property: 'captcha_code', description: '图片验证码', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function sendEmailCode(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$email = $request->post('email');
|
||||
$captchaKey = $request->post('captcha_key');
|
||||
$captchaCode = $request->post('captcha_code');
|
||||
|
||||
// 验证图片验证码
|
||||
if (empty($captchaKey) || empty($captchaCode)) {
|
||||
throw new Exception('图片验证码不能为空', 400);
|
||||
}
|
||||
|
||||
$captcha = new Captcha();
|
||||
if (!$captcha->check($captchaKey, $captchaCode)) {
|
||||
throw new Exception('图片验证码错误', 400);
|
||||
}
|
||||
$this->service->sendEmailCode($email);
|
||||
return Json::success('success', []);
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置密码(忘记密码第二步)
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/forget-password',
|
||||
summary: '重置密码',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['email', 'code', 'new_password'],
|
||||
properties: [
|
||||
new OA\Property(property: 'email', description: '邮箱地址', type: 'string'),
|
||||
new OA\Property(property: 'code', description: '邮箱验证码', type: 'string'),
|
||||
new OA\Property(property: 'new_password', description: '新密码', type: 'string'),
|
||||
new OA\Property(property: 'confirm_password', description: '确认密码', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function forgetPassword(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$data = $request->post();
|
||||
$this->service->forgetPassword($data);
|
||||
return Json::success('操作成功', []);
|
||||
} catch (Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新 token
|
||||
*/
|
||||
#[OA\Post(
|
||||
path: '/auth/refresh',
|
||||
summary: '刷新 token',
|
||||
tags: ['认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '刷新成功'),
|
||||
new OA\Response(response: 401, description: '刷新失败'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: ['access_token' => 'string', 'refresh_token' => 'string'])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function refresh(): Response
|
||||
{
|
||||
try {
|
||||
$jwt = new \core\jwt\JwtToken();
|
||||
$token = $jwt->refresh();
|
||||
return Json::success('ok', [
|
||||
'access_token' => $token->accessToken,
|
||||
'refresh_token' => $token->refreshToken,
|
||||
]);
|
||||
} catch (\Throwable $e) {
|
||||
return Json::fail($e->getMessage(), [], 401);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,273 @@
|
||||
<?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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\api\controller\auth;
|
||||
|
||||
use app\api\controller\Base;
|
||||
use app\service\api\auth\WechatService;
|
||||
use core\tool\Json;
|
||||
use madong\swagger\annotation\response\SimpleResponse;
|
||||
use madong\swagger\attribute\AllowAnonymous;
|
||||
use OpenApi\Attributes as OA;
|
||||
use Webman\Http\Request;
|
||||
use Webman\Http\Response;
|
||||
|
||||
#[OA\Tag(name: '微信认证')]
|
||||
final class WechatController extends Base
|
||||
{
|
||||
public function __construct(WechatService $service)
|
||||
{
|
||||
$this->service = $service;
|
||||
}
|
||||
|
||||
#[OA\Post(
|
||||
path: '/auth/wechat',
|
||||
summary: '微信授权登录',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['code'],
|
||||
properties: [
|
||||
new OA\Property(property: 'code', description: '微信授权码', type: 'string'),
|
||||
new OA\Property(property: 'encrypted_data', description: '加密数据', type: 'string'),
|
||||
new OA\Property(property: 'iv', description: '加密向量', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['微信认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '登录成功'),
|
||||
new OA\Response(response: 400, description: '参数错误'),
|
||||
new OA\Response(response: 401, description: '登录失败'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function wechatLogin(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$result = $this->service->wechatLogin($data);
|
||||
return json($result);
|
||||
}
|
||||
|
||||
#[OA\Post(
|
||||
path: '/auth/weapp',
|
||||
summary: '微信小程序登录',
|
||||
requestBody: new OA\RequestBody(
|
||||
required: true,
|
||||
content: new OA\JsonContent(
|
||||
required: ['code'],
|
||||
properties: [
|
||||
new OA\Property(property: 'code', description: '小程序登录code', type: 'string'),
|
||||
new OA\Property(property: 'encrypted_data', description: '加密数据', type: 'string'),
|
||||
new OA\Property(property: 'iv', description: '加密向量', type: 'string'),
|
||||
]
|
||||
)
|
||||
),
|
||||
tags: ['微信认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '登录成功'),
|
||||
new OA\Response(response: 400, description: '参数错误'),
|
||||
new OA\Response(response: 401, description: '登录失败'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function weappLogin(Request $request): Response
|
||||
{
|
||||
$data = $request->post();
|
||||
$result = $this->service->weappLogin($data);
|
||||
return json($result);
|
||||
}
|
||||
|
||||
#[OA\Post(
|
||||
path: '/auth/wechat/scan',
|
||||
summary: '生成微信扫码登录二维码',
|
||||
tags: ['微信认证']
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
public function generateWechatQrCode(): Response
|
||||
{
|
||||
$result = $this->service->generateWechatQrCode();
|
||||
return Json::success($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查微信扫码状态
|
||||
*/
|
||||
#[OA\Get(
|
||||
path: '/auth/wechat/scan/status',
|
||||
summary: '检查微信扫码状态',
|
||||
tags: ['微信认证'],
|
||||
parameters: [
|
||||
new OA\Parameter(name: 'scene_id', description: '场景ID', in: 'query', required: true, schema: new OA\Schema(type: 'string')),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function checkWechatScanStatus(Request $request): Response
|
||||
{
|
||||
try {
|
||||
$sceneId = $request->input('scene_id');
|
||||
if (empty($sceneId)) {
|
||||
return Json::fail('scene_id 不能为空');
|
||||
}
|
||||
$result = $this->service->checkWechatScanStatus($sceneId);
|
||||
return Json::success($result['msg'], $result['data']);
|
||||
} catch (\Exception $e) {
|
||||
return Json::fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
#[OA\Get(
|
||||
path: '/auth/wechat/availability',
|
||||
summary: '检查微信登录可用性',
|
||||
tags: ['微信认证'],
|
||||
responses: [
|
||||
new OA\Response(response: 200, description: '查询成功'),
|
||||
]
|
||||
)]
|
||||
#[SimpleResponse(schema: [], example: [])]
|
||||
#[AllowAnonymous(requireToken: false, requirePermission: false, description: '公共接口')]
|
||||
public function checkWechatAvailability(): Response
|
||||
{
|
||||
$result = $this->service->checkWechatAvailability();
|
||||
return Json::success('ok', $result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user