前因
温馨提醒:阅读本文需要8分钟
半藏商城之前的登录只是普通的手机号,密码,验证码进行登录,并不支持手机验证码免密登录,刘苏墨(感谢哈)建议我加入手机验证码直接登录功能,正好有这个实力,安排上了。接下来分享一下我的手机短信验证码实现登录的代码实现流程。
开通阿里云的短信服务
首先需要在阿里云的控制台开通阿里云的短信服务,个人的话每条短信的价格是0.045元(不贵,冲10元够用好久了)。开通短信服务后,还需要申请短信的模板和签名等信息(会有客服审核,不成功的话会提示你怎么改,这个必须申请,代码里会用到)。最重要的一步是需要给accessKey赋予短信的权限(必须!本节内容不涉及代码,不过多讲解,百度有详细的开通教程。嘿嘿,代码我也不会过多讲解,主要是分享流程以及踩过的坑,因为很多人想弄,但是不知道从那一步开始弄,代码是这里面最简单的东西)。
Maven引包
首先进行在pom.xml中进行引包,还在为引哪个版本的包而困扰的同学推荐这个Maven在线查找依赖的网站,想用什么输入搜索,复制过来就可以了。
<!-- 阿里短信平台-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
配置application.properties
我喜欢用application.properties,有的人喜欢用yml的,我感觉这个格式看着比较清晰,一行一行的,个人习惯哈。
#springboot集成短信
#访问阿里云API的验证
sms.accessKeyId=你的accessKeyId
#访问阿里云API的验证
sms.accessKeySecret=你的accessKeySecret
#阿里云云通信短信API产品
sms.product=Dysmsapi
#产品域名
sms.domain=dysmsapi.aliyuncs.com
#签名
sms.signName=半藏商城
#发送验证码模版CODE
sms.templateCode=SMS_185843228
编写业务层接口代码
/**
* @author 皓宇QAQ
* @qq交流群 951485783
* @email 2469653218@qq.com
* @link https://github.com/Tianhaoy/hanzomall
* 2020年3月17日17:18:31
* @发送短信接口
*/
public interface SmsService {
/**
* 发送短信接口
* @param phoneNumber
* @param randomCode
* @return
*/
boolean sendSms(String phoneNumber, String randomCode);
}
编写业务层接口实现类代码
/**
* @author 皓宇QAQ
* @qq交流群 951485783
* @email 2469653218@qq.com
* @link https://github.com/Tianhaoy/hanzomall
* 2020年3月17日17:18:22
* @发送短信接口实现
*/
@Slf4j
@Service
public class SmsServiceImpl implements SmsService {
@Value("${sms.accessKeyId}")
private String accessKeyId;
@Value("${sms.accessKeySecret}")
private String accessKeySecret;
@Value("${sms.product}")
private String product;
@Value("${sms.domain}")
private String domain;
@Value("${sms.signName}")
private String signName;
@Value("${sms.templateCode}")
private String templateCode;
@Override
public boolean sendSms(String phoneNumber, String randomCode) {
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain(domain);
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", phoneNumber);
request.putQueryParameter("SignName", "半藏商城");//直接取signName就会提示签名不合法 这样写就可以发送短信
request.putQueryParameter("TemplateCode", templateCode);
JSONObject object = new JSONObject();
try {
object.put("code",randomCode);
} catch (JSONException e) {
e.printStackTrace();
}
String templateParam =object.toString();
request.putQueryParameter("TemplateParam", templateParam);
try {
//请求失败这里会抛ClientException异常
CommonResponse response = client.getCommonResponse(request);
log.info("阿里云短信服务返回消息:"+response.getData());
// 使用alibaba的fastjson
Map<String, Object> map= JSON.parseObject(response.getData());
if (("OK").equals(map.get("Code"))){
return true;
}else{
return false;
}
} catch (ClientException e) {
e.printStackTrace();
log.error(e.getMessage());
}
return false;
}
}
编写Controller层代码
/**
* @author 皓宇QAQ
* @qq交流群 951485783
* @email 2469653218@qq.com
* @link https://github.com/Tianhaoy/hanzomall
* @发送短信
*/
@Slf4j
@RestController
public class SmsSendController {
@Resource
private SmsService smsService;
@RequestMapping("/sendCodeSms/{phoneNumber}")
public Result SmsSendKaptcha(@PathVariable("phoneNumber") String phoneNumber, HttpSession httpSession) {
//先验证手机号是否符合规则
if (PhoneUtil.confPhone(phoneNumber)){
try {
//生成6位随机码
String randomCode = EmailCodeUtils.getRandomCode();
boolean sign = smsService.sendSms(phoneNumber,randomCode);
if (sign){
//发送成功 将随机验证码放到session中
log.info("发送短信成功");
httpSession.setAttribute(Constants.RANDOM_CODE,randomCode);
}else {
return ResultGenerator.genFailResult("服务怠机,请稍后重试");
}
}catch (Exception e){
e.printStackTrace();
log.error("发送短信失败"+e.getMessage());
return ResultGenerator.genFailResult("服务怠机,请稍后重试");
}
}else {
return ResultGenerator.genFailResult("手机号不符合规则,请重新输入");
}
return ResultGenerator.genSuccessResult();
}
}
小结
到此为止,整个发送短信验证码的流程就介绍完毕了,知识只有分享出来才有价值。如果有问题的话,可以在关于我的页面,通过我的邮箱联系我进行探讨。