记录SpringBoot项目接入使用阿里云短信验证码服务

1. 注册阿里云账号,并实名认证

  网址:https://www.aliyun.com/

2. 创建AccessKey

,用小本本记下AccessKey IDAccessKey Secret,它们是你访问阿里云 API 的密钥,具有该账户完全的权限

 

3. 访问阿里云短信服务

  3.1 链接:https://www.aliyun.com/product/sms?spm=5176.19720258.J_9220772140.58.15e32c4a5yRc1L

 

  3.2 选择想要开通的短信套餐,当然也可以先免费试用

 

   3.2 在免费试用列表找到 [短信免费使用套餐包]

 

 

  3.4 选择0元试用,订单支付完毕后,访问短信服务控制台

 

  3.5 配置短信签名模板,签名是指短信内容前使用“【】”的内容,而模板是指具体内容,代码中需要用到的是签名模板CODE,模板中的${code}表示需要填充的验证码。填写完毕提交审核,快的话1-2个小时。

 

  3.6 接着可以打开OpenAPI看使用示例,需要替换的参数有:手机号码、签名、模板、验证码。

 

4. 项目中使用

 

  4.1 pom.xml中加入依赖:

1 <dependency>
2   <groupId>com.aliyun</groupId>
3   <artifactId>aliyun-java-sdk-core</artifactId>
4   <version>4.5.3</version>
5 </dependency>

  

  4.2 新建类:SendSms.java

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.zxin.dev.pojo.Constant;

public class SendSms {
public static void send(String signName, String templateCode, String phone, String code) {
// 填写自己阿里云账号的AccessKey ID和AccessKey Secret, regionId为cn-hangzhou
DefaultProfile profile = DefaultProfile.getProfile(Constant.REGION_ID, Constant.ACCESS_KEY_ID, Constant.ACCESS_SECRET);
IAcsClient client = new DefaultAcsClient(profile);

CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);

// 服务相关的信息,不可修改。
request.setSysDomain("dysmsapi.aliyuncs.com");
request.setSysVersion("2017-05-25");
request.setSysAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");

// 根据需求替换参数
// 短信签名
request.putQueryParameter("SignName", signName);
// 短信模板ID
request.putQueryParameter("TemplateCode", templateCode);
// 目标手机号
request.putQueryParameter("PhoneNumbers", phone);
// 验证码
request.putQueryParameter("TemplateParam", "{\"code\":"+code+"}");
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
}
}

 

  4.3 前端 (vue) 发送验证码和提交表单函数

 1 handleSendVerifyCode() {
 2       const data = {
 3         phone: this.user.phone,
 4         purpose: 'register'
 5       }
 6       sendVerifyCode(data).then(res => {
 7         this.$message({
 8           type: 'success',
 9           message: res.message
10         })
11       })
12     },
13     handleSubmit() {
14       this.loading = true
15       const data = {
16         name: this.user.name,
17         phone: this.user.phone,
18         verifyCode: this.user.verifyCode
19       }
20       register(data).then(res => {
21         this.loading = false
22         this.drawerVisibleUserRegister = false
23         this.$message({
24           type: 'success',
25           message: res.message
26         })
27       })
28     }

  

  4.4 新建静态常量类(非必需),根据自己需求:

 

   4.5 写发送验证码接口和验证注册信息的接口

 1 @PostMapping("sendVerifyCode")
 2     public JSONObject sendVerifyCode(HttpServletRequest request, @RequestBody Map<String, String> params) {
 3         JSONObject resultJson = new JSONObject();
 4         // 自己写的生成6位随机数字字符的方法(注意: 验证码虽然是字符串,但首位也不能为0,否则发出的是5位数。)
 5         String verifyCode = StringUtil.getRandom(6);
 6 
 7         // 在不同的表单发送验证码,使用不同的短信模板
 8         switch (params.get("purpose")){
 9             // 注册
10             case "register" :
11                 SendSms.send(Constant.SIGE_NAME,Constant.TEMPLATE_CODE_REGISTER,params.get("phone"),verifyCode);
12                 break;
13             // 修改密码
14             case "changePassword":
15                 SendSms.send(Constant.SIGE_NAME,Constant.TEMPLATE_CODE_CHANGE_PASSWORD,params.get("phone"),verifyCode);
16                 break;
17         }
18         JSONObject jsonCode = new JSONObject();
19         jsonCode.put("phone", params.get("phone"));
20         jsonCode.put("verifyCode", verifyCode);
21         jsonCode.put("createTime", System.currentTimeMillis());
22         request.getSession().setAttribute("verifyCode", jsonCode);
23         resultJson.put("code", 20000);
24         resultJson.put("message", "短信验证码发送成功");
25         return resultJson;
26     }
 1 @PostMapping("register")
 2     public JSONObject register(HttpSession session, @RequestBody Map<String, String> params) {
 3         String name = params.get("name");
 4         String phone = params.get("phone");
 5         String verifyCode = params.get("verifyCode");
 6         JSONObject resultJson = new JSONObject();
 7         JSONObject sessionVerifyCode = (JSONObject)session.getAttribute("verifyCode");
 8         if (phone.equals(sessionVerifyCode.get("phone")) && verifyCode.equals(sessionVerifyCode.get("verifyCode"))){
 9             resultJson.put("code", 20000);
10             resultJson.put("message", "注册成功");
11         }else{
12             // TODO: 
13             resultJson.put("code", 300);
14             resultJson.put("message", "注册失败,验证码不正确");
15         }
16         return resultJson;
17     }

 

5. 结果展示

 

  5.1 发送验证码(还需要设置超时时间,1分钟内不可重复点击)

  

  5.2 手机收到短信

 

 

  5.3 校验通过

 

  最后:这个示例中还有很多需要改进的,但作为学习接入阿里云短信服务的demo已经足够了,其中还有许多小问题,比如getSession = null等等,查了半天资料,发现是自己搭建的环境有些问题。

  如果这篇博客还有其他问题,欢迎评论指正!

posted @ 2020-12-13 18:46  爱就码上行动  阅读(1134)  评论(0编辑  收藏  举报