From a4b758d33b51ad771a11237fb72bc856dd9059b2 Mon Sep 17 00:00:00 2001 From: chengkun <chengkun@ishangstudy.com> Date: Thu, 29 May 2025 18:22:55 +0800 Subject: [PATCH] 短信开发 --- app/model/notice.model.php | 185 ++++++++++++++++++++++++--------------------- 1 files changed, 98 insertions(+), 87 deletions(-) diff --git a/app/model/notice.model.php b/app/model/notice.model.php index 23122e5..d9a1015 100644 --- a/app/model/notice.model.php +++ b/app/model/notice.model.php @@ -68,18 +68,17 @@ * 获取邮件、短信模板 * @param array $data 传入参数 * @param string $type 模板类型:email邮箱; msg短信 - * @return mixed + * @return array */ public function getTpl($data, $type) { $name = $type . $data['type']; - $row = $this->select_once('templates', array('name' => $name)); if ($row) { $tpl['title'] = $this->_tpl($row['title'], $data); $tpl['content'] = $this->_tpl($row['content'], $data); - + $tpl['template_id'] = $row['template_id']; return $tpl; } else { return array('status' => -1, 'msg' => '信息模板有误,请联系管理员'); @@ -235,12 +234,12 @@ } /** - * @desc 发送短信 + * @desc 发送短信接口 * @param $type * @param $data - * @return bool|string + * @return array */ - private function postSMS($type = "msgsend", $data = '') { + private function postSMS($type = "msgsend", $data = []) { $sing = $this->config['sy_msg_appsing']; $data['content'] = str_replace(array(" ", " ", "\t", "\n", "\r"), array("", "", "", "", ""), $data['content']); $url = 'http://api.smsbao.com/sms'; @@ -285,6 +284,7 @@ } /** + * @desc 发送短信 * $data['moblie'] / $data['mobile'] 手机号(必填) * $data['content'] 短信内容(必填) * @@ -297,30 +297,29 @@ return array('status' => -1, 'msg' => '还没有配置短信,请联系管理员!'); } - $data['mobile'] = $data['moblie'] ? $data['moblie'] : $data['mobile']; if (!$this->_isKey('mobile', $data) || !CheckMobile($data['mobile'])) { return array('status' => -1, 'msg' => '手机号错误'); } + if ($this->config['sy_web_mobile'] != '') { $regnamer = @explode(';', $this->config['sy_web_mobile']); if (in_array($data['mobile'], $regnamer)) { return array('status' => -1, 'msg' => '该手机号已被禁止使用'); } } - if (!$this->_isKey('content', $data) || $data['content'] == '') { return array('status' => -1, 'msg' => '短信内容为空'); } //发送短信 $row = array( - - 'appsecret' => $this->config['sy_msg_appsecret'], - 'appkey' => $this->config['sy_msg_appkey'], - 'appsing' => $this->config['sy_msg_appsing'], - 'phone' => $data['mobile'], - 'content' => $data['content'], - 'mid' => isset($data['mid']) ? $data['mid'] : '' + 'sy_sms_secret_id' => $this->config['sy_sms_secret_id'], + 'sy_sms_secret_key' => $this->config['sy_sms_secret_key'], + 'sy_sms_sdk_app_id' => $this->config['sy_sms_sdk_app_id'], + 'sy_sms_sign_name' => $this->config['sy_sms_sign_name'], + 'template_id' => $data['template_id'], + 'phone' => $data['mobile'], + 'code' => $data['code'], ); $location = ''; @@ -363,7 +362,9 @@ } } if (!isset($re['code'])) { - $re = $this->postSMS('msgsend', $row); + ///// 发送短信 ///// +// $re = $this->postSMS('msgsend', $row); + $re = $this->sendSmsHttpRequest($row); } //短信记录保存数据库 $sql_data = array( @@ -376,7 +377,7 @@ 'location' => $location ); - if (trim($re) == '0') { + if ($re['code'] == 1) { //检查是否需要发送系统预警 include_once('warning.model.php'); @@ -425,10 +426,11 @@ return $tpl; } $content = $tpl['content']; + $template_id = $tpl['template_id']; } $data['content'] = $content; - + $data['template_id'] = $template_id; return $this->sendSMS($data); } @@ -535,6 +537,7 @@ $today = strtotime('today'); $code = gt_Generate_code($length); //验证码 $lastSend = []; + $result = []; if ($kind == 'msg') { ///// 短信 ///// if (!checkMsgOpen($this->config)) { @@ -574,6 +577,7 @@ ///// 获取企业认证信息 ///// $lastSend = $this->select_once('company_cert', array('check' => $sended, 'type' => 7, 'orderby' => 'id,desc'), '`ctime`,`type`'); } else { + ///// 获取企业认证信息 ///// $lastSend = $this->select_once('company_cert', array('check' => $sended, 'type' => 2, 'orderby' => 'id,desc'), '`ctime`,`type`'); } if ($lastSend['ctime'] > $overtime) { @@ -685,13 +689,13 @@ /** * 按类别发送验证码 - * @param $sended // 发送对象 + * @param $sended // 发送对象-手机号 * @param $type // 验证码类别 * @param $code // 验证码 * @param $kind // 发送类别 * @param $user // 用户信息 * @param $port // 端口 - * @return array|mixed|number[]|string[] + * @return array|number[]|string[] */ private function sendType($sended, $type, $code, $kind = 'msg', $user = array(), $port = null) { $finfo = $this->forsend($user); //用户信息 @@ -705,7 +709,7 @@ ); $result = []; if ($kind == 'msg') { - $data['moblie'] = $sended; + $data['mobile'] = $sended; $data['port'] = $port; $result = $this->sendSMSType($data); } elseif ($kind == 'email') { @@ -798,96 +802,103 @@ * @param $msg * @return string */ - function sign($key, $msg) { + protected function sign($key, $msg) { return hash_hmac("sha256", $msg, $key, true); } /** * 发送短信接口-腾讯云 - * @param $params + * @param $data * @return array */ - public function sendSmsHttpRequest($params = []) { + public function sendSmsHttpRequest($data = []) { // 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密 // 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 + $secret_id = $data['sy_sms_secret_id']; + $secret_key = $data['sy_sms_secret_key']; + $token = ""; + + $service = "sms"; + $host = "sms.tencentcloudapi.com"; + $req_region = "ap-guangzhou"; + $version = "2021-01-11"; + $action = "SendSms"; + + //////数字转字符串 ////// + $params = [ + 'PhoneNumberSet' => ['+86' . $data['phone']], + 'SmsSdkAppId' => $data['sy_sms_sdk_app_id'], + 'TemplateId' => $data['template_id'], + 'SignName' => $data['sy_sms_sign_name'], + 'TemplateParamSet' => [strval($data['code'])] + ]; + $payload = json_encode($params, JSON_UNESCAPED_UNICODE); + var_dump($payload); + $endpoint = "https://sms.tencentcloudapi.com"; + $algorithm = "TC3-HMAC-SHA256"; + $timestamp = time(); + $date = gmdate("Y-m-d", $timestamp); + + // ************* 步骤 1:拼接规范请求串 ************* + $http_request_method = "POST"; + $canonical_uri = "/"; + $canonical_querystring = ""; + $ct = "application/json; charset=utf-8"; + $canonical_headers = "content-type:" . $ct . "\nhost:" . $host . "\nx-tc-action:" . strtolower($action) . "\n"; + $signed_headers = "content-type;host;x-tc-action"; + $hashed_request_payload = hash("sha256", $payload); + $canonical_request = "$http_request_method\n$canonical_uri\n$canonical_querystring\n$canonical_headers\n$signed_headers\n$hashed_request_payload"; + + // ************* 步骤 2:拼接待签名字符串 ************* + $credential_scope = "$date/$service/tc3_request"; + $hashed_canonical_request = hash("sha256", $canonical_request); + $string_to_sign = "$algorithm\n$timestamp\n$credential_scope\n$hashed_canonical_request"; + + // ************* 步骤 3:计算签名 ************* + $secret_date = $this->sign("TC3" . $secret_key, $date); + $secret_service = $this->sign($secret_date, $service); + $secret_signing = $this->sign($secret_service, "tc3_request"); + $signature = hash_hmac("sha256", $string_to_sign, $secret_signing); + + // ************* 步骤 4:拼接 Authorization ************* + $authorization = "$algorithm Credential=$secret_id/$credential_scope, SignedHeaders=$signed_headers, Signature=$signature"; + + // ************* 步骤 5:构造并发起请求 ************* + $headers = [ + "Authorization" => $authorization, + "Content-Type" => "application/json; charset=utf-8", + "Host" => $host, + "X-TC-Action" => $action, + "X-TC-Timestamp" => $timestamp, + "X-TC-Version" => $version + ]; + if ($req_region) { + $headers["X-TC-Region"] = $req_region; + } + if ($token) { + $headers["X-TC-Token"] = $token; + } try { - $secret_id = "SecretId"; - $secret_key = "SecretKey"; - $token = ""; - - $service = "sms"; - $host = "sms.tencentcloudapi.com"; - $req_region = "ap-guangzhou"; - $version = "2021-01-11"; - $action = "SendSms"; -// $params = [ -// 'PhoneNumberSet' => '18019261992', -// 'SmsSdkAppId' => '2343224242', -// 'TemplateId' => '54645454' -// ]; - $payload = json_encode($params); - $endpoint = "https://sms.tencentcloudapi.com"; - $algorithm = "TC3-HMAC-SHA256"; - $timestamp = time(); - $date = gmdate("Y-m-d", $timestamp); - - // ************* 步骤 1:拼接规范请求串 ************* - $http_request_method = "POST"; - $canonical_uri = "/"; - $canonical_querystring = ""; - $ct = "application/json; charset=utf-8"; - $canonical_headers = "content-type:" . $ct . "\nhost:" . $host . "\nx-tc-action:" . strtolower($action) . "\n"; - $signed_headers = "content-type;host;x-tc-action"; - $hashed_request_payload = hash("sha256", $payload); - $canonical_request = "$http_request_method\n$canonical_uri\n$canonical_querystring\n$canonical_headers\n$signed_headers\n$hashed_request_payload"; - - // ************* 步骤 2:拼接待签名字符串 ************* - $credential_scope = "$date/$service/tc3_request"; - $hashed_canonical_request = hash("sha256", $canonical_request); - $string_to_sign = "$algorithm\n$timestamp\n$credential_scope\n$hashed_canonical_request"; - - // ************* 步骤 3:计算签名 ************* - $secret_date = sign("TC3" . $secret_key, $date); - $secret_service = sign($secret_date, $service); - $secret_signing = sign($secret_service, "tc3_request"); - $signature = hash_hmac("sha256", $string_to_sign, $secret_signing); - - // ************* 步骤 4:拼接 Authorization ************* - $authorization = "$algorithm Credential=$secret_id/$credential_scope, SignedHeaders=$signed_headers, Signature=$signature"; - - // ************* 步骤 5:构造并发起请求 ************* - $headers = [ - "Authorization" => $authorization, - "Content-Type" => "application/json; charset=utf-8", - "Host" => $host, - "X-TC-Action" => $action, - "X-TC-Timestamp" => $timestamp, - "X-TC-Version" => $version - ]; - if ($req_region) { - $headers["X-TC-Region"] = $req_region; - } - if ($token) { - $headers["X-TC-Token"] = $token; - } - $ch = curl_init(); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_URL, $endpoint); - curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_HTTPHEADER, array_map(function ($k, $v) { return "$k: $v"; }, array_keys($headers), $headers)); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($ch); curl_close($ch); - $result = json_decode($response, TRUE); + if (!$result['Response']['RequestId']) { throw new Exception("请求失败", 10000); } + $result_result = [ 'code' => 1, 'msg' => 'ok', -- Gitblit v1.9.0