阿里雲短信驗證碼修改密碼


   公司要在項目上添加短信驗證碼,實現修改密碼功能。要求是比較便宜,方便介接入,且平台不能太小(怕不夠持久,突然倒閉)。在進行了幾個公司的對比后最后選擇了阿里雲短信平台,原因是:

      1、相對來說倒閉是暫時不可能的了(逗比)

      2、與騰訊比10到30萬條短信稍微便宜一丟丟,(一丟丟也是錢,一分錢難倒英雄漢)

      3、公司服務器使用的是阿里的,不用重新注冊,只需認證即可

      4、接入相對簡單(單從導包數量就少了一半,阿里2個jar ;騰訊4個jar)

    在進行操作之前閱讀了阿里整個操作文檔,阿里也提供了很多資料,並且提供了demo,使用時下載需要的demo然后進行其他操作。

  下面介紹一下我的操作流程:

    先登陸阿里雲----》控制台 ----》產品服務----》短信服務

  

進入短信使用頁面

然后按照文檔進行開通操作即可

接下來

、首先看下你需要准備哪些參數

  1.   /**********需要准備的參數**************/
  2.   public static String accessKey="";//需要修改
  3.   public static String accessSecret="";//需要修改
  4.   public static String code="SMS_41635111";//需要修改
  5.   public static String signName="測試99";//需要修改

創建和查看Access Key

https://ak-console.aliyun.com/#/accesskey/

 



3、開通短信服務成功后,需要配置短信簽名和短信模板,配置完后,需要審核,審核過后就拿了code和signName兩個參數

 

 

4、創建短信簽名

注意

審核成功

 

5、創建短信模板

審核成功

 

這里面有一個不成功,原因是我想用短信通知來發驗證碼

sms01:         ${name},哈哈,現在時間是${time}

sms02:         ${name},我用短信通知發送驗證碼不行啊,驗證碼為${code},時間${time},祝生活愉快。

 

 

6、短信簽名和短信模板審核通過后就可以開發了

 

主要代碼是

package com.kp.sms;
 
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sms.model.v20160927.SingleSendSmsRequest;
import com.aliyuncs.sms.model.v20160927.SingleSendSmsResponse;
 
/** 
 * @author: py
 * @version:2017年1月13日 下午2:40:28 
 * com.kp.sms.TestSms.java
 * @Desc 
 */
public class TestSms {
    public static String regionId="cn-hangzhou";//機房信息,可以不用更改
    /**********需要准備的參數**************/
    public static String accessKey="";//需要修改
    public static String accessSecret="";//需要修改
    public static String code="SMS_41635111";//需要修改
    public static String signName="測試99";//需要修改
    /**********************************/
    
    
    public static void main(String[] args) {
        
        String phone="15589895656";
        String time =getChinaDateByMM(System.currentTimeMillis());
        //根據自己定義的短信模板,修改
        String jsonStr="{\"name\":\"小明\",\"code\":\"12312\",\"time\":\""+time +"\"}";
        test(phone, jsonStr,code,signName);
 
    }
 
    
       public static void test(String phone, String jsonStr, String code, String signName) {        
           try {
            IClientProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret);
            DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Sms",  "sms.aliyuncs.com");
            IAcsClient client = new DefaultAcsClient(profile);
            SingleSendSmsRequest request = new SingleSendSmsRequest();
                //管理控制台中配置的短信簽名(狀態必須是驗證通過)
                request.setSignName(signName);
                //管理控制台中配置的審核通過的短信模板的模板CODE(狀態必須是驗證通過)
                 request.setTemplateCode(code);
//                短信模板中的變量;數字需要轉換為字符串;個人用戶每個變量長度必須小於15個字符。
//                 例如:短信模板為:“接受短信驗證碼${no}”,此參數傳遞{“no”:”123456”},用戶將接收到[短信簽名]接受短信驗證碼123456
                request.setParamString(jsonStr);
                //目標手機號,多個手機號可以逗號分隔
                request.setRecNum(phone);
//                request.setVersion(version);
                
                SingleSendSmsResponse httpResponse = client.getAcsResponse(request);
                String requestId = httpResponse.getRequestId();
                System.err.println("requestId:"+requestId);
            } catch (ServerException e) {
                e.printStackTrace();
            }
            catch (ClientException e) {
                e.printStackTrace();
            }
        }
       
       
        /**
         * 使用毫秒轉換為中文日期
         * @param tmpDateInt
         * @return
         */
        public static String getChinaDateByMM(long time){
            String ret_date = "";
            java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy年MM月dd日");
            ret_date = formatter.format(time);
            return ret_date;
        }
}

參考鏈接:

https://blog.csdn.net/u014520797/article/details/54411392

 

 我在參考阿里文檔和本連接內容后開始動手操作:

  1、下載對應的java版demo,把兩個jar包從java demo中取出放到項目的lib中

  2、把java demo 中的SmsDemo.java中的內容復制到項目的util文件夾里的SmsUtil.java中

     SmsDemo.java路徑

    

      SmsUtil.java所在文件目錄

 

          

      這幾個文件的代碼如下:

    

