VerificationCodesController.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <?php
  2. namespace App\Http\Controllers\Api\V1;
  3. use App\Events\SendTextMessage;
  4. use App\Helpers\NumberHelper;
  5. use App\Http\Controllers\Api\Controller;
  6. use App\Http\Requests\Api\VerificationCodeRequest;
  7. use App\Models\User;
  8. use Illuminate\Support\Facades\Cache;
  9. use Overtrue\EasySms\EasySms;
  10. use Overtrue\EasySms\Exceptions\NoGatewayAvailableException;
  11. class VerificationCodesController extends Controller
  12. {
  13. /**
  14. * 发送短信验证码
  15. * @param VerificationCodeRequest $request
  16. * @param EasySms $easySms
  17. * @return array
  18. * @throws \Overtrue\EasySms\Exceptions\InvalidArgumentException
  19. */
  20. public function store(VerificationCodeRequest $request, EasySms $easySms)
  21. {
  22. $phone = $request->phone;
  23. $type = $request->type ?? 1;
  24. $user_data = User::query()->where('phone', $request->phone)->first();
  25. if ($user_data) return apiJsonError('您绑定的手机号已经存在!');
  26. // 生成4位随机数,左侧补0
  27. $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
  28. if (app()->environment('local')) {
  29. $code = '1234';
  30. $content = "您的验证码是{$code}。如非本人操作,请忽略本短信";
  31. event(new SendTextMessage($phone, $request->getClientIp(), $code, $content, $type));
  32. } else {
  33. try {
  34. $content = "您的验证码${code},该验证码十分钟内有效,请勿泄漏于他人!";
  35. /*$result = $easySms->send($phone, [
  36. 'content' => $content
  37. ]);*/
  38. $result = $easySms->send($phone, [
  39. 'content' => $content,
  40. 'template' => 'SMS_199330236', //阿里云后台设置的短信模板ID
  41. 'data' => [
  42. 'code' => $code //阿里云短信后台模板中的短信验证码变量code,要对应
  43. ]
  44. ]);
  45. event(new SendTextMessage($phone, $request->getClientIp(), $code, $content, $type));
  46. } catch (NoGatewayAvailableException $exception) {
  47. $message = $exception->getException('aliyun')->getMessage();
  48. return apiJsonError('短信发送异常');
  49. }
  50. }
  51. $key = 'verificationCode_' . NumberHelper::random('alnum');
  52. $expiredAt = now()->addMinutes(10);
  53. // 缓存验证码 10分钟过期。
  54. Cache::put($key, ['phone' => $phone, 'code' => $code], $expiredAt);
  55. return apiJson([
  56. 'key' => $key,
  57. 'expired_at' => $expiredAt->toDateTimeString(),
  58. ], '验证码发送成功');
  59. }
  60. }