最近做的项目需要用手机号注册账号,之前没有对接过发送短信,今天研究了一下, 写下一贴以做记录。
项目框架用thinkphp6,短信选择阿里云的短信服务。阿里云提供了两种方式安装sdk,这里选择用composer
官方文档:
composer直接安装
1.使用composer安装sdk
我的开发环境是windows系统,已经安装过composer,本篇不再讨论如何安装。
composer require alibabacloud/sdk
等待安装好就行了:
2. 新建send_sms方法
common.php里新建send_cms:
/** * 发送短信 * @param $AccessKeyId * @param $Secret * @param $params * @return bool * @throws ClientException */function send_sms ($AccessKeyId, $Secret, $params) {if (empty($params['phone'])) {return false;}// 创建客户端AlibabaCloud::accessKeyClient($AccessKeyId, $Secret)->regionId('cn-hangzhou')->asDefaultClient();try {$result = AlibabaCloud::rpc()->product('Dysmsapi')->version('2017-05-25')->action('SendSms')->host('dysmsapi.aliyuncs.com')->options([// 这里的参数可以在openAPI Explorer里面查看'query' => ['RigionId' => 'cn_hangzhou','PhoneNumbers' => $params['phone'],// 输入的手机号'SignName' => $params['sign'],// 签名信息'TemplateCode' => $params['code'],// 短信模板id'TemplateParam' => $params['param']// 可选,模板变量值,json格式]])->request();//print_r($result->toArray());return $result->toArray();} catch (ClientException $e) {echo $e->getErrorMessage() . PHP_EOL;} catch (ServerException $e) {echo $e->getErrorMessage() . PHP_EOL;}}
创建验证手机号码方法:
/** * 校验手机号码 * @param $phone * @return bool */function validatePhone ($phone) {if(!preg_match("/^1[34578]\d{9}$/", $phone)){return false;}return true;}
3. 定义配置信息
config目录下新建alisms.php
<?php/** * Created by PhpStorm. * User: Administrator * Date: 2020/11/25 * Time: 10:23 */return [// 填入自己的设置项'AccessKeyId' => "",'Secret'=> "",'SignName'=> "",'TemplateCode'=> ""];
4. 控制器中调用方法
/** * 发送手机验证码 * @return string * @throws \AlibabaCloud\Client\Exception\ClientException */public function registerBySms () {$phone= input('post.phone');if (empty($phone) || !validatePhone($phone)) {return json_encode(['code'=>100,'msg'=>'请输入正确的手机号!']);}$sign = Config::get('alisms.SignName');$code = Config::get('alisms.TemplateCode');$ak = Config::get('alisms.AccessKeyId');$sk = Config::get('alisms.Secret');// 请求的参数$params = ['phone' => $phone,'sign'=> $sign,'code'=> $code,'param' => json_encode(['name' => "测试名称",'number' => 233])];$res = send_sms($ak, $sk, $params);if ($res['Code'] === 'OK') {return json_encode(['code'=>200,'msg'=>"验证码发送成功~"]);}}
就可以啦