zoukankan      html  css  js  c++  java
  • 阿里云短信验证码修改密码

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

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

  • 相关阅读:
    编码问题:python写入文件
    [ExtJS5学习笔记]第三十二节 sencha extjs 5与struts2的ajax交互配置
    PS 滤镜——Skewing
    [struts2学习笔记] 第六节 struts2依赖的jar包还有Could not find action or result 错误解决
    [linux RedHat]windows下使用putty远程连接linux 下载JDK和tomcat
    一个有趣的花环图案生成函数
    【翻译】针对多种设备定制Ext JS 5应用程序
    【翻译】Ext JS最新技巧——2015-1-2
    [ExtJS5学习笔记]第三十一节 sencha extjs 5使用cmd生成的工程部署到tomcat服务器
    PhotoShop 图像处理 算法 汇总
  • 原文地址:https://www.cnblogs.com/yz820/p/9434465.html
Copyright © 2011-2022 走看看