package com.xxxx.util.index;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
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 java.text.SimpleDateFormat;
import java.util.Date;

public class SmsUtil {
    //產品名稱:雲通信短信API產品,開發者無需替換
    static final String product = "Dysmsapi";
    //產品域名,開發者無需替換
    static final String domain = "dysmsapi.aliyuncs.com";

    // TODO 此處需要替換成開發者自己的AK(在阿里雲訪問控制台尋找)
    static final String accessKeyId = "LTAILlPgh5mWKmRm";
    static final String accessKeySecret = "HU9qWuoWOzqnvrmczOP2FOfgE07poi";

    public static SendSmsResponse sendSms(Note note) 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(note.getPhoneNumber());
        //必填:短信簽名-可在短信控制台中找到
        request.setSignName("中國青年網");
        //必填:短信模板-可在短信控制台中找到
        request.setTemplateCode("SMS_140727456");
        //可選:模板中的變量替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
        request.setTemplateParam("{\"code\":\""+note.getCode()+"\"}");

        //選填-上行短信擴展碼(無特殊需求用戶請忽略此字段)
        //request.setSmsUpExtendCode("90997");

        //可選:outId為提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者
        request.setOutId("123456789");

        //hint 此處可能會拋出異常,注意catch
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);

        return sendSmsResponse;
    }


    public static QuerySendDetailsResponse querySendDetails(String bizId) 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);

        //組裝請求對象
        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
        //必填-號碼
        request.setPhoneNumber("13164334652");
        //可選-流水號
        request.setBizId("111");
        //必填-發送日期 支持30天內記錄查詢,格式yyyyMMdd
        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
        request.setSendDate(ft.format(new Date()));
        //必填-頁大小
        request.setPageSize(10L);
        //必填-當前頁碼從1開始計數
        request.setCurrentPage(1L);

        //hint 此處可能會拋出異常,注意catch
        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);

        return querySendDetailsResponse;
    }

  /*  public static void main(String[] args) throws ClientException, InterruptedException {
        Note note=new Note();
        note.setPhoneNumber("13164363646");
        note.setTemplateCode("SMS_140715144");
        note.setCode("90999");
        note.setProduct("中國普法網");

        note.setId("123456");
        SendSmsResponse response = sendSms(note);
        System.out.println("短信接口返回的數據----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());


        //發短信
       // SendSmsResponse response = sendSms();
*//*        System.out.println("短信接口返回的數據----------------");
        System.out.println("Code=" + response.getCode());
        System.out.println("Message=" + response.getMessage());
        System.out.println("RequestId=" + response.getRequestId());
        System.out.println("BizId=" + response.getBizId());*//*

        Thread.sleep(3000L);

        //查明細
        if(response.getCode() != null && response.getCode().equals("OK")) {
            QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());
            System.out.println("短信明細查詢接口返回數據----------------");
            System.out.println("Code=" + querySendDetailsResponse.getCode());
            System.out.println("Message=" + querySendDetailsResponse.getMessage());
            int i = 0;
            for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs())
            {
                System.out.println("SmsSendDetailDTO["+i+"]:");
                System.out.println("Content=" + smsSendDetailDTO.getContent());
                System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode());
                System.out.println("OutId=" + smsSendDetailDTO.getOutId());
                System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum());
                System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate());
                System.out.println("SendDate=" + smsSendDetailDTO.getSendDate());
                System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus());
                System.out.println("Template=" + smsSendDetailDTO.getTemplateCode());
            }
            System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount());
            System.out.println("RequestId=" + querySendDetailsResponse.getRequestId());
        }

    }*/
}

 

package com.xxxx.util.index;

public class Note {
    private String id;
    private String phoneNumber;
    private String templateCode;
    private String product;
    private String code;
    private String templateParam;
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getTemplateCode() {
        return templateCode;
    }

    public void setTemplateCode(String templateCode) {
        this.templateCode = templateCode;
    }

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
    public String getTemplateParam(){
        return templateCode;
    }
    public void setTemplateParam(String templateParam){
        this.templateParam=templateParam;
    }
}
package com.xxxx.util.index;

public class CheckCode {
    private Integer Id;//id
    private String Userid;//memberid
    private String code;//驗證碼
    private String creatTime;//驗證碼創建時間
    private String phone;
    private String username;
    public Integer getId() {
        return Id;
    }

    public void setId(Integer id) {
        Id = id;
    }

    public String getUserid() {
        return Userid;
    }

    public void setUserid(String userid) {
        Userid = userid;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(String creatTime) {
        this.creatTime = creatTime;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getUsername(){
        return username;
    }
    public void setUsername(String username){
        this.username=username;
    }
}

 

以上便是主要獲取短信的核心代碼

如果只獲取代碼的話只需SmsUtil這個類中的代碼,略微修改一下信息就可在main函數中獲得短信,其他兩個類是我們在后台操作 時保存信息用的實體類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM