Index.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. <?php
  2. /*
  3. * @Description: 微信公众号接口
  4. * @Version: 2.0
  5. * @Autor: 李康
  6. * @Date: 2022-01-24 11:11:15
  7. * @LastEditors: 李康
  8. * @LastEditTime: 2022-01-25 15:49:18
  9. */
  10. namespace catchAdmin\xw1\controller;
  11. use app\Request;
  12. use catchAdmin\msg\model\Msg;
  13. use catchAdmin\permissions\model\Users;
  14. use catcher\base\CatchController;
  15. use catcher\CatchResponse;
  16. use think\facade\Db;
  17. class Index extends CatchController
  18. {
  19. //注册信息
  20. /**
  21. * Undocumented function
  22. *
  23. * @param Request $request
  24. * @username 手机号
  25. * @smsCode 手机验证码
  26. * @password 密码
  27. * @confirmPassword 重复密码
  28. *
  29. * @return void
  30. */
  31. public function register(Request $request){
  32. header('Access-Control-Allow-Origin: *');
  33. // 通过手机号和短信验证码注册
  34. $data = $request->param();
  35. if(!$data['username']){
  36. return CatchResponse::fail('手机号码不能为空');
  37. }
  38. if(!$data['smsCode']){
  39. return CatchResponse::fail('短信验证码不能为空');
  40. }
  41. if(! $data['password']){
  42. return CatchResponse::fail('密码不能为空');
  43. }
  44. if(! $data['confirmPassword']){
  45. return CatchResponse::fail('请输入确认密码');
  46. }
  47. if ($data['password'] != $data['confirmPassword']) {
  48. return CatchResponse::fail('两次密码不一致');
  49. }
  50. // 号码是否已注册
  51. $userinfo = Db::name('users')->where(['username'=>$data['username']])->find();
  52. if ($userinfo) {
  53. return CatchResponse::fail('该号码已注册');
  54. }
  55. // 验证码有效性
  56. $res = $this->isValidSmsCode($data['username'], $data['smsCode']);
  57. if (!$res['success']) {
  58. return CatchResponse::fail($res['message']);
  59. }
  60. //设置转换密码
  61. $user=new Users();
  62. $savePwd = $user->setPasswordAttr($data['password']);
  63. $saveData = [
  64. 'username' => $data['username'],
  65. 'password' => $savePwd
  66. ];
  67. $userid = Db::name('users')->insert($saveData);
  68. if(!$userid){
  69. return CatchResponse::fail('注册失败');
  70. }
  71. return CatchResponse::success('注册成功');
  72. }
  73. //重置密码
  74. /**
  75. * Undocumented function
  76. *
  77. * @param Request $request
  78. * @username 手机号
  79. * @smsCode 手机验证码
  80. * @password 密码
  81. * @confirmPassword 重复密码
  82. * @
  83. * @return void
  84. */
  85. public function resetPassword(Request $request)
  86. {
  87. header('Access-Control-Allow-Origin: *');
  88. // 通过手机号和短信验证码注册
  89. $data = $request->param();
  90. if(!$data['username']){
  91. return CatchResponse::fail('手机号码不能为空');
  92. }
  93. if(!$data['smsCode']){
  94. return CatchResponse::fail('短信验证码不能为空');
  95. }
  96. if(! $data['password']){
  97. return CatchResponse::fail('密码不能为空');
  98. }
  99. if(! $data['confirmPassword']){
  100. return CatchResponse::fail('确认密码不能为空');
  101. }
  102. if ($data['password'] != $data['confirmPassword']) {
  103. return CatchResponse::fail('两次密码不一致');
  104. }
  105. // 判断角色、号码是否已注册
  106. $userinfo = Users::where('username',$data['username'])->find();
  107. if (empty($userinfo)) {
  108. return CatchResponse::fail('该号码未注册');
  109. }
  110. // 验证码有效性
  111. $res = $this->isValidSmsCode($data['username'], $data['smsCode']);
  112. if (!$res['success']) {
  113. return CatchResponse::fail($res['message']);
  114. }
  115. // 重置密码
  116. $user=new Users();
  117. $savePwd = $user->setPasswordAttr($data['password']);
  118. $cond = ['id' => $userinfo['id']];
  119. $res = Users::where($cond)->update(["password"=>$savePwd]);
  120. if($res === false){
  121. return CatchResponse::fail('重置失败');
  122. }
  123. return CatchResponse::success('重置成功');
  124. }
  125. /**
  126. * @username 手机号
  127. * isReset 是否重置密码 1代表重置 0未重置
  128. */
  129. //发送短信验证码
  130. public function sendSmsCode(Request $request){
  131. header('Access-Control-Allow-Origin: *');
  132. $postData = $request->param();
  133. //判断账号和密码是否存在
  134. if (!$postData['username']) {
  135. return CatchResponse::fail('手机号不存在');
  136. }
  137. if (!preg_match('/^1[3456789]\d{9}$/', $postData['username'])) {
  138. return CatchResponse::fail('手机号格式不存在');
  139. }
  140. // 是否重置密码
  141. //1代表重置
  142. //0 未重置
  143. $isReset = $postData['isReset'];
  144. // 号码是否已注册
  145. $userinfo = Users::where('username',$postData['username'])->find();
  146. // 重置密码时
  147. if ($isReset && empty($userinfo)) {
  148. return CatchResponse::fail('该号码未注册');
  149. } elseif (!$isReset && $userinfo) {
  150. return CatchResponse::fail('该号码已注册');
  151. }
  152. $sms_code_mode = Db::name('sms_verification_code'); // 短信验证码模型
  153. // 防盗刷IP地址检测
  154. $todayTime = strtotime(date('Y-m-d'));
  155. $where = ['access_ip' => $_SERVER['REMOTE_ADDR'], 'created_at' => ['GT', $todayTime]];
  156. $count = $sms_code_mode->where($where)->count();
  157. if ($count >= 10) {
  158. return CatchResponse::fail('已达到当日获取次数上限');
  159. }
  160. // 获取短信配置
  161. $rlyunId = Db::name('sms_config')->where(['name' => 'rlyun'])->value('id');
  162. $smsConfig = Db::name('sms_config')->where(['pid' => $rlyunId])->column('key,value');
  163. $test=null;
  164. foreach ($smsConfig as $key=>$value) {
  165. $test[$value['key']]=$value['value'];
  166. }
  167. $smsConfig=$test;
  168. if (empty($smsConfig)) {
  169. return CatchResponse::fail('获取短信配置失败');
  170. }
  171. // 获取短信验证码模板信息
  172. $where = ['operator' => 'rlyun', 'code' => 'verification_code'];
  173. $tmpInfo = Db::name('sms_template')->where($where)->find();
  174. if (empty($tmpInfo)) {
  175. return CatchResponse::fail('获取短信验证码模板信息失败');
  176. }
  177. // 生成验证码
  178. $code = rand(0, 9999);
  179. $code = str_pad($code, 4, '0',STR_PAD_LEFT);
  180. // 保存验证码
  181. $time = time();
  182. $saveData = [
  183. 'mobile' => $postData['username'],
  184. 'code' => $code,
  185. 'access_ip' => $_SERVER['REMOTE_ADDR'],
  186. 'created_at' => $time,
  187. 'updated_at' => $time,
  188. ];
  189. Db::startTrans(); // 开启事务
  190. // createAdd($saveData);
  191. $res = $sms_code_mode->insert($saveData);
  192. if ($res === false) {
  193. Db::rollback();
  194. return CatchResponse::fail('发送失败,请稍后重试');
  195. }
  196. // 发送短信验证码
  197. $content = str_replace('{1}', $code, $tmpInfo['content']);
  198. $content = str_replace('{2}', '5分钟', $content);
  199. $contentData = [
  200. 'tplno' => $tmpInfo['identify'],
  201. 'tpldata' => [ $code, '5分钟' ],
  202. //'tpldata' => $content, // error test
  203. 'info' => $content,
  204. ];
  205. $res = send_sms_with_config($postData['username'], $contentData, $smsConfig,array());
  206. if (!$res['success']) {
  207. Db::rollback();
  208. Db::name('sms_send_log')->insert($res['data']);
  209. return CatchResponse::fail($res['message'] ?: '发送失败');
  210. }
  211. Db::commit();
  212. return CatchResponse::success($res['message']);
  213. }
  214. //校验密码
  215. private function isValidSmsCode( $mobile, $code ){
  216. if (!$mobile) {
  217. return ['success' => false, 'message' => '手机号码不存在'];
  218. }
  219. if (!$code) {
  220. return ['success' => false, 'message' => '验证码不存在'];
  221. }
  222. // 根据手机号码和验证码查询最后一次验证码
  223. $sms_verification_code_model = Db::name('sms_verification_code');
  224. $cond = [ 'mobile' => $mobile, 'code' => $code ];
  225. $info = $sms_verification_code_model->where($cond)->order('created_at', 'desc')->find();
  226. // 不存在
  227. if (empty($info)) {
  228. return ['success' => false, 'message' => '验证失败,请确保手机号码和验证码输入无误'];
  229. }
  230. // 超过时间(暂定5分钟)
  231. $valid_time = 60 * 5;
  232. if (time() - $info['created_at'] > $valid_time) {
  233. return ['success' => false, 'message' => '验证码已失效'];
  234. }
  235. // 超过使用次数(暂定3次)
  236. if ($info['use_times'] >= 3) {
  237. return ['success' => false, 'message' => '验证码已失效'];
  238. }
  239. // 可以使用,使用次数+1
  240. $cond = ['id' => $info['id']];
  241. $user_times=$sms_verification_code_model->where($cond)->value('use_times');
  242. $res = $sms_verification_code_model->where($cond)->update(['use_times'=>$user_times+1]);
  243. if ($res === false) {
  244. return ['success' => false, 'message' => '操作失败,请重试'];
  245. }
  246. return ['success' => true, 'message' => '验证码有效'];
  247. }
  248. }