// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\api\controller\v1; use ywxapp\controller\ApiBase; use think\facade\Event; use ywxapp\model\MemberUser as UserModel; use ywxapp\library\Result; use ywxapp\library\Email as EmailLib; /** * 邮箱验证码接口(公开,无需登录) * * 路由前缀:/api/v1/ems/ * 业务事件(event)由调用方约定,如 register / resetpwd / changepwd / changeemail 等。 * * @package app\api\controller\v1 */ class Ems extends ApiBase { /** * 免登录(公开)接口白名单。 * * @var array */ protected $noNeedLogin = ['*']; /** * 发送邮箱验证码(公开)。 * * 触发 email_send 事件并调用 Email 服务下发验证码; * 按 event 校验账号是否已注册 / 占用 / 未注册。 * * @param string $email 邮箱(必填) * @param string $event 事件名称(可选,默认 register) * * @return \think\Response JSON 响应,成功提示 * * @route POST /api/v1/ems/send */ public function send() { $email = $this->request->request('email'); $event = $this->request->request('event'); $event = $event ? $event : 'register'; Event::trigger('email_send', ['email'=>$email, 'event'=>'register'], true); $userinfo = UserModel::getByEmail($email); if ($event == 'register' && $userinfo) $this->apiError('已被注册'); elseif (in_array($event, ['changeemail']) && $userinfo) $this->apiError('已被占用'); elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) $this->apiError('未注册'); $ret = \ywxapp\library\Email::instance()->sendEmail($email, null, $event); if (!$ret) $this->apiError('发送失败'); $this->apiSuccess([], '发送成功'); } /** * 校验邮箱验证码(公开)。 * * 校验邮箱格式、事件名称与验证码格式,并依 event 校验账号注册状态, * 最后调用 EmailLib::check 比对验证码。 * * @param string $email 邮箱(必填) * @param string $event 事件名称(可选,默认 register) * @param string $captcha 验证码(必填) * * @return \think\Response JSON 响应,成功提示 * * @route POST /api/v1/ems/check */ public function check() { $email = $this->request->request('email'); $event = $this->request->request('event', 'register'); $captcha = $this->request->request('captcha'); $validate = validate([ 'email' => 'email', 'event' => 'chsAlphaNum', 'code' => 'Num', ]); if (!$validate->check(['email' => $email, 'event' => $event, 'code' => $captcha])) $this->apiError($validate->getError()); $userinfo = UserModel::where('email', $email)->find(); if ($event == 'register' && $userinfo) $this->apiError('已被注册'); elseif (in_array($event, ['changeemail']) && $userinfo) $this->apiError('已被占用'); elseif (in_array($event, ['changepwd', 'resetpwd']) && !$userinfo) $this->apiError('未注册'); $ret = EmailLib::instance()->check($email, $captcha, $event); if (!$ret) $this->apiError('验证码不正确'); $this->apiSuccess([], '验证码正确'); } }