Browse Source

feat(piadmin): 添加短信验证码发送功能

- 在 Captcha 类中新增 sendMess 方法用于发送短信验证码
- 新增 curlPost 函数用于发送 POST 请求
- 添加 OpenApiSuq 类处理短信发送逻辑
- 更新路由配置,增加用户端发送短信验证码接口
- 新增短信配置文件 sms.php
- 在 UserLoginController 中添加 sendMsg 方法处理短信发送请求
- 修复路由配置中的语法错误
- 添加 ext-curl 扩展依赖
master
zhangf@suq.cn 6 days ago
parent
commit
0914cd9e41
  1. 3
      composer.json
  2. 5
      composer.lock
  3. 22
      plugin/piadmin/app/controller/v1/UserLoginController.php
  4. 32
      plugin/piadmin/app/functions.php
  5. 16
      plugin/piadmin/app/route/v1/route.php
  6. 36
      plugin/piadmin/app/utils/Captcha.php
  7. 30
      plugin/piadmin/app/utils/sms/OpenApiSuq.php
  8. 14
      plugin/piadmin/config/sms.php

3
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. "

5
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"

22
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));
}

32
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;
}
}

16
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 () {

36
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

30
plugin/piadmin/app/utils/sms/OpenApiSuq.php

@ -0,0 +1,30 @@
<?php
/**
* OpenApiSuq.php
* @author: hedali
* @email: 2963249196@qq.com
* @Time: 2023/9/19 9:34
*/
namespace plugin\piadmin\app\utils\sms;
use support\Log;
class OpenApiSuq
{
public static function sendSms($data)
{
$data['phone_prefix'] = $data['phone_prefix'] ?? '+86';
$param = json_decode($data['template_param'], true);
$param = [
'phone' => $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);
}
}

14
plugin/piadmin/config/sms.php

@ -0,0 +1,14 @@
<?php
return [
'accessKeyId' => '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, // 短信验证码
],
];
Loading…
Cancel
Save