1. 程式人生 > >阿里雲簡訊

阿里雲簡訊

阿里雲簡訊服務官方指導教程: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;
					}
		
	}
	
	
	

}