本來以為 向用戶發短信是一件很難的事 以前也沒有做過
今天公司業務涉及到了 需要一個短信驗證用以收集用戶信息 硬着頭皮上了 沒想到是一件挺簡單的事
嗯 首先需要一個阿里雲賬號
購買短信服務之后 需要申請一個簽名 和一個模板 (這一步需要阿里工作人員審核,不過很快 一個小時左右就好了)
然后申請自己的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;
}
}
