From 658bbc102712f17178f1f0e1ea6d9469c0ea3fb9 Mon Sep 17 00:00:00 2001 From: yanzai Date: Fri, 5 Dec 2025 12:15:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=9F=AD=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/API/SmsController.php | 71 +++++++++++++++ Laravel/app/Services/TencentSmsApiService.php | 90 +++++++++++++++++++ Laravel/composer.json | 3 +- Laravel/composer.lock | 52 ++++++++++- xiaochengxu/manifest.json | 2 +- xiaochengxu/pages/index/index.vue | 2 +- .../mp-weixin/pages/index/index.js.map | 2 +- .../dist/dev/mp-weixin/common/vendor.js | 4 +- .../dist/dev/mp-weixin/pages/index/index.js | 1 - .../dist/dev/mp-weixin/project.config.json | 2 +- 10 files changed, 220 insertions(+), 9 deletions(-) create mode 100644 Laravel/app/Http/Controllers/API/SmsController.php create mode 100644 Laravel/app/Services/TencentSmsApiService.php diff --git a/Laravel/app/Http/Controllers/API/SmsController.php b/Laravel/app/Http/Controllers/API/SmsController.php new file mode 100644 index 0000000..1ceabc5 --- /dev/null +++ b/Laravel/app/Http/Controllers/API/SmsController.php @@ -0,0 +1,71 @@ +input('tel'); + $code = $this->generateCode(); + + $service = new TencentSmsApiService(); + $cha=DB::table('sms')->where(['phone'=>$phoneNumber])->orderBy('id','desc')->first(); + if(!!$cha){ + $specificTimeTimestamp = strtotime($cha->created_at); + // 计算一分钟之后的时间戳 + $oneMinuteLaterTimestamp = strtotime('+1 minute', $specificTimeTimestamp); + if($oneMinuteLaterTimestamp>time()){ + return \Yz::echoError1('请稍后再试'); + } + } + $end_time = strtotime('+'.$this->Lifespan.' minute', time()); + + $in=DB::table('sms')->insert([ + 'code'=>$code, + 'phone'=>$phoneNumber, + 'status'=>0, + 'lifespan'=>$this->Lifespan, + 'end_time'=>date('Y-m-d H:i:s', $end_time) + ]); + if($in){ + $params = [$code,(string)$this->Lifespan]; + $ss= $service->send($phoneNumber, $params); + + return \Yz::Return(true,'短信验证码发送成功'); + } + + + } + //校验短信验证码 + public function CheckCode($phone,$code) + { + $nowtime=date('Y-m-d H:i:s'); + $cha=DB::table('sms')->where(['phone'=>$phone,'code'=>$code,'status'=>0,['end_time','>',$nowtime]])->first(); + if(!!$cha){ + $u=DB::table('sms')->where(['id'=>$cha->id])->update([ + 'status'=>1 + ]); + if($u){ + return true; + } + }else{ + return false; + } + } + + // 生成随机验证码 + function generateCode($length = 4) { + $characters = '0123456789'; + $code = ''; + for ($i = 0; $i < $length; $i++) { + $code .= $characters[rand(0, strlen($characters) - 1)]; + } + return $code; + } +} diff --git a/Laravel/app/Services/TencentSmsApiService.php b/Laravel/app/Services/TencentSmsApiService.php new file mode 100644 index 0000000..cb9c3f6 --- /dev/null +++ b/Laravel/app/Services/TencentSmsApiService.php @@ -0,0 +1,90 @@ +secretId ="AKIDvxuqiU3OYbR3RcZJrBIDuOegU5YxEQWa"; + $this->secretKey = "xnUyGK9lAnHYcS3SecOyLi2GOOOH4h7K"; + $this->sdkAppId = "1401058974"; + $this->signName ="秦皇岛安尔然"; + $this->templateId = "2564483"; + } + + public function send(string $phoneNumber, array $params = []) + { + $action = 'SendSms'; + $timestamp = time(); + $date = gmdate('Y-m-d', $timestamp); + + // 构造请求体 + $body = [ + 'PhoneNumberSet' => [$phoneNumber], + 'SmsSdkAppId' => $this->sdkAppId, + 'SignName' => $this->signName, + 'TemplateId' => $this->templateId, + ]; + + if (!empty($params)) { + $body['TemplateParamSet'] = $params; + } + + $payload = json_encode($body, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + +// Canonical Request + $canonicalUri = '/'; + $canonicalQueryString = ''; + $canonicalHeaders = "content-type:application/json; charset=utf-8\nhost:{$this->host}\n"; + $signedHeaders = 'content-type;host'; + $hashedPayload = hash('sha256', $payload); + $canonicalRequest = "POST\n{$canonicalUri}\n{$canonicalQueryString}\n{$canonicalHeaders}\n{$signedHeaders}\n{$hashedPayload}"; + +// String to Sign + $algorithm = 'TC3-HMAC-SHA256'; + $date = gmdate('Y-m-d', $timestamp); + $credentialScope = "{$date}/{$this->service}/tc3_request"; + $hashedCanonicalRequest = hash('sha256', $canonicalRequest); + $stringToSign = "{$algorithm}\n{$timestamp}\n{$credentialScope}\n{$hashedCanonicalRequest}"; + +// Signature + $kSecret = 'TC3' . $this->secretKey; + $kDate = hash_hmac('sha256', $date, $kSecret, true); + $kService = hash_hmac('sha256', $this->service, $kDate, true); + $kSigning = hash_hmac('sha256', 'tc3_request', $kService, true); + $signature = hash_hmac('sha256', $stringToSign, $kSigning, true); + $signature = bin2hex($signature); // 转为小写 hex 字符串! + +// Authorization + $authorization = "{$algorithm} Credential={$this->secretId}/{$credentialScope}, SignedHeaders={$signedHeaders}, Signature={$signature}"; + +// 发送请求:必须用 $payload 字符串,不能传数组! + $response = Http::withHeaders([ + 'Authorization' => $authorization, + 'Content-Type' => 'application/json; charset=utf-8', + 'Host' => $this->host, + 'X-TC-Action' => $action, + 'X-TC-Timestamp' => $timestamp, + 'X-TC-Version' => $this->version, + 'X-TC-Region' => $this->region, + ])->withBody($payload, 'application/json; charset=utf-8') + ->post("https://{$this->endpoint}"); + + return $response->json(); + } +} diff --git a/Laravel/composer.json b/Laravel/composer.json index 2468926..ca7f03d 100644 --- a/Laravel/composer.json +++ b/Laravel/composer.json @@ -11,7 +11,8 @@ "intervention/image": "^2.7", "laravel/framework": "^8.75", "laravel/sanctum": "^2.11", - "laravel/tinker": "^2.5" + "laravel/tinker": "^2.5", + "tencentcloud/tencentcloud-sdk-php": "^3.0" }, "require-dev": { "facade/ignition": "^2.5", diff --git a/Laravel/composer.lock b/Laravel/composer.lock index 38ff5f8..09a06dc 100644 --- a/Laravel/composer.lock +++ b/Laravel/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1294fb7cbbb3f3211351829a6a4deedb", + "content-hash": "0c0f90884756722f08429ef2724c6fae", "packages": [ { "name": "asm89/stack-cors", @@ -5697,6 +5697,56 @@ ], "time": "2023-07-13T07:32:46+00:00" }, + { + "name": "tencentcloud/tencentcloud-sdk-php", + "version": "3.0.1497", + "source": { + "type": "git", + "url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git", + "reference": "63691e7e57062726c81e5c05913cd5d67da8ae9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/63691e7e57062726c81e5c05913cd5d67da8ae9d", + "reference": "63691e7e57062726c81e5c05913cd5d67da8ae9d", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "TencentCloud\\": "./src/TencentCloud" + }, + "classmap": [ + "src/QcloudApi/QcloudApi.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "coolli", + "email": "tencentcloudapi@tencent.com", + "homepage": "https://cloud.tencent.com/document/sdk/PHP", + "role": "Developer" + } + ], + "description": "TencentCloudApi php sdk", + "homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php", + "support": { + "issues": "https://github.com/TencentCloud/tencentcloud-sdk-php/issues", + "source": "https://github.com/TencentCloud/tencentcloud-sdk-php/tree/3.0.1497" + }, + "time": "2025-12-01T20:09:08+00:00" + }, { "name": "tijsverkoyen/css-to-inline-styles", "version": "2.2.6", diff --git a/xiaochengxu/manifest.json b/xiaochengxu/manifest.json index 60c5c87..a732a4d 100644 --- a/xiaochengxu/manifest.json +++ b/xiaochengxu/manifest.json @@ -50,7 +50,7 @@ /* 快应用特有相关 */ "mp-weixin" : { /* 小程序特有相关 */ - "appid" : "wx9ba939d2590a8103", + "appid" : "wx166d139c3183e1e0", "setting" : { "urlCheck" : false }, diff --git a/xiaochengxu/pages/index/index.vue b/xiaochengxu/pages/index/index.vue index bbcfdd3..2d18afe 100644 --- a/xiaochengxu/pages/index/index.vue +++ b/xiaochengxu/pages/index/index.vue @@ -49,7 +49,7 @@ const handleLogin = async () => { try { const res = await wx.login() if (res.code) { - console.log(res.code) + Login({ code: res.code }).then(res => { if(res.status){ uni.setStorageSync("openid",res.data.openid) diff --git a/xiaochengxu/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map b/xiaochengxu/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map index 3560b25..db54e0a 100644 --- a/xiaochengxu/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map +++ b/xiaochengxu/unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["pages/index/index.vue","../../../../../soft/安装包/HBuilderX.3.8.12.20230817/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvaW5kZXgvaW5kZXgudnVl"],"sourcesContent":["\n\n\n\n","import MiniProgramPage from 'D:/Code/lanke/other/huisuo/xiaochengxu/pages/index/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni","wx","Login","res","onLoad"],"mappings":";;;;;;;AAqCA,UAAM,WAAW,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAExD,UAAM,YAAY,MAAM;AACvBA,oBAAAA,MAAI,WAAW,EAAE,KAAK,eAAc,CAAE;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM;AACpBA,oBAAAA,MAAI,WAAW,EAAE,KAAK,iBAAgB,CAAE;AAAA,IACzC;AAEA,UAAM,cAAc,YAAY;AAC/B,UAAI;AACH,cAAM,MAAM,MAAMC,cAAE,KAAC,MAAO;AAC5B,YAAI,IAAI,MAAM;AACbD,wBAAAA,MAAA,MAAA,OAAA,+BAAY,IAAI,IAAI;AACpBE,oBAAK,MAAC,EAAE,MAAM,IAAI,KAAI,CAAE,EAAE,KAAK,CAAAC,SAAO;AACrC,gBAAGA,KAAI,QAAO;AACbH,4BAAAA,MAAI,eAAe,UAASG,KAAI,KAAK,MAAM;AAC3C,kBAAKA,KAAI,KAAK,WAAW,QAAQA,KAAI,KAAK,QAAQ,MAAM;AACvDH,8BAAG,MAAC,WAAW,EAAE,KAAK,mBAAmBG,KAAI,KAAK,KAAK;AAAA,cACvD;AAAA,YACD;AAAA,UAEL,CAAI;AAAA,QACJ,OAAS;AACNH,wBAAc,MAAA,MAAA,SAAA,+BAAA,QAAQ,IAAI,MAAM;AAAA,QAChC;AAAA,MACD,SAAQ,OAAO;AACfA,sBAAAA,MAAA,MAAA,SAAA,+BAAc,QAAQ,KAAK;AAAA,MAC3B;AAAA,IACF;AAEAI,kBAAAA,OAAO,MAAM;AACZ,kBAAa;AAAA,IACd,CAAC;;;;;;;;;;;;;;;;;ACtED,GAAG,WAAW,eAAe;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["pages/index/index.vue","../../../../../soft/安装包/HBuilderX.3.8.12.20230817/HBuilderX/plugins/uniapp-cli-vite/uniPage:/cGFnZXMvaW5kZXgvaW5kZXgudnVl"],"sourcesContent":["\n\n\n\n","import MiniProgramPage from 'D:/Code/lanke/other/huisuo/xiaochengxu/pages/index/index.vue'\nwx.createPage(MiniProgramPage)"],"names":["uni","wx","Login","res","onLoad"],"mappings":";;;;;;;AAqCA,UAAM,WAAW,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,MAAM;AAExD,UAAM,YAAY,MAAM;AACvBA,oBAAAA,MAAI,WAAW,EAAE,KAAK,eAAc,CAAE;AAAA,IACvC;AAEA,UAAM,SAAS,MAAM;AACpBA,oBAAAA,MAAI,WAAW,EAAE,KAAK,iBAAgB,CAAE;AAAA,IACzC;AAEA,UAAM,cAAc,YAAY;AAC/B,UAAI;AACH,cAAM,MAAM,MAAMC,cAAE,KAAC,MAAO;AAC5B,YAAI,IAAI,MAAM;AAEbC,oBAAK,MAAC,EAAE,MAAM,IAAI,KAAI,CAAE,EAAE,KAAK,CAAAC,SAAO;AACrC,gBAAGA,KAAI,QAAO;AACbH,4BAAAA,MAAI,eAAe,UAASG,KAAI,KAAK,MAAM;AAC3C,kBAAKA,KAAI,KAAK,WAAW,QAAQA,KAAI,KAAK,QAAQ,MAAM;AACvDH,8BAAG,MAAC,WAAW,EAAE,KAAK,mBAAmBG,KAAI,KAAK,KAAK;AAAA,cACvD;AAAA,YACD;AAAA,UAEL,CAAI;AAAA,QACJ,OAAS;AACNH,wBAAc,MAAA,MAAA,SAAA,+BAAA,QAAQ,IAAI,MAAM;AAAA,QAChC;AAAA,MACD,SAAQ,OAAO;AACfA,sBAAAA,MAAA,MAAA,SAAA,+BAAc,QAAQ,KAAK;AAAA,MAC3B;AAAA,IACF;AAEAI,kBAAAA,OAAO,MAAM;AACZ,kBAAa;AAAA,IACd,CAAC;;;;;;;;;;;;;;;;;ACtED,GAAG,WAAW,eAAe;"} \ No newline at end of file diff --git a/xiaochengxu/unpackage/dist/dev/mp-weixin/common/vendor.js b/xiaochengxu/unpackage/dist/dev/mp-weixin/common/vendor.js index ab07de9..e6cdb1a 100644 --- a/xiaochengxu/unpackage/dist/dev/mp-weixin/common/vendor.js +++ b/xiaochengxu/unpackage/dist/dev/mp-weixin/common/vendor.js @@ -6916,9 +6916,9 @@ function isConsoleWritable() { return isWritable; } function initRuntimeSocketService() { - const hosts = "192.168.0.101,127.0.0.1"; + const hosts = "192.168.0.103,127.0.0.1"; const port = "8090"; - const id = "mp-weixin__KJ8Nq"; + const id = "mp-weixin_1frMf2"; const lazy = typeof swan !== "undefined"; let restoreError = lazy ? () => { } : initOnError(); diff --git a/xiaochengxu/unpackage/dist/dev/mp-weixin/pages/index/index.js b/xiaochengxu/unpackage/dist/dev/mp-weixin/pages/index/index.js index 77805cd..539222b 100644 --- a/xiaochengxu/unpackage/dist/dev/mp-weixin/pages/index/index.js +++ b/xiaochengxu/unpackage/dist/dev/mp-weixin/pages/index/index.js @@ -16,7 +16,6 @@ const _sfc_main = { try { const res = await common_vendor.wx$1.login(); if (res.code) { - common_vendor.index.__f__("log", "at pages/index/index.vue:52", res.code); api_index.Login({ code: res.code }).then((res2) => { if (res2.status) { common_vendor.index.setStorageSync("openid", res2.data.openid); diff --git a/xiaochengxu/unpackage/dist/dev/mp-weixin/project.config.json b/xiaochengxu/unpackage/dist/dev/mp-weixin/project.config.json index f9d4dfe..fb2cb31 100644 --- a/xiaochengxu/unpackage/dist/dev/mp-weixin/project.config.json +++ b/xiaochengxu/unpackage/dist/dev/mp-weixin/project.config.json @@ -13,7 +13,7 @@ }, "compileType": "miniprogram", "libVersion": "", - "appid": "wx9ba939d2590a8103", + "appid": "wx166d139c3183e1e0", "projectname": "xiaochengxu", "condition": { "search": {