基于阿里云平台的短信验证码服务API的使用

第一步:登录阿里云平台

第二步:申请国内文本短信签名

如果是个人作业项目(如作者的签名),可以直接申请测试和学习用的测试签名,该签名的缺点是必须绑定测试手机号,才能向该手机号发送验证码,且测试手机号最多五个。

第三步:申请短信模板

第四步:进入AccessKey管理

第五步:点击开始使用子用户

第六步:创建用户组并创建用户

这一步会得到AccessKey(id,密码)下面会用到

第七步:编写代码

  1. 创建一个springboot工程
  2. 添加maven依赖
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.0</version>
</dependency>
  1. 编写controller代码
   @Controller//跨域使用@CrossOrigin@Api(tags = "短信验证码接口")public class SmsController {@AutowiredStringRedisTemplate stringRedisTemplate;/*** 发送手机验证码* @param phoneNumber 手机号码* @return 1表示成功,0表示失败*/@ApiOperation("发送验证码")@RequestMapping("/sendSms/{phoneNumber}")@ResponseBodypublic String SmsTest(@PathVariable String phoneNumber){//发送短信String result = SendSMSUtil.sendSmsUtil(phoneNumber);if (result == null || !result.equals("OK")) {// 发送不成功return "0";}// 获取验证码int code = SendSMSUtil.getCode();Map<String,Object> map=new HashMap<>();// 将数据存入redismap.put(phoneNumber,code+"");//用phoneNumber来做键,可以做到唯一性stringRedisTemplate.opsForHash().putAll(phoneNumber,map);// 设置redis过期时间,这个时间是秒为单位的,我现在设置5分钟之内有效,过了就会自动删除stringRedisTemplate.expire(phoneNumber, 60*5, TimeUnit.SECONDS);return "OK";}/*** 校验验证码* @param phoneNumber* @param checkSMSCode* @return*/@ApiOperation("校验验证码")@RequestMapping(value = "/checkSMSCode", method = RequestMethod.POST)@ResponseBodypublic String checkSMSCode(String phoneNumber,String checkSMSCode) {// 服务器放入的验证码Map<Object, Object> map=stringRedisTemplate.opsForHash().entries(phoneNumber);String serverCheckCode =(String) map.get(phoneNumber);if (serverCheckCode == null || serverCheckCode.equals("")) {return "CodeError";}// 验证码不匹配if (!checkSMSCode.equals(serverCheckCode)) {return "CodeError";}else {//如果验证成功就删除验证码stringRedisTemplate.opsForHash().delete(phoneNumber,phoneNumber);}return "OK";}}

config:

@Configurable
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {//    /**
//     * springboot1.x用这个来管理缓存
//     * 选择redis作为默认缓存工具
//     * @param redisTemplate
//     * @return
//     */
//    @Bean
//    public CacheManager cacheManager(RedisTemplate redisTemplate) {//        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
//        return rcm;
//    }/*** Logger*/private static final Logger lg = LoggerFactory.getLogger(RedisConfiguration.class);@Autowiredprivate JedisConnectionFactory jedisConnectionFactory;@Bean@Overridepublic KeyGenerator keyGenerator() {//  设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存// 使用:进行分割,可以很多显示出层级关系// 这里其实就是new了一个KeyGenerator对象,只是这是lambda表达式的写法,我感觉很好用,大家感兴趣可以去了解下return (target, method, params) -> {StringBuilder sb = new StringBuilder();sb.append(target.getClass().getName());sb.append(":");sb.append(method.getName());for (Object obj : params) {sb.append(":" + String.valueOf(obj));}String rsToUse = String.valueOf(sb);lg.info("自动生成Redis Key -> [{}]", rsToUse);return rsToUse;};}@Bean@Overridepublic CacheManager cacheManager() {// 初始化缓存管理器,在这里我们可以缓存的整体过期时间什么的,我这里默认没有配置lg.info("初始化 -> [{}]", "CacheManager RedisCacheManager Start");RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(jedisConnectionFactory);return builder.build();}@Beanpublic RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {//设置序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置redisTemplateRedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(jedisConnectionFactory);RedisSerializer stringSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringSerializer); // key序列化redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value序列化redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // Hash value序列化redisTemplate.afterPropertiesSet();return redisTemplate;}@Override@Beanpublic CacheErrorHandler errorHandler() {// 异常处理,当Redis发生异常时,打印日志,但是程序正常走lg.info("初始化 -> [{}]", "Redis CacheErrorHandler");CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() {@Overridepublic void handleCacheGetError(RuntimeException e, Cache cache, Object key) {lg.error("Redis occur handleCacheGetError:key -> [{}]", key, e);}@Overridepublic void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {lg.error("Redis occur handleCachePutError:key -> [{}];value -> [{}]", key, value, e);}@Overridepublic void handleCacheEvictError(RuntimeException e, Cache cache, Object key)    {lg.error("Redis occur handleCacheEvictError:key -> [{}]", key, e);}@Overridepublic void handleCacheClearError(RuntimeException e, Cache cache) {lg.error("Redis occur handleCacheClearError:", e);}};return cacheErrorHandler;}/*** 此内部类就是把yml的配置数据,进行读取,创建JedisConnectionFactory和JedisPool,以供外部类初始化缓存管理器使用* 不了解的同学可以去看@ConfigurationProperties和@Value的作用**/@ConfigurationPropertiesclass DataJedisProperties{@Value("${spring.redis.host}")private  String host;@Value("${spring.redis.password}")private  String password;@Value("${spring.redis.port}")private  int port;@Value("${spring.redis.timeout}")private  int timeout;@Value("${spring.redis.jedis.pool.max-idle}")private int maxIdle;@Value("${spring.redis.jedis.pool.max-wait}")private long maxWaitMillis;@BeanJedisConnectionFactory jedisConnectionFactory() {lg.info("Create JedisConnectionFactory successful");JedisConnectionFactory factory = new JedisConnectionFactory();factory.setHostName(host);factory.setPort(port);factory.setTimeout(timeout);factory.setPassword(password);return factory;}@Beanpublic JedisPool redisPoolFactory() {lg.info("JedisPool init successful,host -> [{}];port -> [{}]", host, port);JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(maxIdle);jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);return jedisPool;}}
}

