阿里云短信

阿里云短信服务官方指导教程:https://help.aliyun.com/document_detail/59210.html?spm=a2c4g.11174283.4.1.n6Pa55

步骤:

1、注册阿里云账号通过实名认证

2、开通短信服务(开通免费)

开通后可在控制台短信服务栏中查看

3、创建Access Key,获取Access Key ID 和 Access Key Secret(具体看阿里云官方教程)

Access Key用于在程序中调用阿里云的服务API,个人理解相当于账号密码,用于认证个人信息的(程序中会用到)。可以创建多个Access Key,但Access Key具体内容只能在创建初期查看,之后是无法查看的,因此需要及时下载到本地。

4、创建短信签名和短信模板

    短信签名一般用于标记公司名或者是具体的业务,它会以下的形式出现在短信中:

[短信签名] 短信内容....

    短信模板描述了短信的具体内容,可以提供变量来替代具体的数据,程序中会以JSON的形式向短信模板提供变量。

注意:短信签名和短信模板创建后都需要通过审核,审核一般在几个小时内就能完成。

短信模板中的"模板CODE"在程序中会被使用到,通过模板CODE来明确使用哪一个模板。

5、Maven项目中引入阿里云短信服务依赖
 

pom.xml

<!--短信sdk start-->
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-core</artifactId>
			<version>3.7.1</version>
		</dependency>
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
			<version>1.1.0</version>
		</dependency>
<!--短信sdk end-->

smsUtil



/**
 * 阿里云短信工具类
 */
public class SmsUtils {
    // 产品名称:云通信短信API产品,开发者无需替换
    static final String product = "Dysmsapi";
    // 产品域名,开发者无需替换
    static final String domain = "dysmsapi.aliyuncs.com";

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    static final String accessKeyId = "**********";           // TODO 改这里
    static final String accessKeySecret = "**************"; // 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-hangzhou", accessKeyId, accessKeySecret);
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);

        // 组装请求对象-具体描述见控制台-文档部分内容
        SendSmsRequest request = new SendSmsRequest();
        // 必填:待发送手机号
        request.setPhoneNumbers(telephone);
        // 必填:短信签名-可在短信控制台中找到
        request.setSignName("**"); // TODO 改这里
        // 必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("*****");  // 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;
    }

}

 sendCode



@Component
public class SendCode {
	
	@Resource(name = "redisDaoImpl")
	private  RedisDao redisDaoImpl;
	
	private static SendCode sendCode;
	
	@PostConstruct 
    public void init() { 
		sendCode = this; 
		sendCode.redisDaoImpl = this.redisDaoImpl;
    } 
	/**
	 *发送验证码
	 *@param keyPre 生成验证码存入redis 的key前缀 ,PHONE 生成redis 的key后缀 , des 操作的描述信息(如登录,注册)
	 * 
	 */
	public static ResBean sendCode(String keyPre,String PHONE,String des) throws ClientException {
		ResBean resultBean = new ResBean();
		
		//3.发送验证码步骤,(1)先判断是否已经发送过验证码,发送过一分钟不能重复发送,过了一分钟后才发送(2)如果没有发送过验证码,则发送验证码
		int random = Tools.getRandomNum();//生成6为随机验证码
		String code = Integer.toString(random);//将验证码转成字符串
		long curtime = System.currentTimeMillis(); //获取当前时间戳,用于下面比较获取时间是否在一分钟内
		String lastSmsTime_Code = Long.toString(curtime)+"_"+code; //将当前时间和验证码拼接成字符串,保存到redis的key中
		String curkey = keyPre+PHONE;//生成redis的key:keyPre+PHONE(用户名)
		//先判断redis的key为"keyPre_"+USERNAME(用户名)是否存在
		if(sendCode.redisDaoImpl.hasKey(curkey)){
			//取出上次发送验证码的时间戳
			long lastSmsTime = Long.parseLong(sendCode.redisDaoImpl.get(curkey).substring(0,sendCode.redisDaoImpl.get(curkey).length()-7));
            //当前时间与上次发送验证码的时间戳之差
			long differSecond = (curtime- lastSmsTime)/1000;
            //判断时间差小于60,则不能发送
            if(differSecond<60){
	            //一分钟之内不能重复发送
	        	resultBean.setCode(1020);
	    		resultBean.setMsg("请于1分钟后发送");
	    		resultBean.setData(60-differSecond);//返回倒计时秒数
            }else{
            	//获取验证码成功
	    		resultBean.setCode(1);
	    		resultBean.setMsg("验证码已发送,请注意查收!");
	    		//resultBean.setData(code);
	    		//String content = "【聚盟】您"+des+"的验证码是:"+code;
	    		//SMSUtils.sendSms(PHONE,content);
                SmsUtils.sendSms(PHONE,code);
	    		sendCode.redisDaoImpl.eidt(curkey,lastSmsTime_Code);
	    		sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
            }
		}else{
			//获取验证码成功
    		resultBean.setCode(1);
    		resultBean.setMsg("验证码已发送,请注意查收!");
    		//resultBean.setData(code);
    		//String content = "【易生健康】您"+des+"的验证码是:"+code;
    		//SMSUtils.sendSms(PHONE,content);
            SmsUtils.sendSms(PHONE,code);
    		sendCode.redisDaoImpl.addString(curkey,lastSmsTime_Code);
    		sendCode.redisDaoImpl.setKeyTime(curkey, 1800);
		}
		return resultBean;
	}
	
	
	public static boolean identifyingCode(String key,String vCode){
		//判断key值存在,进入下一步,比较验证码是否存在
		if(sendCode.redisDaoImpl.hasKey(key)){
		    //取出redis存的验证码(生成规则,查看登录发送验证码接口)
			String code =sendCode.redisDaoImpl.get(key).substring(sendCode.redisDaoImpl.get(key).length()-6);
		    //判断前台传来的验证码与redis 的是否一致,一致返回信息,不一致返回请输入正确的验证码
			if(code.equals(vCode)){
				return true;
			}else{
				return false;
				  }
			}
		else {
			return false;
					}
		
	}
	
	
	

}

猜你喜欢

转载自blog.csdn.net/wind_cp/article/details/85237639