关于阿里云短信接口的使用
本来以为 向用户发短信是一件很难的事 以前也没有做过
今天公司业务涉及到了 需要一个短信验证用以收集用户信息 硬着头皮上了 没想到是一件挺简单的事
嗯 首先需要一个阿里云账号
购买短信服务之后 需要申请一个签名 和一个模板 (这一步需要阿里工作人员审核,不过很快 一个小时左右就好了)
然后申请自己的AccessKey ,AccessKey 包括AccessKeyId 和AccessKeySecret 在调用阿里的服务的时候用以验证用户的身份
关于这些 阿里云API上都有很详细的介绍 https://help.aliyun.com/product/44282.html?spm=a2c4g.11186623.6.540.6e5534fc0q0cnP 大家可以参考
然后 引入阿里提供的SDK后 直接代码了 这里要注意SDK的版本
关于这一快 网上有很多教程 我就不详细阐述了
protected bool SendMessage(string PhoneNumber) { bool IsSuccess = true; String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改) String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//这里写入你在官网申请的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);
//这里是我自己添加的代码 没做很复杂的业务 只是存到session里面了 if (Context.Session["RandomCode"] != null) { Context.Session.Remove("RandomCode"); Context.Session["RandomCode"] = RandomCode; } else { Context.Session["RandomCode"] = RandomCode; }
//这里如果短信发送成功 会返回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秒之后重新发送
//这是验证码发送完之后调用的代码 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) }
然后就没什么了 涉及到一个手机号 和六位数验证码的正则 一块贴出来吧
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; } }