util工具类:

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;/*** 发送短信工具类*/
public class SendSMSUtil {/*** 你的accessKeyId*/private static final String accessKeyId="";/*** 你的accessKeySecret*/private static final String accessKeySecret="";/*** 签名*/private static final String signName="";//签名名称/*** 短信模板*/private static final String templateCode="";//短信模板id/*** 验证码*/private static int code;/*** @Descirption:发送手机验证码* @param phoneNumber:需要发送的手机号码* @return OK表示成功,失败则返回失败消息*/public static String sendSmsUtil(String phoneNumber){//设置超时时间-可自行调整System.setProperty("sun.net.client.defaultConnectTimeout", "10000");System.setProperty("sun.net.client.defaultReadTimeout", "10000");// 初始化ascClient需要的几个参数// 短信API产品名称(短信产品名固定,无需修改)final String product = "Dysmsapi";// 短信API产品域名(接口地址固定,无需修改)final String domain = "dysmsapi.aliyuncs.com";// 初始化ascClient,暂时不支持多region(请勿修改)IClientProfile profile= DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);try {DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);} catch (ClientException e) {e.printStackTrace();}IAcsClient acsClient=new DefaultAcsClient(profile);// 组装请求对象SendSmsRequest request=new SendSmsRequest();//使用post提交request.setMethod(MethodType.POST);// 必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,// 验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”request.setPhoneNumbers(phoneNumber);request.setSignName(signName);// 必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版request.setTemplateCode(templateCode);//随机生成6位验证码code = (int) ((Math.random() * 9 + 1) * 100000);// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为// 友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败request.setTemplateParam("{code:"+code+"}");// 请求失败这里会抛ClientException异常SendSmsResponse sendSmsResponse = null;try {sendSmsResponse = acsClient.getAcsResponse(request);} catch (ClientException e) {e.printStackTrace();return "请求失败";}assert sendSmsResponse.getCode() != null;// 发送不成功if (sendSmsResponse.getCode() == null || !sendSmsResponse.getCode().equals("OK")) {return sendSmsResponse.getMessage();}// 请求成功return "OK";}public static int getCode(){return code;}
}

启动类:

@SpringBootApplication
@ComponentScan(basePackages = "xxxxxxxx")
public class ServiceVcodeApplication {public static void main(String[] args) {SpringApplication.run(ServiceVcodeApplication.class, args);}
}

最后添加测试手机号:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zFPMo9Zx-1685977020060)(file:///C:/Users/hgy04/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg)]

}public static int getCode(){return code;
}

}


