阿里云国内消息模板与签名添加教程及 Java 后台代码编写

在数字化盛行的今天,短信验证功能显得尤为关键。不论是登录账户还是执行关键交易,短信验证都扮演着守护安全的重要角色。利用Java技术连接阿里云短信平台来实现这一功能,既带来了机遇,也伴随着挑战,这对众多开发者来说,无疑具有极大的吸引力。

登录阿里云

初次踏入阿里云,心情既充满期待,又略带紧张。这标志着短信验证功能实现旅程的开始。仿佛踏上了一场探寻未知的旅程,但别忘了,一定要确保输入的账号密码准确无误。以2023年6月1日早晨登录阿里云为例,若账号密码输入错误多次,可能会面临暂时无法登录的情况。登录成功后,便踏入了阿里云功能界面的这片新天地。在这里,我们可以看到琳琅满目的功能菜单。此时,需明确目标,直截了当,迅速在左侧菜单栏找到国内消息,这是至关重要的。

登录阿里云时,新手可能会遇到网络难题。比如,您所在地区网络波动较大,登录可能不太顺畅。遇到这种情况,不必紧张,可以尝试更换网络环境,然后再次尝试登录即可。

添加模板和签名

在找到国内消息菜单之后,添加模板和签名便成了当务之急。不过,签名可是个有讲究的活儿,名字不能随便乱取,否则审核通过的可能性不大。记得2022年10月,有开发者取了一个非常奇葩的签名名,结果被退回了三次。这个过程大概需要一两个小时来等待审核结果。在这期间,您可以稍微放松一下,但千万别放松警惕,得随时关注审核结果。

审核结果出来前,您可能会感到焦虑,因为这两个小时对项目进度至关重要。若审核未通过,需根据提示快速修改签名内容。若注册名称存在歧义或敏感词汇,请修改为规范明确的名称,以确保审核顺利通过。

创建用户

等待模板和签名审核的间隙,不妨开始创建用户。操作十分简便,只需点击个人头像进行选择。这时会出现一个弹窗,对于像我这样的新手,在2023年3月初次接触时,选择了继续使用。创建子用户后还需设置权限,这对新手来说可能稍显复杂。如果您是经验丰富的开发者,不妨尝试创建子用户,但务必做好权限的详细设置。

选用此法操作简便又迅速,然而,它亦有其固有限制。例如,随着项目的推进,若需实施更为细致的权限控制,此法或许便显得力不从心。然而,对于刚开始的小型项目而言,现阶段这样的处理方式尚能满足需求。

Java后台代码

图片[1]-阿里云国内消息模板与签名添加教程及 Java 后台代码编写-东山笔记

重头戏来了,咱们来聊聊Java后台代码的编写。这里直接提供可以直接使用的类,但要注意,像1111···这样的标识符必须修改,其他部分则基本无需变动。编写这些代码时,必须遵守Java的语法规范。记得,之前有位朋友在2021年编写时,由于不熟悉语法规则,调试了好久才找到错误。

编写代码时,务必重视代码的简洁与易读。不可盲目追求功能复杂度,而忽视规范。比如,在定义变量时,应遵循明确的命名规则,以便日后修改与维护。

接口调用

代码虽重要,但单靠它是不够的,还需一个接口以供调用。这个接口,是让短信发送功能从理论走向实践的关键一环。它如同桥梁,将Java后台与阿里云短信平台紧密相连。缺少了这个接口,先前的一切努力都将化为泡影,短信发送将无法实现。

开发接口时,必须保证其稳定性。必须注意兼容性问题,不同环境都可能存在。例如,2022年某项目对接时,因接口兼容性不佳,短信发送遭遇失败。因此,测试工作要提前做好,确保接口在任何情况下都能顺畅运行。

public class AliyunSmsUtils {
    //产品名称:云通信短信API产品,不用动
    static final String product = "Dysmsapi";
    //产品域名,不用动
    static final String domain = "dysmsapi.aliyuncs.com";
    // 这个是自己的Assesskeys,就是我打马赛克的地方
    static final String accessKeyId = "1111111111";
    static final String accessKeySecret = "1111111111";
    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
        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("111111111");    
        //必填:短信模板,就是我打马赛克的地方
        request.setTemplateCode("1111111");    
        //这个地方根据模板改,具体看情况
        request.setTemplateParam("{"code":"" + code + ""}");
        //hint 此处可能会抛出异常 ClientException, InterruptedException
        SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
        if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
            System.out.println("短信发送成功!");
        } else {
            System.out.println("短信发送失败!");
        }
        return sendSmsResponse;
    }
    private static int newcode;
    public static int getNewcode() {
        return newcode;
    }
    //生成4位随机数
    public static void setNewcode() {
        newcode = (int) (Math.random() * 9999) + 100;  
    }
}

测试环节

最后是让人充满期待的测试环节。这个环节就像揭开谜底,之前的所有努力都将在这里接受检验。怀着忐忑的心情参与测试,一旦成功发送短信,那种成就感便难以用言语表达。

测试时需全面考察。然而,部分开发者却未注意到一些特殊状况,比如短信发送的频率限制问题。以2020年某公司的测试为例,由于未考虑到短信发送频率的限制,导致大量短信发送失败,且这些问题并未能被及时察觉。

/**
     * 短信验证码
     * 返回验证码
     */
    @RequestMapping(value = "/api/resiger/sendCode",method = RequestMethod.GET)
    public JsonResult getCode(String telphone)throws ClientException {
        JsonResult jsonResult = null;
        try{
            
            AliyunSmsUtils.setNewcode();
            String code = Integer.toString(AliyunSmsUtils.getNewcode());
            SendSmsResponse phoneCode = AliyunSmsUtils.sendSms(telphone,code);
            
            if(phoneCode!=null){
                jsonResult = new JsonResult("200","发送成功",code);
            }else{
                jsonResult = new JsonResult("404","发送失败","");
            }
        }catch (Exception e){
            jsonResult = new JsonResult("500","网络错误","");
        }
        return jsonResult;
    }

您认为在哪个环节出错的可能性最大?若您亲自尝试过这个流程,不妨在评论区分享一下您的体验。另外,如果您觉得这篇文章对您有帮助,别忘了点赞和转发。

© 版权声明
THE END
喜欢就支持一下吧
分享