SmsController.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Models\User;
  4. use App\Services\Api\ErrorMsgServive;
  5. use App\Services\SmsServer;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Carbon;
  8. use Illuminate\Support\Facades\Mail;
  9. use App\Models\MailCode;
  10. use Illuminate\Support\Facades\Validator;
  11. use libphonenumber\PhoneNumberUtil;
  12. class SmsController extends Controller
  13. {
  14. //发送短信验证码
  15. public function send(Request $request)
  16. {
  17. $checkResult = $this->checkMobile($request->mobile);
  18. if ($checkResult['prefix'] == '-1') { //手机号不合法
  19. return $this->error('手机号不合法');
  20. }
  21. $request->event = $request->event ?: 'login';
  22. if ($request->event == "forget") {
  23. if (!User::where(['mobile' => $request->mobile])->first()) {
  24. return $this->error('手机号未注册');
  25. }
  26. }
  27. $prefix = $checkResult['prefix'];
  28. $result = SmsServer::send($request->mobile, $request->event, $prefix);
  29. if (isset($result['error'])) {
  30. return $this->error('短信发送失败');
  31. }
  32. $data = [
  33. 'smsCode' => $result['smsCode'], //注意:实际不适合把验证码返回,主要是开发方便测试,生产环境请变为 ""
  34. 'verifyKey' => $result['verifyKey'],
  35. ];
  36. return $this->success($data);
  37. }
  38. /**
  39. * @param $mobile
  40. * @return array
  41. * 验证手机号是否合法(支持全球手机号验证)$phoneUtil->parse($mobile, "CN"),两个参数:(要验证的手机号,国家区号)
  42. * 国际区号映射关系在 vendor\giggsey\libphonenumber-for-php\src\CountryCodeToRegionCodeMap.php
  43. * 可以 在 PhoneNumberUtil::getInstance() 方法中 点击 CountryCodeToRegionCodeMap::$countryCodeToRegionCodeMap 跳过去
  44. */
  45. public static function checkMobile($mobile)
  46. {
  47. $phoneUtil = PhoneNumberUtil::getInstance();
  48. try {
  49. $cnNumberProto = $phoneUtil->parse($mobile, "CN"); //大陆
  50. $prefix = '-1';
  51. if ($isValid_CN = $phoneUtil->isValidNumber($cnNumberProto)) {
  52. $prefix = '86';
  53. }
  54. $checkResult = [
  55. 'prefix' => $prefix
  56. ];
  57. return $checkResult;
  58. } catch (\libphonenumber\NumberParseException $exception) {
  59. ErrorMsgServive::write($exception, request()->url());
  60. }
  61. }
  62. /**
  63. 发送邮箱验证码
  64. 在 .env 文件配置如下,可测试邮件发送(最好自己申请一个邮箱获取信息)
  65. MAIL_MAILER=smtp
  66. MAIL_HOST=ssl://smtp.163.com
  67. MAIL_PORT=465
  68. MAIL_USERNAME=18738190585@163.com
  69. MAIL_PASSWORD=VIBTDHQAYLKJYIGC
  70. MAIL_ENCRYPTION=
  71. MAIL_FROM_ADDRESS=18738190585@163.com
  72. MAIL_FROM_NAME="${APP_NAME}"
  73. *
  74. * @param Request $request
  75. * @return \Illuminate\Http\JsonResponse
  76. */
  77. public function sendEmailCode(Request $request)
  78. {
  79. $email = $request->input('email');
  80. $validator = Validator::make($request->all(), [
  81. 'email' => 'required|email',
  82. ]);
  83. if ($validator->fails()) {
  84. return $this->error($validator->errors()->first());
  85. }
  86. $code = rand(1000, 9999);
  87. $notice = '本次验证码是' . '【 ' . $code . ' 】 ' . '有效期 5 分钟';
  88. $subject = '邮箱验证通知';
  89. try {
  90. Mail::raw($notice, function ($message) use ($email, $subject) {
  91. $message->subject($subject);
  92. $message->to($email);
  93. });
  94. $mailCode = new MailCode();
  95. $mailCode->account = $email;
  96. $mailCode->code = $code;
  97. $mailCode->state = 0;
  98. $mailCode->created_at = date('Y-m-d H:i:s');
  99. $mailCode->save();
  100. return $this->success();
  101. } catch (\Exception $e) {
  102. return $this->error($e->getMessage());
  103. }
  104. }
  105. //判断邮箱验证码 5分钟有效期 (这不是个API接口:哪里需要就放到哪里验证)
  106. public static function isEmailCodeRight($email, $code)
  107. {
  108. $result = MailCode::query()
  109. ->where('account', $email)
  110. ->where('code', $code)
  111. ->where('state', 0)
  112. ->where('created_at', '>', Carbon::now()->subMinutes(5))
  113. ->orderBy('id', 'desc')
  114. ->first();
  115. if (!$result) {
  116. return false;
  117. }
  118. $result->state = 1; //验证通过就失效
  119. $result->save();
  120. return true;
  121. }
  122. }