启动类:```java
@SpringBootApplication
@ComponentScan(basePackages = "xxxxxxxx")
public class ServiceVcodeApplication {public static void main(String[] args) {SpringApplication.run(ServiceVcodeApplication.class, args);}
}

最后添加测试手机号:

运行启动类进行测试,即可成功!

基于阿里云平台的短信验证码服务API的使用相关推荐

  1. 基于阿里云的手机短信验证码和注册校验逻辑

    基于阿里云的手机短信验证码demo实现 1. 环境依赖 2. 页面表单 html 3. 校验与短信 js 4. 工具类 SmsUtils 5. 资源调用 Servlet 阿里云的短信平台:http:/ ...

  2. node.js实现阿里云配置发送短信验证码

    目录 开始 签名添加 模板添加 测试短信 项目中使用 Core accessKeyId | accessKeySecret params PhoneNumbers SignName TemplateC ...

  3. 使用云函数构建短信验证码服务的案例

    背景 通过手机短信发送验证码,是最普遍.最安全验证用户真实身份的方式.目前,短信验证码广泛应用于用户注册.密码找回.登录保护.身份认证.随机密码.交易确认等应用场景. 原理 短信验证的原理按步骤可分为 ...

  4. JAVA怎么对接第三方短信平台?短信验证码完整API文档

    验证码短信平台的应用场景,一般包括用户注册.登陆账号.忘记密码.登录异常.支付确认等. 一.用户注册 通常我们会在注册时会用到短信验证码,即用户在网站或软件上注册账号时,企业需要通过验证码确认用户身份 ...

  5. Java项目使用阿里云平台发送短信说明

    一.前言 项目上通过阿里云短信平台API发送短信是十分便捷的,主要是其官网使用方便,文档全面完善,因此,本篇文章重点不在于说明如何接入使用.现在各短信平台都加强了审核,导致在服务的申请和使用上存在着很 ...

  6. 秒懂云通信:如何用阿里云平台发短信?

    1.阿里云短信官网在哪里.业务怎么开通? 搜索引擎搜"阿里云"或者直接录入alicloud.com后选择"短信服务". 阿里云短信服务,第一次或者未登录都可以点 ...

  7. 健康管理系统第六天(移动端开发之体检预约_经典五表联查_调用阿里云提供的短信服务进行短信验证码发送)

    一.移动端开发 1.移动端开发方式 随着移动互联网的兴起和手机的普及,目前移动端应用变得愈发重要,成为了各个商家的必争之地.例如,我们可以使用手机购物.支付.打车.玩游戏.订酒店.购票等, 以前只能通 ...

  8. 使用阿里云提供的短信服务发送短信(个人版)

    本人最近需要实现一个注册发短信验证码的功能,找了几家短信服务平台,如腾讯云,云片网等,发现他们都没有提供给用户个人的短信服务权限,申请短信签名等都需要有企业等相关证明,最后找到了阿里云的短信服务平台, ...

  9. 阿里和云之讯短信发送服务

    目录 1 云之讯短信验证码 1.1 创建应用 1.2 创建短信模板 1.3 发送短信api 1.4 编写代码 1.5 编写测试用例 1.6 编写接口服务 2 阿里云短信服务 2.1 申请签名与模板 2 ...

最新文章

  1. chrome弱网_请你进行一下弱网模拟
  2. PAT计算出2~N所有素数
  3. 谷歌发布地图「时光机」:100年前,你家街道长啥样?
  4. CF912D Fishes 期望
  5. SPF Tarjan算法求无向图割点(关节点)入门题
  6. 两圆重叠问题你会求解吗?这个问题的准确答案,德国数学家最近才找到
  7. Typecho给文章设置永久链接
  8. 【Python】青少年蓝桥杯_每日一题_5.15_打印 99 乘法表
  9. 360浏览器打不开qq空间_网页突然打不开其他软件却能上网?怎么解决?
  10. 巧用PowerShell维护Win2008服务器作业
  11. python 逐行读取csv_在R中如何逐行读取CSV文件并将内容识别为正确的数据类型?...
  12. 分享一个数据产品经理的PRD
  13. SAP License:SAP入门教材思考
  14. 中国急性髓系白血病药物市场趋势报告、技术动态创新及市场预测
  15. CF - 1214D
  16. Vue项目中的文件/文件夹命名规范
  17. PPT扩展展示时,PPT展示界面背景色有时候突然变成黑底?如何解决?
  18. C语言逻辑运算符及其表达式
  19. 502 proxy error解决方法_Homebrew安装、卸载、可能的报错及解决方案_Mac
  20. Image Signal Processor

热门文章

  1. 独立开发变现周刊(第31期):如何通过复制别人成功的产品来实现月收入1万美金?...
  2. 具有现实世界效用的 10 大加密项目
  3. vue中使用novnc
  4. 5G:连接 AI 与 IoT 的桥梁
  5. 手机和半导体增长放缓 三星2018年面临艰难挑战
  6. [GIT]如何删除分支
  7. 数组为空数组,判断数组长度不等于0
  8. H-Builder 品优购-购物车的实现
  9. Java数组的三种定义方法
  10. 制作Appstore预览视频并上传