Sms.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\controller\admin\system\sms;
  12. use crmeb\basic\BaseController;
  13. use app\common\repositories\system\config\ConfigValueRepository;
  14. use app\common\repositories\system\sms\SmsRecordRepository;
  15. use app\validate\admin\SmsRegisterValidate;
  16. use crmeb\services\YunxinSmsService;
  17. use think\App;
  18. use think\db\exception\DataNotFoundException;
  19. use think\db\exception\DbException;
  20. use think\db\exception\ModelNotFoundException;
  21. use think\facade\Cache;
  22. /**
  23. * 短信 及 一号通 新版本弃用
  24. * Class Sms
  25. * @package app\controller\admin\system\sms
  26. * @author xaboy
  27. * @day 2020-05-18
  28. */
  29. class Sms extends BaseController
  30. {
  31. /**
  32. * @var YunxinSmsService
  33. */
  34. protected $service;
  35. /**
  36. * Sms constructor.
  37. * @param App $app
  38. */
  39. public function __construct(App $app)
  40. {
  41. parent::__construct($app);
  42. $this->service = YunxinSmsService::create();
  43. }
  44. /**
  45. * 发送验证码
  46. *
  47. * 本函数用于处理用户请求发送验证码的逻辑。它首先验证用户提供的手机号码是否有效,
  48. * 然后调用服务层方法尝试发送验证码。如果手机号码无效或发送失败,函数将返回相应的错误信息;
  49. * 如果发送成功,函数将返回成功的消息。
  50. *
  51. * @return json 返回包含发送结果的JSON对象
  52. */
  53. public function captcha()
  54. {
  55. // 获取请求中的手机号码
  56. $phone = request()->param('phone');
  57. // 检查手机号码是否存在
  58. if (!$phone)
  59. return app('json')->fail('请输入手机号');
  60. // 验证手机号码格式是否正确
  61. if (!preg_match('/^1[3456789]{1}\d{9}$/', $phone))
  62. return app('json')->fail('请输入正确的手机号');
  63. // 调用服务层方法发送验证码
  64. $res = $this->service->captcha($phone);
  65. // 检查发送结果,如果发送失败则返回错误信息
  66. if (!isset($res['status']) && $res['status'] !== 200)
  67. return app('json')->fail($res['data']['message'] ?? $res['msg'] ?? '发送失败');
  68. // 如果发送成功,则返回成功的消息
  69. return app('json')->success($res['data']['message'] ?? $res['msg'] ?? '发送成功');
  70. }
  71. /**
  72. * 保存注册信息并进行验证
  73. *
  74. * 本函数负责接收注册请求,对请求数据进行验证,加密密码,然后将数据发送给服务层进行注册操作。
  75. * 如果注册失败,会根据错误码返回相应的错误信息;如果注册成功,则会更新配置信息。
  76. *
  77. * @param SmsRegisterValidate $validate 验证数据的验证器对象
  78. * @return json 返回注册结果的JSON对象,包含成功或失败的信息
  79. */
  80. public function save(SmsRegisterValidate $validate)
  81. {
  82. // 从请求中获取注册信息
  83. $data = $this->request->params(['account', 'password', 'phone', 'code', 'url', 'sign']);
  84. // 使用验证器对获取的注册信息进行验证
  85. $validate->check($data);
  86. // 对密码进行MD5加密
  87. $data['password'] = md5($data['password']);
  88. // 调用服务层方法进行注册操作
  89. $res = $this->service->registerData($data);
  90. // 如果注册失败,返回相应的错误信息
  91. if ($res['status'] == 400) return app('json')->fail('短信平台:' . $res['msg']);
  92. // 如果注册成功,更新配置信息
  93. $this->service->setConfig($data['account'], $data['password']);
  94. // 返回注册成功的消息
  95. return app('json')->success('短信平台:' . $res['msg']);
  96. }
  97. /**
  98. * 保存基本配置信息,用于短信平台的账号密码存储。
  99. *
  100. * 本函数主要用于处理用户提交的短信平台账号密码,并进行验证和保存。
  101. * 它首先从请求中提取账号和密码,然后使用验证器对输入进行检查。
  102. * 如果验证成功,它将账号和加密的密码保存到服务中,并尝试获取公共短信模板。
  103. * 如果获取模板成功,说明账号密码正确,保存配置信息并返回登录成功的响应。
  104. * 如果获取模板失败,说明账号或密码错误,返回相应的错误响应。
  105. *
  106. * @param SmsRegisterValidate $validate 验证器对象,用于校验输入数据的合法性。
  107. * @param ConfigValueRepository $repository 配置信息存储对象,用于保存账号密码信息。
  108. * @return json 返回登录成功或失败的JSON响应。
  109. */
  110. public function save_basics(SmsRegisterValidate $validate, ConfigValueRepository $repository)
  111. {
  112. // 从请求中提取账号和密码参数。
  113. $data = $this->request->params([
  114. 'account', 'password'
  115. ]);
  116. // 验证用户是否已登录,并检查输入数据的合法性。
  117. $validate->isLogin()->check($data);
  118. // 设置短信服务的账号和加密后的密码。
  119. $this->service->setConfig($data['account'], md5($data['password']));
  120. // 尝试获取公共短信模板,用于验证账号密码是否有效。
  121. // 添加公共短信模板
  122. $templateList = $this->service->publictemp([]);
  123. // 如果获取模板成功,说明账号密码正确,保存配置并返回成功响应。
  124. if ($templateList['status'] != 400) {
  125. $repository->setFormData(['sms_account' => $data['account'], 'sms_token' => md5($data['password'])], 0);
  126. return app('json')->success('登录成功');
  127. } else {
  128. // 如果获取模板失败,说明账号或密码错误,返回失败响应。
  129. return app('json')->fail('账号或密码错误');
  130. }
  131. }
  132. /**
  133. * 检查用户是否已登录。
  134. *
  135. * 本函数通过调用服务层的方法来获取用户的账号信息,以此来判断用户是否已登录。
  136. * 如果用户已登录,即账号信息存在,将返回一个包含登录状态和账号信息的JSON对象。
  137. * 如果用户未登录,或者账号信息获取失败,将返回一个包含登录状态为false的JSON对象。
  138. *
  139. * @return \Illuminate\Http\JsonResponse 返回一个JSON响应,其中包含登录状态和/或账号信息。
  140. */
  141. public function is_login()
  142. {
  143. // 尝试获取用户的账号信息
  144. if ($sms_info = $this->service->account()) {
  145. // 如果账号信息获取成功,返回一个包含登录状态为true和账号信息的JSON响应
  146. return app('json')->success(['status' => true, 'info' => $sms_info]);
  147. } else {
  148. // 如果账号信息获取失败,返回一个包含登录状态为false的JSON响应
  149. return app('json')->success(['status' => false]);
  150. }
  151. }
  152. /**
  153. * 获取短信记录
  154. *
  155. * 本方法用于根据请求参数获取指定条件下的短信记录列表。它支持分页查询,通过调用SmsRecordRepository中的getList方法来实现。
  156. * 参数包括页码和每页记录数,以及请求中可能携带的短信类型参数。
  157. *
  158. * @param SmsRecordRepository $repository 短信记录仓库对象,用于执行查询操作。
  159. * @return json 返回包含查询结果的JSON对象,成功时包含数据列表,错误时包含错误信息。
  160. */
  161. public function record(SmsRecordRepository $repository)
  162. {
  163. // 获取请求中的页码和每页记录数
  164. [$page, $limit] = $this->getPage();
  165. // 从请求中获取类型参数,默认为0
  166. $where = $this->request->params(['type', 0]);
  167. // 调用getList方法获取短信记录列表,并使用json助手函数返回成功响应
  168. return app('json')->success($repository->getList($where, $page, $limit));
  169. }
  170. /**
  171. * 获取短信记录相关数据
  172. *
  173. * 本函数通过调用服务层获取短信发送数量及总数,并结合短信记录仓库获取已记录的短信数量,
  174. * 以及获取当前的短信账户信息,最终组装成数据集返回。
  175. *
  176. * @param SmsRecordRepository $repository 短信记录仓库,用于获取短信记录的数量。
  177. * @return json 返回包含短信数量、总数、记录数量及账户信息的数据集。
  178. */
  179. public function data(SmsRecordRepository $repository)
  180. {
  181. // 调用服务层方法获取短信发送统计信息
  182. $countInfo = $this->service->count();
  183. // 根据获取的统计信息状态判断是否成功获取数据
  184. if ($countInfo['status'] == 400) {
  185. // 如果获取数据失败,初始化短信数量和总数为0
  186. $info['number'] = 0;
  187. $info['total_number'] = 0;
  188. } else {
  189. // 如果获取数据成功,填充短信数量和总数
  190. $info['number'] = $countInfo['data']['number'];
  191. $info['total_number'] = $countInfo['data']['send_total'];
  192. }
  193. // 获取短信记录的数量
  194. $info['record_number'] = $repository->count();
  195. // 获取当前短信账户信息
  196. $info['sms_account'] = $this->service->account();
  197. // 返回组装后的数据集
  198. return app('json')->success($info);
  199. }
  200. /**
  201. * 用户退出登录操作
  202. *
  203. * 本函数负责清除与用户登录状态相关的缓存数据,确保用户安全退出。
  204. * 它通过删除特定的缓存键来实现,这些键包括用户的短信账户信息、服务账户信息以及相关的令牌。
  205. * 使用缓存系统和配置值仓库的结合,本函数能够高效且彻底地清理用户的登录状态。
  206. *
  207. * @param ConfigValueRepository $repository 配置值仓库实例,用于清除特定配置项的值。
  208. * @return \Illuminate\Http\JsonResponse 返回一个表示成功退出的JSON响应。
  209. */
  210. public function logout(ConfigValueRepository $repository)
  211. {
  212. // 从缓存中删除短信账户信息
  213. Cache::delete('sms_account');
  214. // 从缓存中删除服务账户信息
  215. Cache::delete('serve_account');
  216. // 使用配置值仓库清除特定键值相关的缓存,包括短信令牌和服务器令牌
  217. $repository->clearBykey(['sms_account', 'sms_token', 'serve_account', 'serve_token'], 0);
  218. // 返回一个表示成功退出的JSON响应
  219. return app('json')->success('退出成功');
  220. }
  221. /**
  222. * 修改密码
  223. * @Author:Qinii
  224. * @Date: 2020/9/2
  225. * @return mixed
  226. */
  227. public function changePassword()
  228. {
  229. $data = $this->request->params(['password', 'phone', 'code']);
  230. if (empty($data['password']))
  231. return app('json')->fail('密码不能为空');
  232. $data['password'] = md5($data['password']);
  233. $res = $this->service->smsChange($data);
  234. if ($res['status'] == 400) return app('json')->fail('短信平台:' . $res['msg']);
  235. $this->service->setConfig($this->service->account(), $data['password']);
  236. return app('json')->success('修改成功');
  237. }
  238. /**
  239. * 修改签名
  240. * @Author:Qinii
  241. * @Date: 2020/9/2
  242. * @return mixed
  243. */
  244. public function changeSign()
  245. {
  246. $data = $this->request->params(['sign', 'phone', 'code']);
  247. if (empty($data['sign'])) return app('json')->fail('签名不能为空');
  248. $res = $this->service->smsChange($data);
  249. if ($res['status'] == 400) return app('json')->fail('短信平台:' . $res['msg']);
  250. return app('json')->success('修改已提交,审核通过后自动更改');
  251. }
  252. }