package com.example.demo;
import java.time.LocalDateTime;
public class SmsCode {
private String code;
private LocalDateTime expireTime;
public SmsCode(String code, int expireIn) {
this.code = code;
this.expireTime = LocalDateTime.now().plusSeconds(expireIn);
}
public SmsCode(String code, LocalDateTime expireTime) {
this.code = code;
this.expireTime = expireTime;
}
public boolean isExpire(){
return LocalDateTime.now().isAfter(expireTime);
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public LocalDateTime getExpireTime() {
return expireTime;
}
public void setExpireTime(LocalDateTime expireTime) {
this.expireTime = expireTime;
}
}
import org.springframework.web.context.request.ServletWebRequest;
public interface ValidateCodeGenerator {
ValidateCode generate(ServletWebRequest request);
}
import org.apache.commons.lang.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.ServletWebRequest;
import com.imooc.security.core.properties.SecurityProperties;
import com.imooc.security.core.validate.code.ValidateCode;
import com.imooc.security.core.validate.code.ValidateCodeGenerator;
@Component("smsValidateCodeGenerator")
public class SmsCodeGenerator implements ValidateCodeGenerator {
@Autowired
private SecurityProperties securityProperties;
@Override
public ValidateCode generate(ServletWebRequest request) {
String code = RandomStringUtils.randomNumeric(securityProperties.getCode().getSms().getLength());
return new ValidateCode(code, securityProperties.getCode().getSms().getExpireIn());
}
public SecurityProperties getSecurityProperties() {
return securityProperties;
}
public void setSecurityProperties(SecurityProperties securityProperties) {
this.securityProperties = securityProperties;
}
}
package com.example.controller;
import com.example.valicate.SmsCode;
import com.example.valicate.ValidateCode;
import com.example.valicate.ValidateCodeGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Controller
public class ValidateCodeController {
@Autowired
private ValidateCodeGenerator smsCodeGenerator;
@GetMapping("/code/sms")
private void CreateSmsCode(HttpServletRequest request, HttpServletResponse response) throws IOException{
// SmsCode smsCode = smsCodeGenerator.generate(new ServletWebRequest(request));
ValidateCode smsCode = smsCodeGenerator.generate(new ServletWebRequest(request));
}
}
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示报错,先升级基础包版,无法解决可联系技术支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
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.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.yq.model.SmsCode;
import com.yq.vo.ErpSystemConfigVO;
import lombok.extern.slf4j.Slf4j;
/**
* @author: wensm
* @date: 2021/5/29 0029
* @description: TODO
**/
@Slf4j
public class SmsUtils {
// 产品名称:云通信短信API产品,开发者无需替换
static final String product = "Dysmsapi";
// 产品域名,开发者无需替换
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
// static final String accessKeyId = "youaccessKeyId"; // TODO 改这里
static final String accessKeyId = "LTAI5t61GGJVrtQL9GZ5eZCC"; // TODO 改这里
// static final String accessKeySecret = "youaccessKeySecret"; // TODO 改这里
static final String accessKeySecret = "ed9InMof5lPuZXD3aN03GcH3mcqpDD"; // TODO 改这里
public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-heyuan", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-heyuan", "cn-heyuan", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(telephone);
// 必填:短信签名-可在短信控制台中找到
request.setSignName("XX信息"); // TODO 改这里
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode("SMS_217795888"); // TODO 改这里
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
request.setTemplateParam("{\"code\":\"" + code + "\"}");
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId("yourOutId");
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
System.out.println("短信发送成功!");
}else {
System.out.println("短信发送失败!");
}
return sendSmsResponse;
}
public static SendSmsResponse sendSmsCode(ErpSystemConfigVO erpSystemConfigVO, SmsCode smsCode) throws ClientException {
String regionId = erpSystemConfigVO.getRegionId();
String accessId = erpSystemConfigVO.getAccessId();
String accessKey = erpSystemConfigVO.getAccessKey();
String dysmsapi = erpSystemConfigVO.getDysmsApi();
String endpoint = erpSystemConfigVO.getEndpoint();
String signName = erpSystemConfigVO.getSignName();
String sendSms = erpSystemConfigVO.getSendSms();
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile(regionId, accessId, accessKey);
DefaultProfile.addEndpoint(regionId, regionId, dysmsapi, endpoint);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(smsCode.getMobilePhone());
// 必填:短信签名-可在短信控制台中找到
request.setSignName(signName); // TODO 改这里
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(sendSms); // TODO 改这里
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
// SMS_217795312
// 您的验证码${code},该验证码5分钟内有效,请勿泄漏于他人!
// SMS_217416123
// 验证码:${code}您正在找回密码,请不要把验证码泄露给其他人。如非本人操作,可不用理会!
request.setTemplateParam("{\"code\":\"" + smsCode.getCode() + "\"}");
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId("yourOutId");
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
log.info("=======短信发送成功!======");
// System.out.println("短信发送成功!");
}else {
log.info("=======短信发送失败!======");
// System.out.println("短信发送失败!");
}
return sendSmsResponse;
}
public static SendSmsResponse sendPwdSmsCode(ErpSystemConfigVO erpSystemConfigVO, SmsCode smsCode) throws ClientException {
String regionId = erpSystemConfigVO.getRegionId();
String accessId = erpSystemConfigVO.getAccessId();
String accessKey = erpSystemConfigVO.getAccessKey();
String dysmsapi = erpSystemConfigVO.getDysmsApi();
String endpoint = erpSystemConfigVO.getEndpoint();
String signName = erpSystemConfigVO.getSignName();
String sendSms = erpSystemConfigVO.getSendSms();
// 可自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
// 初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile(regionId, accessId, accessKey);
DefaultProfile.addEndpoint(regionId, regionId, dysmsapi, endpoint);
IAcsClient acsClient = new DefaultAcsClient(profile);
// 组装请求对象-具体描述见控制台-文档部分内容
SendSmsRequest request = new SendSmsRequest();
// 必填:待发送手机号
request.setPhoneNumbers(smsCode.getMobilePhone());
// 必填:短信签名-可在短信控制台中找到
request.setSignName(signName); // TODO 改这里
// 必填:短信模板-可在短信控制台中找到
request.setTemplateCode(sendSms); // TODO 改这里
// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为
// request.setTemplateParam("{\"code\":\"" + smsCode.getCode() + "\"}");
// SMS_217436152
// 您的${phone}账户已注册,初始密码为${password},请尽快登录平台修改您的密码。如非本人操作,可不用理会!
request.setTemplateParam("{\"phone\":\"" + smsCode.getMobilePhone() + "\",\"password\":\"" + smsCode.getPassword() + "\"}");
// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
// request.setSmsUpExtendCode("90997");
// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
// request.setOutId("yourOutId");
// hint 此处可能会抛出异常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
log.info("=======短信发送成功!======");
// System.out.println("短信发送成功!");
}else {
log.info("=======短信发送失败!======");
// System.out.println("短信发送失败!");
}
return sendSmsResponse;
}
//以下为测试代码,随机生成验证码
// private static int newcode;
// public static int getNewcode() {
// return newcode;
// }
// public static void setNewcode(){
// newcode = (int)(Math.random()*9999)+100; //每次调用生成一次四位数的随机数
// }
// public static void main(String[] args) throws Exception {
// setNewcode();
// String code = Integer.toString(getNewcode());
// SendSmsResponse sendSms =sendSms("测试手机号码",code);//填写你需要测试的手机号码
// System.out.println("短信接口返回的数据----------------");
// System.out.println("Code=" + sendSms.getCode());
// System.out.println("Message=" + sendSms.getMessage());
// System.out.println("RequestId=" + sendSms.getRequestId());
// System.out.println("BizId=" + sendSms.getBizId());
// }
}