阿里云短信验证码修改密码

   公司要在项目上添加短信验证码,实现修改密码功能。要求是比较便宜,方便介接入,且平台不能太小(怕不够持久,突然倒闭)。在进行了几个公司的对比后最后选择了阿里云短信平台,原因是:

      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函数中获得短信,其他两个类是我们在后台操作 时保存信息用的实体类。

 

posted @ 2018-08-07 01:48  不懂代码的程序猿  阅读(2150)  评论(0编辑  收藏  举报