新版阿里云发送短信验证码详解

新版阿里云发送短信验证码详解

一、申请短信服务步骤

首先进入阿里云控制台,点击左侧产品与服务,找到短信服务。

第一次进入会有新手引导,这里主要介绍一下大致步骤和易错点

申请短信签名和模板

短信签名一般是企业或者组织名的简写,主要是告知收信人自己是谁。一般体现在短信的开头,用括号括住。

【Dresults】您的验证码:139267,您正进行身份验证,打死不告诉别人!

模板就是我要发送内容的模板,每条短信共有的部分,将变化的部分抽出作为变量,体现在代码中。注意,短信模板具有类型,且不同类型收费标准不同,这里就先介绍短信验证码

至于模板具体选择,可以自定义也可以使用常用模板库(完全免费的),切记模板要遵守一定的规范。

验证码模板只支持验证码作为变量;变量替换值 if (number.equals("") || number == null) { throw new SysException("没有填写手机号"); } System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化acsClient,暂不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); try { DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); } catch (ClientException e1) { e1.printStackTrace(); } IAcsClient acsClient = new DefaultAcsClient(profile); //随机生成六位验证码 int code = (int) ((Math.random() * 9 + 1) * 100000); //组装请求对象-具体描述见控制台-文档部分内容 SendSmsRequest request = new SendSmsRequest(); //必填:待发送手机号 request.setPhoneNumbers(number); //必填:短信签名-可在短信控制台中找到,你在签名管理里的内容 request.setSignName("填自己的"); //必填:短信模板-可在短信控制台中找到,你模板管理里的模板编号 request.setTemplateCode("填自己的"); //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam("{"code":"" + code + ""}"); //选填-上行短信扩展码(无特殊需求用户请忽略此字段) //request.setSmsUpExtendCode("90997"); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 //request.setOutId("yourOutId"); //hint 此处可能会抛出异常,注意catch SendSmsResponse sendSmsResponse = null; try { sendSmsResponse = acsClient.getAcsResponse(request); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } //获取发送状态 MessageDto messageDto = new MessageDto(code, sendSmsResponse.getCode()); //保存手机验证码至redis中,大家没有用的话可以保存在mysql数据库中 redisRepository.saveMessageCode(number, String.valueOf(code)); log.info(number + ": 发送了一条验证码"); return messageDto; }} 三、验证码应用

这里介绍我对验证码的理解,验证码一般是用在登录或注册处的,为的就是防止机器暴力调用接口,造成资源的浪费。

具体流程是,先按下发送验证码的按钮,这时手机会收到短信。下一步就是我们最初的目的,或是登录或是注册,选项中有一项为输入验证码。输入后,后台会校验手机号和验证码是否对应。所以在发送验证码后,后台要将手机号和验证码的键值对保存起来。保存的地方可以是mysql,也可以是redis。

如果是redis,本身就具备了键值对的对应关系,只需要保存就好。

如果是Mysql,需要我们建表,并加上两列,分别是手机号和验证码。

这里介绍一下redis的代码部分

RedisUtil为工具类,直接接触redis

public class RedisUtil { public static boolean exists(StringRedisTemplate redisTemplate, String key) { return redisTemplate.hasKey(key); } public static void set (StringRedisTemplate redisTemplate, String key, T value) { redisTemplate.opsForValue().set(key, JsonUtil.toJson(value)); } public static T get (StringRedisTemplate redisTemplate, String key, Class clazz) { String value = redisTemplate.opsForValue().get(key); if (null != value) { return JsonUtil.toObject(value, clazz); } return null; } public static void del(StringRedisTemplate redisTemplate, String key) { redisTemplate.delete(key); }}

这个RedisRepository的实现类

里面有一处代码需要注意,RedisKeyTemplate.T_VERIFICATION_CODE,这个在最后的代码块中能发现,是给redis空间命名。相信聪明的大家肯定可以明白的。

RedisUtil.set(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), messageCode); @Componentpublic class RedisRepositoryImpl implements RedisRepository { @Autowired private StringRedisTemplate redisTemplate; /** * 保存手机号和验证码的键值对 * * @param phone * @param messageCode 验证码 */ @Override public void saveMessageCode(String phone, String messageCode) { RedisUtil.set(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), messageCode); } @Override public String selectMessageCodeByPhone(String phone) { return RedisUtil.get(redisTemplate, RedisKeyUtil.buildKey(RedisKeyTemplate.T_VERIFICATION_CODE, phone), String.class); }} public interface RedisRepository { /** * 保存手机号和验证码的键值对 * @param phone * @param messageCode 验证码 */ void saveMessageCode(String phone, String messageCode); /** * 根据key:手机号 查询验证码 * @param phone * @return */ String selectMessageCodeByPhone(String phone);} public class RedisKeyTemplate { /** *记录验证码信息 * 键:Verification_Code:verificationCode * 值:{ verificationCode, phoneNumber } */ public final static String T_VERIFICATION_CODE = "Verification:%s";}

比丘资源网 » 新版阿里云发送短信验证码详解

发表回复

提供最优质的资源集合

立即查看 了解详情