1. 程式人生 > >阿里雲驗證碼與通知簡訊

阿里雲驗證碼與通知簡訊

1、入住阿里雲

首先,註冊阿里雲賬號或者快捷登陸

其次,實名認證

根據情況選擇是企業還是個人使用者(以個人使用者為例)

然後選擇個人支付寶授權認證

最後,根據實際情況填寫個人資訊

2、開通簡訊服務

首先,登陸

其次,繫結電子郵箱

繫結成功後,選擇開通簡訊服務

開通成功後,可以看到阿里雲免費贈送了100條簡訊

如果簡訊不夠用,可以購買,不具體敘述。

3、獲取AccessKey

首先,將滑鼠放到使用者頭像上

點選accesskeys,出現下面的介面:

點選開始使用子使用者Accesskey,進入下面的介面:

點選開通後跳轉下面的介面:

再點選下面的accesskeys:

出現下面介面:

選擇繼續使用Accesskey,點選建立AccessKey,如下圖:

成功後,如圖:

4、建立簽名和模版

(1)建立簽名

首先,簡訊服務->國內訊息,如圖:

點選添加簽名,根據實際情況填寫申請資訊(例如:簽名用途,選擇第二個)

(2)新增模板

模板型別可以選擇驗證碼也可以選擇簡訊通知,由於需要測試驗證碼簡訊和通知簡訊,所以可以新增兩個模板

新增稽核成功後,如圖:

5、程式設計(Java)

public class SmsUtil {
	
	//產品名稱:雲通訊簡訊API產品,開發者無需替換
	static final String product="Dysmsapi";
	//產品域名,開發者無需替換
	static final String domain = "dysmsapi.aliyuncs.com";
	// 此處需要替換成開發者自己的AccessKey(在阿里雲訪問控制檯尋找)
	static final String accessKeyId = "yourAccessKeyId";
    static final String accessKeySecret = "yourAccessKeySecret";
    
    /**
     * 傳送驗證碼簡訊
     * 模板為驗證碼型別
     * 
     * @phoneNumber
     */
    public static boolean sendSms(String phoneNumber,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(phoneNumber);
        //必填:簡訊簽名-可在簡訊控制檯中找到舉個例子
        request.setSignName("");
        //必填:簡訊模板id-可在簡訊控制檯中找到,是id不是名字,舉個例子
        request.setTemplateCode("");
        //可選:模板中的變數替換JSON串,如模板內容	\為"親愛的${name},您的驗證碼為${code}"時,此處的值為--必填,與模板相對應
        //request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
        request.setTemplateParam("{\"code\":\""+code+"\"}");
        //選填-上行簡訊擴充套件碼(無特殊需求使用者請忽略此欄位)
        //request.setSmsUpExtendCode("90997");
        //可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
        //request.setOutId("yourOutId");
        //hint 此處可能會丟擲異常,注意catch
        SendSmsResponse sendSmsResponse=acsClient.getAcsResponse(request);
        //System.out.println(sendSmsResponse.getCode());
        if (sendSmsResponse.getCode().equals("OK")) {
			return true;
		}
        return false;
    }
    
    /**
     * 傳送通知類簡訊
     * 模板為通知型別
     * 
     */
    public static boolean sendSmg(String phoneNumber,String name) 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(phoneNumber);
        //必填:簡訊簽名-可在簡訊控制檯中找到舉個例子
        request.setSignName("");
        //必填:簡訊模板id-可在簡訊控制檯中找到,是id不是名字,舉個例子
        request.setTemplateCode("");
        //可選:模板中的變數替換JSON串,如模板內容	\為"親愛的${name},您的驗證碼為${code}"時,此處的值為--必填,與模板相對應
        request.setTemplateParam("{\"name\":\""+name+"\"}");
        //request.setTemplateParam("{\"code\":\""+getRandomSMSCode(6,true)+"\"}");
        //選填-上行簡訊擴充套件碼(無特殊需求使用者請忽略此欄位)
        //request.setSmsUpExtendCode("90997");
        //可選:outId為提供給業務方擴充套件欄位,最終在簡訊回執訊息中將此值帶回給呼叫者
        //request.setOutId("yourOutId");
        //hint 此處可能會丟擲異常,注意catch
        SendSmsResponse sendSmsResponse=acsClient.getAcsResponse(request);
        //System.out.println(sendSmsResponse.getCode());
        if (sendSmsResponse.getCode().equals("OK")) {
			return true;
		}
        return false;
    }

    /**
     * 隨機生成驗證碼
     * 引數numberCode控制驗證碼型別,true為純數字,false為數字和字母的混合
     * 
     */
    public static final String getRandomSMSCode(int length, boolean numberCode) {
    	String randomSMSCode="";
        String codeTable = numberCode ? "1234567890" : "1234567890abcdefghijkmnpqrstuvwxyz";
        boolean flag = true;
        do {
            int count = 0;
            for (int i = 0; i < length; i++) {
                double dblR = Math.random() * codeTable.length();
                int intR = (int) Math.floor(dblR);
                char c = codeTable.charAt(intR);
                if (('0' <= c) && (c <= '9')) {
                    count++;
                }
                randomSMSCode += codeTable.charAt(intR);
            }
            if (count >= 2) {
            	flag = false;
            }
        } while (flag);
        return randomSMSCode;
    }
}

6、傳送簡訊

public class Test {
	public static void main(String[] args) throws ClientException {
		sendSms("138****0204");
		sendSmg("182****9810","張三");
	}
	@SuppressWarnings("resource")
	public static void sendSms(String phoneNumber) throws ClientException {
		String randomSMSCode = SmsUtil.getRandomSMSCode(5,true);
		if (SmsUtil.sendSms(phoneNumber,randomSMSCode)) {
			System.out.println("簡訊傳送成功");
			Scanner scanner= new Scanner(System.in);
			System.out.println("請輸入您收到的驗證碼:");
			String code=scanner.next();
			if (randomSMSCode.equals(code)) {
				System.out.println("驗證成功");
			}
		}else {
			System.out.println("失敗");
		}
	}
	public static void sendSmg(String phoneNumber,String name) throws ClientException {
		if (SmsUtil.sendSmg(phoneNumber, name)) {
			System.out.println("通知簡訊已經發送");
		}else {
			System.out.println("傳送失敗");
		}
	}
}