阿里云短信服务介绍
阿里云短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。调用API或用群发助手,即可发送验证码、通知类和营销类短信;国内验证短信秒级触达,到达率最高可达99%;国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受出海企业选用。
应用场景:
场景 | 案例 |
验证码 | APP、网站注册账号,向手机下发验证码; 登录账户、异地登录时的安全提醒; 找回密码时的安全验证; 支付认证、身份校验、手机绑定等。 |
短信通知 | 向注册用户下发系统相关信息,包括: 升级或维护、服务开通、价格调整、 订单确认、物流动态、消费确认、 支付通知等普通通知短信。 |
推广短信 | 向注册用户和潜在客户发送通知和推广信息,包括促销活动通知、业务推广等商品与活动的推广信息。增加企业产品曝光率、提高产品的知名度。 |
阿里云短信服务官方网站: https://www.aliyun.com/product/sms?spm=5176.19720258.J_8058803260.52.5c432c4a11Dcwf
可以访问官网,熟悉一下短信服务:
3 阿里云短信服务准备
1 注册账号
阿里云官网:https://www.aliyun.com/
点击官网首页注册按钮,跳转到如下注册页面:
当我们把账号注册完毕之后,我们就可以登录到阿里云系统控制台。
2 开通短信服务
注册成功后,点击登录按钮进行登录。登录后进入控制台, 在左上角的菜单栏中搜索短信服务。第一次使用,需要点击,并开通短信服务。
3 设置短信签名
开通短信服务之后,进入短信服务管理页面,选择国内消息菜单,我们需要在这里添加短信签名。
那么什么是短信签名呢?
短信签名是短信发送者的署名,表示发送方的身份。我们要调用阿里云短信服务发送短信,签名是比不可少的部分。
那么接下来,我们就需要来添加短信签名。
注意:
目前,阿里云短信服务申请签名主要针对企业开发,个人申请时有一定难度的,在审核时,会审核资质,需要上传营业执照 ;
所以,我们课程中,主要是演示一下短信验证码如何发送,大家只需要学习这块儿的开发流程、实现方式即可,无需真正的发送短信。如果以后在企业中做项目,需要发送短信,我们会以公司的资质去申请对应的签名。
4 设置短信模板
切换到【模板管理】标签页:
那么什么是模板呢?
短信模板包含短信发送内容、场景、变量信息。模板的详情如下:
最终我们,给用户发送的短信中,具体的短信内容,就是上面配置的这个模板内容,将${code}占位符替换成对应的验证码数据即可。如下:
【xxxxx】您好,您的验证码为173822,5分钟之内有效,不要泄露给他人!
我们可以点击右上角的按钮,添加模板,然后填写模板的基本信息及设置的模板内容:
添加的短信模板,也是需要进行审核的只有审核通过,才可以正常使用。
5 设置AccessKey
AccessKey 是访问阿里云 API 的密钥,具有账户的完全权限,我们要想在后面通过API调用阿里云短信服务的接口发送短信,那么就必须要设置AccessKey。
我们点击右上角的用户头像,选择"AccessKey管理",这时就可以进入到AccessKey的管理界面。
进入到AccessKey的管理界面之后,提示两个选项 "继续使用AccessKey" 和 "开始使用子用户AccessKey",两个区别如下:
1). 继续使用AccessKey
如果选择的是该选项,我们创建的是阿里云账号的AccessKey,是具有账户的完全权限,有了这个AccessKey以后,我们就可以通过API调用阿里云的服务,不仅是短信服务,其他服务(OSS,语音服务,内容安全服务,视频点播服务...等)也可以调用。 相对来说,并不安全,当前的AccessKey泄露,会影响到我当前账户的其他云服务。
2). 开始使用子用户AccessKey
可以创建一个子用户,这个子用户我们可以分配比较低的权限,比如仅分配短信发送的权限,不具备操作其他的服务的权限,即使这个AccessKey泄漏了,也不会影响其他的云服务, 相对安全。
接下来就来演示一下,如何创建子用户AccessKey。
6 配置权限
上述我们已经创建了子用户, 但是这个子用户,目前没有任何权限,接下来,我们需要为创建的这个用户来分配权限。
经过上述的权限配置之后,那么新创建的这个 reggie 用户,仅有短信服务操作的权限,不具备别的权限,即使当前的AccessKey泄漏了,也只会影响短信服务,其他服务是不受影响的。
7 禁用/删除AccessKey
如果在使用的过程中 AccessKey 不小心泄漏了,我们可以在阿里云控制台中, 禁用或者删除该AccessKey。
然后再创建一个新的AccessKey, 保存好AccessKeyId和AccessKeySecret。
注意: 创建好了AccessKey后,请及时保存AccessKeyId 和 AccessKeySecret ,弹窗关闭后将无法再次获取该信息,但您可以随时创建新的 AccessKey。
8 代码开发
使用阿里云短信服务发送短信,可以参照官方提供的文档即可。
官方文档: https://help.aliyun.com/product/44282.html?spm=5176.12212571.help.dexternal.57a91cbewHHjKq
我们根据官方文档的提示,引入对应的依赖,然后再引入对应的java代码,就可以发送消息了。
SDK : SDK 就是 Software Development Kit 的缩写,翻译过来——软件开发工具包,辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做SDK。在我们与第三方接口相互时, 一般都会提供对应的SDK,来简化我们的开发。
具体实现:
1). pom.xml
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.16</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
2). 将官方提供的main方法封装为一个工具类 (utils包中)
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
/**
* 短信发送工具类
*/
public class SMSUtils {
public static void sendMessage(String signName,
String templateCode,String phoneNumbers,String param){
DefaultProfile profile = DefaultProfile
.getProfile("cn-hangzhou",
"",
"");
IAcsClient client = new DefaultAcsClient(profile);
SendSmsRequest request = new SendSmsRequest();
request.setSysRegionId("cn-hangzhou");
request.setPhoneNumbers(phoneNumbers);
request.setSignName(signName);
request.setTemplateCode(templateCode);
request.setTemplateParam("{\"code\":\""+param+"\"}");
try {
SendSmsResponse response = client.getAcsResponse(request);
System.out.println(response.getMessage());
if(response.getMessage().contains("OK")){
System.out.println("短信发送成功");
}
}catch (ClientException e) {
e.printStackTrace();
}
}
}
备注 : 由于我们个人目前无法申请阿里云短信服务,所以这里我们只需要把流程跑通,具体的短信发送可以实现。
4 阿里云市场短信服务(推荐)
注册购买
第一步:云市场搜索短信服务
地址:https://market.aliyun.com/?spm=5176.19720258.J_8058803260.16.e9392c4a1drmWI
第二步:选择购买的短信服务
第三步:点击购买,有5条免费使用,测试也会消耗使用次数,用完了在付费购买即可
第四步:找到自己购买的云服务
在控制台中心,找到云市场,点击进入
可以看到已购买的服务
这里有几项重要信息:AppKey AppSecret AppCode 调用购买的这个短信服务接口时候需要用到,用于确认使用者身份
接口 : 调用该服务时访问的接口
第五步: 测试接口的使用
地址:https://market.aliyun.com/products/57126001/cmapi00037415.html?spm=5176.2020520132.101.2.2e377218GRmLvt#sku=yuncode3141500001
注意不是购买,往下翻,购买下方就是测试内容以及提供的模板内容,如果需要自定义签名和模板内容,联系客服申请
第六步: 调试接口测试,发送成功说明服务购买成功,可以使用
代码使用
第一步:参考API,在【API接口】中已经给出了Java代码怎么调用该服务的接口
地址https://market.aliyun.com/products/57126001/cmapi00037415.html?spm=5176.2020520132.101.2.2e377218GRmLvt#sku=yuncode3141500001
第二步:参考API,编写发送短信工具类
在pom.xml中导入
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>
SMSUtilsMarket工具类放入瑞吉项目util包中
按照参数进行调用,主要参数说明,参考SMSUtilsMarket文件中的注释
package com.itheima.reggie;
import cn.hutool.http.HttpRequest;
import java.util.HashMap;
import java.util.Map;
/**
* 短信发送工具类
*/
public class SMSUtilsMarket {
/**
* *****************************
添加http请求工具类在pom.xml中
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.15</version>
</dependency>
* *****************************
// 1.mobile 手机号,用户自己输入
String mobile = "";
// 2. code 验证码 ,程序自动随机生成
String code = "5790";
短信内容为 { 验证码:**code**,**minute**分钟内有效,请勿泄漏于他人!})
// 3. smsSignId 签名ID(联系客服申请,测试请用:2e65b1bb3d054466b82f0c9d125465e2)
String smsSignId="2e65b1bb3d054466b82f0c9d125465e2";
// 4. templateId 模板ID
(联系客服申请。测试ID请用:908e94ccf08b4476ba6c876d13f084ad,
String templateId="908e94ccf08b4476ba6c876d13f084ad";
// 5. appCode 应用code
在https://market.console.aliyun.com/imageconsole/index.htm?#/bizlist?_k=r5f9m0查找
String appCode = "";
*/
public static void sendMessage(String mobile,String code,
String smsSignId,
String templateId,
String appCode){
//请求连接
String host = "https://gyytz.market.alicloudapi.com/sms/smsSend";
//拼装请求体
Map<String, Object> querys = new HashMap<String, Object>();
querys.put("mobile", mobile);
querys.put("param", "**code**:"+code+",**minute**:5");
querys.put("smsSignId", smsSignId);
querys.put("templateId", templateId);
try {
String result = HttpRequest.post(host)
.header("Authorization", "APPCODE " + appCode)//头信息,多个头信息多次调用此方法即可
.form(querys)//表单内容
.timeout(20000)//超时,毫秒
.execute().body();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}