Sms.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace App\Servers\Aliyun;
  3. use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
  4. use AlibabaCloud\Tea\Exception\TeaError;
  5. use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
  6. use AlibabaCloud\Tea\Utils\Utils;
  7. use App\Facades\Servers\Logs\Log;
  8. /**
  9. * 验证码模型
  10. * @author 唐远望
  11. * @version 1.0
  12. * @date 2025-12-22
  13. */
  14. class Sms extends Client
  15. {
  16. /**
  17. * 发送短信
  18. * @param string $phone 手机号。国际/港澳台消息需加国际区号。支持向不同的手机号码发送短信,手机号码之间以半角逗号(,)分隔。上限为 1000 个手机号码。批量发送相对于单条发送,及时性稍有延迟。验证码类型的短信,建议单条发送。
  19. * @param string $signName 签名名称。
  20. * @param string $templateCode 模板ID。
  21. * @param array $param 模板参数。短信模板变量对应的实际值。支持传入多个参数, json格式,如 {"name":"张三","number":"1390000****"}
  22. *
  23. */
  24. public function sendSms(string $phone, string $signName, string $templateCode, array $param = [])
  25. {
  26. try {
  27. // 变量参数转成json字符串
  28. $param = $param ? json_encode($param, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) : '';
  29. $request = ['phoneNumbers' => $phone, 'signName' => $signName, 'templateCode' => $templateCode];
  30. if ($param) $request['templateParam'] = $param;
  31. // 创建请求
  32. $sendSmsRequest = new SendSmsRequest($request);
  33. // 创建终端
  34. $client = $this->createClient();
  35. // 复制代码运行请自行打印 API 的返回值
  36. $response = $client->sendSmsWithOptions($sendSmsRequest, new RuntimeOptions([]))->toMap();
  37. // 获取参数
  38. $result = $response['body'];
  39. // 如果失败的话
  40. if ($result['Code'] != 'OK') return ['code' => $result['Code'], 'error' => $result['Message'], 'request_id' => $result['RequestId']];
  41. // 返回成功信息
  42. return ['code' => $result['Code'], 'message' => $result['Message'], 'requestId' => $result['RequestId'], 'bizId' => $result['BizId']];
  43. } catch (\Exception $error) {
  44. // 返回错误信息
  45. if (!($error instanceof TeaError)) {
  46. $error = new TeaError([], $error->getMessage(), $error->getCode(), $error);
  47. }
  48. // 错误信息
  49. $errorMsg = Utils::assertAsString($error->message);
  50. // 日志记录
  51. Log::error('aliyun_sms', $errorMsg);
  52. // 返回错误信息
  53. return ['error' => $errorMsg];
  54. }
  55. }
  56. }