钱包农场 API 开发手记 二 SMS
2018-04-02 00:00
567 查看
摘要: 短信验证码接口
config/app.php 在 providers 中增加
tinker测试
生成6位随机码
用 easySms 发送短信到用户手机
发送成功后,生成一个 key,在缓存中存储这个 key 对应的手机以及验证码,10分钟过期
将
除了正式环境外,默认不真实发送短信
config/api.php
routes/api.php
安装 easy-sms
.env# aliyun sms ALI_ACCESS_KEY_ID=LTAIOJfkWhaYYtWD ALI_ACCESS_KEY_SECRET=W6ytWrlgmx4xCDuBN2jbusD1ji3QaJ ALI_SIGN_NAME=洪荒社
composer require "overtrue/easy-sms" touch config/easysms.php
<?php return [ // HTTP 请求的超时时间(秒) 'timeout' => 5.0, // 默认发送配置 'default' => [ // 网关调用策略,默认:顺序调用 'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class, // 默认可用的发送网关 'gateways' => [ 'aliyun', ], ], // 可用的网关配置 'gateways' => [ 'errorlog' => [ 'file' => '/tmp/easy-sms.log', ], 'aliyun' => [ 'access_key_id' => env('ALI_ACCESS_KEY_ID'), 'access_key_secret' => env('ALI_ACCESS_KEY_SECRET'), 'sign_name' => env('ALI_SIGN_NAME'), ], ], ];
php artisan make:provider EasySmsServiceProvider
public function register() { $this->app->singleton(EasySms::class, function ($app) { return new EasySms(config('easysms')); }); $this->app->alias(EasySms::class, 'easysms'); }
config/app.php 在 providers 中增加
App\Providers\EasySmsServiceProvider::class
\App\Providers\EasySmsServiceProvider::class,
tinker测试
php artisan tinker
$sms = app('easysms'); try { $sms->send(18665182079, [ 'content' => '您的验证码为: 6666', 'template' => 'SMS_105440011', 'data' => [ 'code' => 6666 ], ]); } catch (\GuzzleHttp\Exception\ClientException $exception) { $response = $exception->getResponse(); $result = json_decode($response->getBody()->getContents(), true); dd($result); }
路由
routes/api.php$api = app('Dingo\Api\Routing\Router'); $api->version('v1', [ 'namespace' => 'App\Http\Controllers\Api\V1' ], function($api) { // 短信验证码 $api->post('sms', 'SmsController@store') ->name('api.sms.store'); });
请求验证类
php artisan make:request Api/SmsRequest
public function rules() { return [ 'cellphone' => 'required|regex:/^1[3456789]\d{9}$/|unique:users', 'type' => 'required', ]; }
控制器
php artisan make:controller Api/V1/SmsController
生成6位随机码
用 easySms 发送短信到用户手机
发送成功后,生成一个 key,在缓存中存储这个 key 对应的手机以及验证码,10分钟过期
将
key以及
过期时间返回给客户端
除了正式环境外,默认不真实发送短信
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Requests\Api\SmsRequest; use GuzzleHttp\Exception\ClientException; use Illuminate\Support\Facades\Cache; use Overtrue\EasySms\EasySms; /** * 短信服务控制器 * * Class SmsController * @package App\Http\Controllers\Api\V1 */ class SmsController extends Controller { public function store(SmsRequest $request, EasySms $easySms) { $cellphone = $request->cellphone; if(!app()->environment('produ 3ff0 ction')) { $code = '666666'; } else { // 生成6位随机数,左侧补0 $code = str_pad(random_int(1, 999999), 6, 0, STR_PAD_LEFT); try { $result = $easySms->send($cellphone, [ 'content' => '您的验证码为: '. $code, 'template' => 'SMS_105440011', 'data' => [ 'code' => $code ], ]); } catch (ClientException $exception) { $response = $exception->getResponse(); $result = json_decode($response->getBody()->getContents(), true); return $this->response->errorInternal($result['msg'] ?? '短信发送异常'); } } // 缓存验证码 10分钟过期 $key = 'verificationCode_'. str_random(15); $expiredAt = now()->addMinutes(10); Cache::put($key, ['phone' => $cellphone, 'code' => $code], $expiredAt); return $this->response->array([ 'key' => $key, 'expired_at' => $expiredAt->toDateTimeString(), ])->setStatusCode(201); } }
节流处理
.env# api.throttle 中间件 RATE_LIMITS_EXPIRES=1 RATE_LIMITS=60 SIGN_RATE_LIMITS_EXPIRES=1 SIGN_RATE_LIMITS=10
config/api.php
/* * 接口频率限制 */ 'rate_limits' => [ // 访问频率限制,次数/分钟 'access' => [ 'expires' => env('RATE_LIMITS_EXPIRES', 1), 'limit' => env('RATE_LIMITS', 60), ], // 登录相关,次数/分钟 'sign' => [ 'expires' => env('SIGN_RATE_LIMITS_EXPIRES', 1), 'limit' => env('SIGN_RATE_LIMITS', 10), ], ],
routes/api.php
php artisan make:controller Api/V1/SmsController
相关文章推荐
- 钱包农场 API 开发手记 四 JWT
- 钱包农场 API 开发手记 三 微信登录
- 钱包农场 API 开发手记 七 绑定手机
- 钱包农场 API 开发手记 六 更新用户信息
- 钱包农场 API 开发手记 十二 文章
- 钱包农场 API 开发手记 八 土豆
- 钱包农场 API 开发手记 十一 订单
- 钱包农场 API 开发手记 十 商品
- 钱包农场 API 开发手记 九 金豆
- 钱包农场 API 开发手记 一 开篇
- 钱包农场 API 开发手记 十三 收货地址
- 微信小程序开发手记之六:API
- 关于上一篇日志《TWS API 开发手记——连接到TWS平台》的修正
- TWS API 开发手记——连接到TWS平台
- WO+开放平台:API调用开发手记(话费计费接口2.0)
- WO+开放平台:API调用开发手记(话费计费接口2.0)
- WO+开放平台:API调用开发手记(关于签名字段)
- videojs 视频开发API
- aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云2/2】
- 开发手记---分页查询