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()); // } }