From 0914cd9e4162165fa0e7aa4b43f24325dc1c80f5 Mon Sep 17 00:00:00 2001 From: "zhangf@suq.cn" Date: Thu, 11 Dec 2025 10:05:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(piadmin):=20=E6=B7=BB=E5=8A=A0=E7=9F=AD?= =?UTF-8?q?=E4=BF=A1=E9=AA=8C=E8=AF=81=E7=A0=81=E5=8F=91=E9=80=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Captcha 类中新增 sendMess 方法用于发送短信验证码 - 新增 curlPost 函数用于发送 POST 请求 - 添加 OpenApiSuq 类处理短信发送逻辑 - 更新路由配置,增加用户端发送短信验证码接口 - 新增短信配置文件 sms.php - 在 UserLoginController 中添加 sendMsg 方法处理短信发送请求 - 修复路由配置中的语法错误 - 添加 ext-curl 扩展依赖 --- composer.json | 3 +- composer.lock | 5 +-- .../app/controller/v1/UserLoginController.php | 22 +++++++++++-- plugin/piadmin/app/functions.php | 32 +++++++++++++++++++ plugin/piadmin/app/route/v1/route.php | 16 +++++++--- plugin/piadmin/app/utils/Captcha.php | 36 +++++++++++++++++++++- plugin/piadmin/app/utils/sms/OpenApiSuq.php | 30 ++++++++++++++++++ plugin/piadmin/config/sms.php | 14 +++++++++ 8 files changed, 147 insertions(+), 11 deletions(-) create mode 100644 plugin/piadmin/app/utils/sms/OpenApiSuq.php create mode 100644 plugin/piadmin/config/sms.php diff --git a/composer.json b/composer.json index 0b186b8..5804562 100644 --- a/composer.json +++ b/composer.json @@ -38,7 +38,8 @@ "openai-php/client": "^0.9.2", "ext-simplexml": "*", "ext-dom": "*", - "webman/redis-queue": "^2.1" + "webman/redis-queue": "^2.1", + "ext-curl": "*" }, "suggest": { "ext-event": "For better performance. " diff --git a/composer.lock b/composer.lock index c7ab373..0ebe724 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a68fff4e55ddc90db5da6949580f644b", + "content-hash": "d2977073765d5166d7ae2431f3b3afa2", "packages": [ { "name": "aliyuncs/oss-sdk-php", @@ -7905,7 +7905,8 @@ "platform": { "php": ">=8.1", "ext-simplexml": "*", - "ext-dom": "*" + "ext-dom": "*", + "ext-curl": "*" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/plugin/piadmin/app/controller/v1/UserLoginController.php b/plugin/piadmin/app/controller/v1/UserLoginController.php index 8a50f72..e584a05 100644 --- a/plugin/piadmin/app/controller/v1/UserLoginController.php +++ b/plugin/piadmin/app/controller/v1/UserLoginController.php @@ -3,6 +3,7 @@ namespace plugin\piadmin\app\controller\v1; use plugin\piadmin\app\base\BaseController; +use plugin\piadmin\app\exception\ApiException; use plugin\piadmin\app\service\UserService; use plugin\piadmin\app\utils\Captcha; use plugin\piadmin\app\validate\LoginValidate; @@ -31,12 +32,27 @@ class UserLoginController extends BaseController return success($res); } + /** + * 手机号登录 + * @param Request $request + * @return void + */ + public function mobileLogin(Request $request) + { - public function captcha(){ + } - $captcha = Captcha::imageCaptcha(); - return success($captcha); + public function sendMsg(Request $request) + { + $params = $request->only([ + 'phone', + 'type' + ]); + if (empty($params['phone']) || empty($params['type'])) { + throw new ApiException('参数错误'); + } + return success((new Captcha())->sendMess($params)); } diff --git a/plugin/piadmin/app/functions.php b/plugin/piadmin/app/functions.php index 4ef58c7..46fd7ed 100644 --- a/plugin/piadmin/app/functions.php +++ b/plugin/piadmin/app/functions.php @@ -160,3 +160,35 @@ if (!function_exists('requestOnly')) { } } +if (!function_exists('curlPost')) { + /** + * curl post数据 + * @param $url + * @param $postData + */ + function curlPost($url, $postData,$header = [], $timeout = 10) { + // 初始化 + $curl = curl_init(); + // 设置抓取的url + curl_setopt($curl, CURLOPT_URL, $url); + // 设置头文件的信息作为数据流输出 + curl_setopt($curl, CURLOPT_HEADER, 0); + // 设置获取的信息以文件流的形式返回,而不是直接输出。 + curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); + // 超时设置 + curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); + // 超时设置,以毫秒为单位 + // curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); + curl_setopt($curl, CURLOPT_HTTPHEADER, $header); + // 设置post方式提交 + curl_setopt($curl, CURLOPT_POST, 1); + curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); + // 执行命令 + $data = curl_exec($curl); + curl_close($curl); + return $data; + } +} + diff --git a/plugin/piadmin/app/route/v1/route.php b/plugin/piadmin/app/route/v1/route.php index aa95c7f..bbd2742 100644 --- a/plugin/piadmin/app/route/v1/route.php +++ b/plugin/piadmin/app/route/v1/route.php @@ -15,11 +15,19 @@ use Webman\Route; // 不需要登录的接口 Route::group('/piadmin/v1', function () { - Route::any('/test', [IndexController::class, 'test']); - Route::any('/testlogin', [IndexController::class, 'index']); +// Route::any('/test', [IndexController::class, 'test']); +// Route::any('/testlogin', [IndexController::class, 'index']); + //后台登录 Route::post('/login', [LoginController::class, 'login'])->setParams(['perm' => ['login']]); - Route::post('/user/login', [UserLoginController::class, 'login'])->setParams(['perm' => ['userLogin']]); Route::get('/captcha', [LoginController::class, 'captcha'])->setParams(['perm' => ['captcha']]); + + //用户端接口 + Route::group('/user', function () { + //账号密码登录 + Route::post('/login', [UserLoginController::class, 'login'])->setParams(['perm' => ['userLogin']]); + //发送短信验证码 + Route::post('/sendMsg', [UserLoginController::class, 'sendMsg'])->setParams(['perm' => ['userSendMsg']]); + }); }); Route::group('/piadmin/v1', function () { @@ -27,7 +35,7 @@ Route::group('/piadmin/v1', function () { Route::get('/user/getUserMenuPermissions', [UserMenuController::class, 'getUserMenuPermissions'])->setParams(['perm' => ['getUserMenuPermissions']]); })->middleware([ \plugin\piadmin\app\middleware\UserAuthorizationMiddleware::class, -]);; +]); // 需要登录的接口 Route::group('/piadmin/v1', function () { diff --git a/plugin/piadmin/app/utils/Captcha.php b/plugin/piadmin/app/utils/Captcha.php index 0664de5..5324c22 100644 --- a/plugin/piadmin/app/utils/Captcha.php +++ b/plugin/piadmin/app/utils/Captcha.php @@ -3,7 +3,7 @@ namespace plugin\piadmin\app\utils; use plugin\piadmin\app\exception\ApiException; -use support\Cache; +use plugin\piadmin\app\utils\sms\OpenApiSuq; use Ramsey\Uuid\Uuid; use Webman\Captcha\CaptchaBuilder; use Webman\Captcha\PhraseBuilder; @@ -13,6 +13,40 @@ use Webman\Captcha\PhraseBuilder; */ class Captcha { + protected $expriedTime = 60; + public function sendMess($params) + { + $name = $params['phone'] . '_' . $params['type']; + if(CacheUtils::has($name)) + { + throw new ApiException("1分钟内不能再次发送"); + } + $code = random_int(100000, 999999); + CacheUtils::set($name, $code, $this->expriedTime); + if (env('APP_DEBUG') == true) { + return [ + 'code' => $code, + 'cache'=>CacheUtils::get($name), + 'key' => $name + ]; + } + + $data = [ + 'phone' => $params['phone'], + 'phone_prefix' => '+86', + 'template_param' => "{\"code\":\"{$code}\"}", + ]; + $res = OpenApiSuq::sendSms($data); + if (!is_array($res)) { + $res = json_decode($res, true); + } + if ($res['code'] != 200) { + throw new ApiException("发送失败: " . $res['message']); + } + + return '发送成功'; + } + /** * 图形验证码 * @return array diff --git a/plugin/piadmin/app/utils/sms/OpenApiSuq.php b/plugin/piadmin/app/utils/sms/OpenApiSuq.php new file mode 100644 index 0000000..c19d016 --- /dev/null +++ b/plugin/piadmin/app/utils/sms/OpenApiSuq.php @@ -0,0 +1,30 @@ + $data['phone'], + 'phone_prefix' => $data['phone_prefix'], + 'template_id' => config('plugin.piadmin.sms.open_api_suq.captcha_template_id'), + 'template_param' => $param['code'], + ]; + Log::info('发送验证码短信参数:' . json_encode($param, JSON_UNESCAPED_UNICODE)); + $url = config('plugin.piadmin.sms.open_api_suq.baseUrl') . config('plugin.piadmin.sms.open_api_suq.phoneMessageUrl') . config('plugin.piadmin.sms.open_api_suq.urlParam'); + return curlPost($url, $param); + } +} diff --git a/plugin/piadmin/config/sms.php b/plugin/piadmin/config/sms.php new file mode 100644 index 0000000..5b10fa7 --- /dev/null +++ b/plugin/piadmin/config/sms.php @@ -0,0 +1,14 @@ + 'LTAI5tKDZsK5ynAPbDeQdAp5', + 'accessKeySecret' => 'oqaQ2agkSu721OPzBsvcWgXWEVcoG7', + 'signName' => 'GEO代理', //签名名称 + 'templateCode' => '4030', //模板Code + 'open_api_suq' => [ + 'urlParam' => '?app_id=98e0088203&identity=a1f13bdd61cc6071cd0a14653897558c', + 'baseUrl' => 'https://open-api.suq.cn', + 'phoneMessageUrl' => '/api/v1/phone.sendMessage', + 'captcha_template_id' => 14, // 短信验证码 + ], +];