一.开通阿里大鱼短信服务
以PHP版为例
1.本地项目中安装安装PHP SDK
(1)composer安装:
https://help.aliyun.com/document_detail/112186.html?spm=a2c4g.11174283.6.635.37eb2c42jFVxfS
composer require alibabacloud/client
(2)使用OpenAPI Explorer来生成相关API的Demo
OpenAPI Explorer地址:
https://api.aliyun.com/?spm=a2c4g.11186623.2.13.6a294e6afatgeU#/?product=Dysmsapi&lang=PHP
2.阿里大鱼签名和SMS码获取
二.阿里大鱼验证码使用
1.获取的代码格式如下并不能直接使用,而是需要进行修改
<?phpuse AlibabaCloud\Client\AlibabaCloud;use AlibabaCloud\Client\Exception\ClientException;use AlibabaCloud\Client\Exception\ServerException;// Download:https://github.com/aliyun/openapi-sdk-php// Usage:https://github.com/aliyun/openapi-sdk-php/blob/master/README.mdAlibabaCloud::accessKeyClient('<accessKeyId>', '<accessSecret>')->regionId('cn-hangzhou')->asDefaultClient();try {$result = AlibabaCloud::rpc()->product('Dysmsapi')// ->scheme('https') // https | http->version('2017-05-25')->action('SendSms')->method('POST')->host('dysmsapi.aliyuncs.com')->options(['query' => ['RegionId' => "cn-hangzhou",'PhoneNumbers' => "手机号",'SignName' => "签名",'TemplateCode' => "签名SMS码",'TemplateParam' => "验证码格式{\"code\":1111}",],])->request();print_r($result->toArray());} catch (ClientException $e) {echo $e->getErrorMessage() . PHP_EOL;} catch (ServerException $e) {echo $e->getErrorMessage() . PHP_EOL;}
2.单独创建一个控制器文件,封装修改阿里大鱼
<?phpnamespace app\common\controller;// 引入阿里sdkuse AlibabaCloud\Client\AlibabaCloud;use AlibabaCloud\Client\Exception\ClientException ;use AlibabaCloud\Client\Exception\ServerException ;// 引入异常类use app\lib\exception\BaseException;class AlismsController {static public function SendSMS($phone,$code){AlibabaCloud::accessKeyClient(config('api.aliSMS.accessKeyId'),config('api.aliSMS.accessSecret'))->regionId(config('api.aliSMS.regionId'))->asDefaultClient();try {//定义自己的手机号码,签名,SMS码,验证码格式$option=['query' => ['RegionId' => config('api.aliSMS.regionId'),'PhoneNumbers' => $phone,'SignName' =>config('api.aliSMS.SignName'),'TemplateCode' =>config('api.aliSMS.TemplateCode'),'TemplateParam' =>'{"code":"'.$code.'"}',],];$result = AlibabaCloud::rpc()->product(config('api.aliSMS.product'))// ->scheme('https') // https | http->version(config('api.aliSMS.version'))->action('SendSms')->method('POST')->host('dysmsapi.aliyuncs.com')->options($option)->request();// print_r($result->toArray());//返回数据return $result->toArray();} catch (ClientException $e) {echo $e->getErrorMessage() . PHP_EOL;//使用封装的异常基类弹出错误throw new BaseException(['code'=>200,'msg'=>$e->getErrorMessage(),'errorCode'=>30000]);} catch (ServerException $e) {throw new BaseException(['code'=>200,'msg'=>$e->getErrorMessage(),'errorCode'=>30000]);}}}
3.将配置信息提取到单独的配置文件中,便于后期维护
4.模型中引用
<?phpnamespace app\common\model;use think\Model;// 引入TP5的缓存类use think\facade\Cache;// 引入异常基类use app\lib\exception\BaseException;//引入阿里大鱼验证码类use app\common\controller\AliSMSController;class User extends Model{//发送验证码public function sendCode(){// 获取用户提交手机号码$phone = request()->param('phone');// 判断是否已经发送过//如果可以从缓存中读取手机验证码if(Cache::get($phone)) throw new BaseException(['code'=>200,'msg'=>'你操作得太快了','errorCode'=>30001]); //生成四位数字的验证码$code = random_int(1000,9999);//使用阿里大鱼发送验证码// 发送验证码$res = AlismsController::SendSMS($phone,$code);//发送成功 写入缓存if($res['Code']=='OK') return Cache::set($phone,$code,config('api.aliSMS.expire'));// 无效号码if($res['Code']=='isv.MOBILE_NUMBER_ILLEGAL') throw new BaseException(['code'=>200,'msg'=>'无效号码','errorCode'=>30002]);// 触发日限制if($res['Code']=='isv.DAY_LIMIT_CONTROL') throw new BaseException(['code'=>200,'msg'=>'今日你已经发送超过限制,改日再来','errorCode'=>30003]);// 发送失败throw new BaseException(['code'=>200,'msg'=>'发送失败','errorCode'=>30004]);}}