前言
- 阿里大于(原阿里大鱼)是阿里通信旗下产品,融合了三大运营商的通信能力。
- 阿里大于提供包括短信、语音、流量直充、私密专线、店铺手机号等个性化服务。
短信服务(Short Message Service)
是阿里云为用户提供的一种通信服务的能力,支持快速发送短信验证码、短信通知等。 三网合一专属通道,与工信部携号转网平台实时互联。电信级运维保障,实时监控自动切换,到达率高达99%。- 短信服务API提供短信发送、发送状态查询、短信批量发送等能力,在短信服务控制台上添加签名、模板并通过审核之后,可以调用短信服务API完成短信发送等操作。
一、开通短信服务
- 步骤一
- 步骤二:
- 步骤三:
- 步骤四:登录
- 步骤五:开通
- 步骤六:激活,有的需要有的不需要,我这里不需要,因为以前办理过阿里云业务
- 步骤七:充钱,一点点就好了,一条短信0.045
二、快速学习
最主要的是左边的侧边栏,都浏览一下,学习一下。
三、签名管理
1. 何为签名
你收到的垃圾短信中,或者验证码短信中的开头
2. 添加签名
需要两小时的审核
四、模板管理
1. 何为模板
就是短信内容
2. 添加模板
需要两小时的审核
五、Java中使用阿里大鱼
1. 开发文档
2. 用到的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.feng.alidayu</groupId>
<artifactId>alidayu-sendMessage</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>3.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-dysmsapi -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.29</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
3. 开发前注意的点
- 申请签名和模块,要求挺多,需要两小时。
- 需要申请 AccessKey , 可以在开发文档中
API参考
中AccessKey
文章中根据流程申请 - 申请之后还需要为 AccessKey 进行 赋予 权限 ``
4. 自己的开发案例
里面有的类不再编写,
package com.feng.alidayu;
import com.alibaba.fastjson.JSONObject;
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.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.springframework.util.StringUtils;
public class SendMessage {
/**
* 发送短信服务的参数
* accessKeyId 阿里云AK
* accessKeySecret 阿里云SK
* product 云通信短信API产品
* domain 产品域名
*/
//初始化ascClient需要的几个参数
static final String product = "Dysmsapi";//短信API产品名称(短信产品名固定,无需修改)
static final String domain = "dysmsapi.aliyuncs.com";//短信API产品域名(接口地址固定,无需修改)
//替换成你的AK
static final String accessKeyId = "yourAccessKeyId";//你的accessKeyId,参考本文档步骤2LTAI4GCRrneGRQfmX78mxKzm
static final String accessKeySecret = "yourAccessKeySecret";//你的accessKeySecret,参考本文档步骤 2WOjZlJVfOH4oOnCjPqasvlhq7UbmTK1
public static void main(String[] args) {
// 发送短信
sendSms();
}
/**
* 普通发送短信验证码接口
*/
public static void sendSms() {
String IP = "";
String method = "selectsms";
try {
//设置超时时间-可自行调整
System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
System.setProperty("sun.net.client.defaultReadTimeout", "10000");
//初始化ascClient,暂时不支持多region(请勿修改)
IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//使用post提交
request.setMethod(MethodType.POST);
//必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用的方式;发送国际/港澳台消息时,接收号码格式为国际区号+号码,如“85200000000”
request.setPhoneNumbers("1500000000");
//必填:短信签名-可在短信控制台中找到
request.setSignName("云通信");
//必填:短信模板-可在短信控制台中找到,发送国际/港澳台消息时,请使用国际/港澳台短信模版
request.setTemplateCode("SMS_1000000");
//向数据库中插入数据
// SmsActivationModel smsActivationModel = new SmsActivationModel();
//设置验证码
// smsActivationModel.setVerificationCode(sixValCode);
//设置入库时间
// smsActivationModel.setRecordTime(new Date());
//设置用户手机号
// smsActivationModel.setUserCode(phoneNo);
//可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
//友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含\r\n的情况在JSON中需要表示成\\r\\n,否则会导致JSON在服务端解析失败
//参考:request.setTemplateParam("{\"变量1\":\"值1\",\"变量2\":\"值2\",\"变量3\":\"值3\"}")
request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
//可选-上行短信扩展码(扩展码字段控制在7位或以下,无特殊需求用户请忽略此字段)
//request.setSmsUpExtendCode("90997");
//可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
request.setOutId("yourOutId");
//请求失败这里会抛ClientException异常
SendSmsResponse sendSmsResponse = null;
sendSmsResponse = acsClient.getAcsResponse(request);
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
// 请求成功
// int i = smsActivationService.insertSmsActivationModel(smsActivationModel);
}
} catch (ClientException e) {
System.out.println("ResponseCode.SYSTEM_REQ_FAIL: 短信服务系统参数错误");
} catch (ClassCastException e) {//请求参数格式错误
System.out.println("ResponseCode.SYSTEM_REQ_FAIL: 请求参数格式错误");
} catch (NumberFormatException e) {
System.out.println("ResponseCode.SYSTEM_REQ_FAIL: 请求参数格式错误");
} catch (Exception e) {//系统未知异常
System.out.println("ResponseCode.SYSTEM_REQ_FAIL: 短信服务系统参数错误");
}
}
/**
* 注册时使用
*
* @param data
* @return
*/
public static void regselectsms(JSONObject data) {
String IP = "";
String method = "regselectsms";
try {
String phoneNo = (String) data.get("phoneNo");
if (!StringUtils.isEmpty(phoneNo)) {
//检验手机号是否正确
String MPHONE_REGEX = "(\\+\\d+)?1[123456780]\\d{9}$";
if(!phoneNo.matches(MPHONE_REGEX)){
System.out.println("手机号输入错误");;
}
//判断用户是否存在 userbaseService 用户业务类,此处不再创建
if(userbaseService.selectUserbaseByPhone(phoneNo) != null){
System.out.println("用户不存在");;
}
//判断时间60秒内不能重复请求 smsActivationService 信息时间验证类,此处不再创建
if (smsActivationService.valTimeOut(phoneNo)) {
System.out.println("60s内重复请求短信服务");
}
//自助调整超时时间
System.setProperty("sun.net.client.defaultConnectTimeout", "300000");
System.setProperty("sun.net.client.defaultReadTimeout", "300000");
//初始化acsClient,暂不支持region化
IClientProfile profile = DefaultProfile.getProfile("cn-beijing", accessKeyId, accessKeySecret);
DefaultProfile.addEndpoint("cn-beijing", "cn-beijing", product, domain);
IAcsClient acsClient = new DefaultAcsClient(profile);
//组装请求对象
SendSmsRequest request = new SendSmsRequest();
//待发送手机号
request.setPhoneNumbers(phoneNo);
//短信签名-可在短信控制台中找到
request.setSignName("企通查");
//短信模板-可在短信控制台中找到
request.setTemplateCode("SMS_121146507");
//模板中的变量替换JSON串,如模板内容为"您的验证码为${code}"时,此处的值为
String sixValCode = CodeUtil.getSixValCode();
//向数据库中插入数据
// SmsActivationModel smsActivationModel = new SmsActivationModel();
//设置验证码
// smsActivationModel.setVerificationCode(sixValCode);
//设置入库时间
// smsActivationModel.setRecordTime(new Date());
//设置用户手机号
// smsActivationModel.setUserCode(phoneNo);
request.setTemplateParam("{\"code\":\"" + sixValCode + "\"}");
//此处可能会抛出异常,注意catch
//发短信
SendSmsResponse response = acsClient.getAcsResponse(request);
if (!"OK".equals(response.getCode())) {//短信发送失败
System.out.println("短信发送失败");
}
// int i = smsActivationService.insertSmsActivationModel(smsActivationModel);
} else {//缺少参数
System.out.println("手机号不能为空");;
}
} catch (ClientException e) {
System.out.println("短信服务系统参数错误");
} catch (ClassCastException e) {//请求参数格式错误
System.out.println("请求参数格式错误");
} catch (NumberFormatException e) {
System.out.println("请求参数格式错误");
} catch (Exception e) {//系统未知异常
System.out.println("请求参数格式错误");
}
}
}