Java实现短信验证码(阿里云短信服务)
前言:
很多時(shí)候我們做的項(xiàng)目都需要上圖這樣的驗(yàn)證碼來幫助我們完成更好的功能,比如:什么登錄注冊,忘記密碼需要發(fā)送手機(jī)驗(yàn)證碼之類的啊...下面分享我今天通過阿里云短信服務(wù)實(shí)現(xiàn)的短信驗(yàn)證碼,操作都很簡單,跟著步驟來就好了
可參考阿里云官網(wǎng)使用 -->?阿里云短信服務(wù)文檔使用指引? ? ?
我也把我自己實(shí)現(xiàn)的步驟分享在了下面,看不懂官網(wǎng)文檔的也可以參考一下我是怎么實(shí)現(xiàn)的哦~~
第一步:登錄阿里云官網(wǎng)? 控制臺中找到短信服務(wù)然后開通
第二步:獲取AccessKey
將鼠標(biāo)置于頁面右上方的賬號圖標(biāo),然后單擊accesskeys。
注意:若開通編程訪問,請及時(shí)保存AccessKey 信息,頁面關(guān)閉后將無法再次獲取信息。
然后給短信服務(wù)配置權(quán)限
第三步:創(chuàng)建簽名和模版
提交之后等待審核通過即可
添加模板
等待審核通過
等待審核通過之后就可以進(jìn)行下面的操作體驗(yàn)效果了哦~??
注意:代碼中需要上面第三步中提供的?簽名名稱?和?模版CODE?以及第二步RAM訪問控制中的?AccessKeyID?和?AccessKeySecret??
代碼部分:
可參考阿里云文檔配置?:SDK及DEMO下載 - 短信服務(wù) - 阿里云
Java的可以下載demo學(xué)習(xí),或者直接參考我下面給出的案例哦~
第一步:pom文件引入所需依賴包?(溫馨小提示:這里我是maven項(xiàng)目的引入方式)
<!-- 阿里云短信服務(wù)所需 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.6</version> <!-- 注:如提示報(bào)錯(cuò),先升級基礎(chǔ)包版,無法解決可聯(lián)系技術(shù)支持 -->
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
第二步:測試代碼??(一把梭 直接將這個(gè)類拷到自己項(xiàng)目中測試能不能使用,最后再根據(jù)自己的需求修改去實(shí)現(xiàn)登錄注冊 忘記密碼 等發(fā)送手機(jī)驗(yàn)證碼等功能之類的啊...)
/**
* 阿里云短信服務(wù):
* 注意:需要 簽名名稱、模版CODE 以及 RAM訪問控制中的 AccessKeyID 和 AccessKeySecret??
*/
public class AliyunSmsUtils {
//產(chǎn)品名稱:云通信短信API產(chǎn)品,開發(fā)者無需替換
static final String product = "Dysmsapi";
//產(chǎn)品域名,開發(fā)者無需替換
static final String domain = "dysmsapi.aliyuncs.com";
// TODO 此處需要替換成開發(fā)者自己的AK(在阿里云訪問控制臺尋找)
static final String accessKeyId = "yourAccessKeyId"; // TODO 修改成自己的
static final String accessKeySecret = "yourAccessKeySecret"; // TODO 修改成自己的
public static SendSmsResponse sendSms(String telephone, String code) throws ClientException {
//可自助調(diào)整超時(shí)時(shí)間
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);
//組裝請求對象-具體描述見控制臺-文檔部分內(nèi)容
SendSmsRequest request = new SendSmsRequest();
//必填:待發(fā)送手機(jī)號
request.setPhoneNumbers(telephone);
//必填:短信簽名-可在短信控制臺中找到
request.setSignName("xxx"); // TODO 修改成自己的
//必填:短信模板-可在短信控制臺中找到
request.setTemplateCode("SMS_xxx"); // TODO 修改成自己的
//可選:模板中的變量替換JSON串,如模板內(nèi)容為"親愛的${name},您的驗(yàn)證碼為${code}"時(shí),此處的值為
// request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
request.setTemplateParam("{\"code\":\"" + code + "\"}");
//選填-上行短信擴(kuò)展碼(無特殊需求用戶請忽略此字段)
//request.setSmsUpExtendCode("90997");
//可選:outId為提供給業(yè)務(wù)方擴(kuò)展字段,最終在短信回執(zhí)消息中將此值帶回給調(diào)用者
request.setOutId("yourOutId");
//hint 此處可能會(huì)拋出異常,注意catch
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode()!= null && sendSmsResponse.getCode().equals("OK")){
System.out.println("短信發(fā)送成功!");
}else {
System.out.println("短信發(fā)送失敗!");
}
return sendSmsResponse;
}
/* 不刪 留著 以后可能有用
public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException {
//可自助調(diào)整超時(shí)時(shí)間
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("15000000000");
//可選-流水號
request.setBizId(bizId);
//必填-發(fā)送日期 支持30天內(nèi)記錄查詢,格式y(tǒng)yyyMMdd
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
request.setSendDate(ft.format(new Date()));
//必填-頁大小
request.setPageSize(10L);
//必填-當(dāng)前頁碼從1開始計(jì)數(shù)
request.setCurrentPage(1L);
//hint 此處可能會(huì)拋出異常,注意catch
QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
return querySendDetailsResponse;
}
*/
//以下為測試代碼,隨機(jī)生成驗(yàn)證碼
private static int newcode;
public static int getNewcode() {
return newcode;
}
public static void setNewcode(){
newcode = (int)(Math.random()*9999)+100; //每次調(diào)用生成一位四位數(shù)的隨機(jī)數(shù)
}
public static void main(String[] args) throws ClientException, InterruptedException {
setNewcode();
String code = Integer.toString(getNewcode());
System.out.println("發(fā)送的驗(yàn)證碼為:"+code);
//發(fā)短信
SendSmsResponse response =sendSms("xxx",code); // TODO 填寫你需要測試的手機(jī)號碼
System.out.println("短信接口返回的數(shù)據(jù)----------------");
System.out.println("Code=" + response.getCode());
System.out.println("Message=" + response.getMessage());
System.out.println("RequestId=" + response.getRequestId());
System.out.println("BizId=" + response.getBizId());
/* 不刪 留著 以后可能有用
System.out.println(" ============================================== ");
Thread.sleep(3000L);
//查明細(xì)
if(response.getCode() != null && response.getCode().equals("OK")) {
QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId());
System.out.println("短信明細(xì)查詢接口返回?cái)?shù)據(jù)----------------");
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());
}*/
}
}
運(yùn)行效果:
最后發(fā)送到我手機(jī)的短信效果圖:
云服務(wù)器搭載業(yè)務(wù),選擇合適的平臺最重要!
從目前國內(nèi)云計(jì)算市場的格局來看,國內(nèi)云計(jì)算前三強(qiáng)分別是阿里云、騰訊云和華為云,阿里云、騰訊云作為背靠互聯(lián)網(wǎng)平臺的企業(yè),更偏向于B端用戶;華為與作為傳統(tǒng)的通信巨頭,更偏向于G端。
當(dāng)然如何選擇服務(wù)器機(jī)型,這里有篇文檔匯總的比較詳細(xì),文檔地址:
云服務(wù)器哪家好!2021年阿里云、騰訊云、華為云的服務(wù)器配置及價(jià)格對比??
如果是高并發(fā),高IO業(yè)務(wù)場景,需要確定服務(wù)器規(guī)格,可讓業(yè)務(wù)應(yīng)用性能發(fā)揮到最佳,參考官方文檔:
阿里云服務(wù)器規(guī)格:規(guī)格實(shí)例族 - 云服務(wù)器 ECS
騰訊云服務(wù)器規(guī)格:規(guī)格實(shí)例族 - 云服務(wù)器CVM
總結(jié)
以上是生活随笔為你收集整理的Java实现短信验证码(阿里云短信服务)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模型实践 | 高精地图构建模型HDMap
- 下一篇: JavaCV音视频开发宝典:vb8和vp