关于阿里云短信接口的使用

本来以为 向用户发短信是一件很难的事 以前也没有做过

今天公司业务涉及到了 需要一个短信验证用以收集用户信息 硬着头皮上了 没想到是一件挺简单的事  

嗯 首先需要一个阿里云账号 

购买短信服务之后 需要申请一个签名 和一个模板 (这一步需要阿里工作人员审核,不过很快 一个小时左右就好了)

然后申请自己的AccessKey ,AccessKey  包括AccessKeyId 和AccessKeySecret 在调用阿里的服务的时候用以验证用户的身份

关于这些 阿里云API上都有很详细的介绍 https://help.aliyun.com/product/44282.html?spm=a2c4g.11186623.6.540.6e5534fc0q0cnP 大家可以参考

然后 引入阿里提供的SDK后 直接代码了  这里要注意SDK的版本

关于这一快 网上有很多教程 我就不详细阐述了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
protected bool SendMessage(string PhoneNumber)
    {
        bool IsSuccess = true;
 
        String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
        String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)<br>     //这里写入你在官网申请的accessKey
        String accessKeyId = "";//你的accessKeyId,参考本文档步骤2
        String accessKeySecret = "";//你的accessKeySecret,参考本文档步骤2
 
        IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, accessKeySecret);
        //IAcsClient client = new DefaultAcsClient(profile);
        // SingleSendSmsRequest request = new SingleSendSmsRequest();
        //初始化ascClient,暂时不支持多region(请勿修改)
        DefaultProfile.AddEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        SendSmsRequest request = new SendSmsRequest();
        try
        {
            //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式,发送国际/港澳台消息时,接收号码格式为00+国际区号+号码,如“0085200000000”
            request.PhoneNumbers =PhoneNumber;
            //必填:短信签名-可在短信控制台中找到
            request.SignName = "天材教育";
            //必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
            request.TemplateCode = "SMS_164666489";
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            //request.TemplateParam = "{\"name\":\"Tom\", \"code\":\"123\"}";
            //request.TemplateParam = "{\"code\":\"123\"}";
            string RandomCode = getRandom();
            request.TemplateParam = "{\"code\":\"" + RandomCode + "\"}";
            //request.TemplateParam = "您正在申请注册,验证码为:${code},5分钟内有效!";
            //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
            request.OutId = "123";
            //请求失败这里会抛ClientException异常
            SendSmsResponse sendSmsResponse = acsClient.GetAcsResponse(request);
<br>       //这里是我自己添加的代码 没做很复杂的业务 只是存到session里面了
            if (Context.Session["RandomCode"] != null)
            {
                Context.Session.Remove("RandomCode");
                Context.Session["RandomCode"] = RandomCode;
            }
            else
            {
                Context.Session["RandomCode"] = RandomCode;
            }<br>
       //这里如果短信发送成功 会返回OK 如果没有 会返回错误信息
            if (sendSmsResponse.Message !="OK")
            {
                IsSuccess = false;
            }
        }
        catch (ServerException e)
        {
            IsSuccess = false;
            string result = e.Message;
        }
        catch (ClientException e)
        {
            IsSuccess = false;
            string result = e.Message;
        }
 
        return IsSuccess;
    }

  

然后 这里我测试的时候 遇到一个错误

返回了一个这个错误信息

错误原因是因为短信发送有默认的频率限制:

限制如下:

短信验证码 :使用同一个签名,对同一个手机号码发送短信验证码,支持1条/分钟,5条/小时 ,累计10条/天。

短信通知: 使用同一个签名和同一个短信模板ID,对同一个手机号码发送短信通知,支持50条/日

 

 

 

这个基本没有难度 都是阿里云 封装好的 官方的文档 写的也很清楚 

 

然后发送完短信之后 需要设置一个按钮禁用的问题 60秒之后重新发送

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//这是验证码发送完之后调用的代码
 countdown: 60,
 var obj = $("#btn_Send"); 
 vedioDetails.settime(obj);
 
 
 
  settime: function (obj)
    {
        //这里的vedioDetails是一个js对象 直接从代码里拷来了 就是上面的countdown
        if (vedioDetails.countdown == 0)
        {
            
            obj.attr('disabled', false);
            obj.text("获取验证码");
            vedioDetails.countdown = 60;
            return;
        }
        else
        {
            obj.attr('disabled', true);
            obj.text("重新发送(" + vedioDetails.countdown + ")");
            vedioDetails.countdown--;
        }
 
        setTimeout(function ()
        {
            vedioDetails.settime(obj)
        }, 1000)
 }
    

  

然后就没什么了 涉及到一个手机号 和六位数验证码的正则 一块贴出来吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function checkPhone(phone)
{
    //var phone = document.getElementById('phone').value;
    if (!(/^1[34578]\d{9}$/.test(phone))) {
        alert("手机号码有误,请重填");
        return false;
    }
}
 
 
function CheckAuthCode(AuthCode)
{
    if (!(/^\d{6}$/.test(AuthCode))) {
        alert("6位验证码有误,请重填");
        return false;
    }
    
}

  

posted @   Felix-Zhang  阅读(1110)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示