在最近的项目需求中, 需要将复用阿里短信能力, 实现用户手机号验证: 如果用户号码验证通过后, 可以让用户上传文件资料并进行打印.
故核心内容就是: 阿里云短信服务接入, 下面我们主要来介绍下阿里云短信服务接入流程
进入阿里云短信服务新手指引页面
可以看到整个对接流程如下图所示:
每个过程如下图所示:
注册后登录云通信产品试用界面
进行实名认证,如下图所示
开通短信服务
购买免费的短信包, 然后零元购后就可以在短信控制台进行配置
点击进入 阿里云短信服务控制台. 这里可以修改每分钟, 每小时, 每天发送信息的频率
获取AccessKey
在阿里云短信服务控制台右上角点击AccessKey管理
创建用户组
配置用户组权限
在用户组-添加组成员页面新建用户
新建用户
新建用户配置(该用户属于子用户, 用于发送短信)
复制并保存 AccessKey ID和AccessKey Secret, 以便在后续SDK中使用
(这一步非常重要, 因为AccessKey ID 和 AccessKey Secret只显示一次, 无法找回, 只能重新生成)
注意: 如果仅仅测试的话, 可以跳过添加签名和添加模板步骤. 直接调用sdk, 并使用无限制的测试签名和模板进行测试
创建模板
模板就是指短信模板, 具体就是在发送验证短信时, 短信发送内容的模板
配置短信模板内容后进行审核, 审核通过即可使用
注意: 这里因为使用sdk进行测试调用, 因此无需等待签名和模板审核成功. 使用下面短信测试专用的签名和模板编码即可
SignName: 阿里云短信测试
,
TemplateCode: SMS_154950909
整体流程
进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 下载jar包->封装并复用代码
配置测试手机号
因为使用的是测试模板和签名, 因此需要我们配置用于测试的手机号
否则则会提示: 只能向已回复授权信息的手机号发送
在线调用sdk
这里调用成功后, 就会发送短信.
查看是否调用成功(成功后复制sdk代码)
发起调用成功并收到短信后(如下图), 复制上图右侧生成的sdk示例代码到项目中
添加依赖( 获取sdk的jar包 )
如果是maven项目. 直接复制下图展示的Maven坐标
注意: 如果是SSM/JavaEE项目(需要手动放入jar), 配置过程如下
直接将下图包放到指定目录下(博客底部会将jar分享)
在 Project Structure
->Libraries
中, 将lib下面的jar添加到项目中
选择jar所在目录, 添加后如下图所示
添加成功后, 对应的sdk代码则不会报红, 项目也可以正常运行
将上一步的sdk方法进行封装
这里主要有三个方法: 第一个用于使用AK&SK初始化账号Client, 第二个用于生成6位验证码. 第三个用于获取发送短信结果
import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.stereotype.Component;
/**
* info:
*
* @Author caoHaiYang
* @Date 2022/8/29 11:47
*/
@Component
public class SendSms {
public static final String accessKeyId = "你的accessKeyId ";
public static final String accessKeySecret = "你的accessKeySecret ";
public static final String templateCode = "SMS_154950909";
public static final String signName = "阿里云短信测试";
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new com.aliyun.teaopenapi.models.Config()
// 您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// 访问的域名
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
/**
* 获取6位验证码
* @return
*/
public String getVerifyCode() {
Long codeL = System.nanoTime();
String codeStr = Long.toString(codeL);
String verifyCode = codeStr.substring(codeStr.length() - 6);
System.out.println("生成的6位验证码为:" + verifyCode);
return verifyCode;
}
/**
* 发送短信
* @param phoneNumber 手机号
* @throws Exception
* @return 短信验证码(如果为null说明出现错误)
*/
public String sendMessage(String phoneNumber) throws Exception {
//随机生成6位验证码
String verifyCode = this.getVerifyCode();
Client client = SendSms.createClient(accessKeyId, accessKeySecret);
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setPhoneNumbers(phoneNumber)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam("{\"code\":\""+verifyCode+"\"}");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
SendSmsResponse sendSmsResponse = client.sendSmsWithOptions(sendSmsRequest, runtime);
System.out.println(sendSmsResponse.getBody().getMessage());
return verifyCode;
} catch (TeaException error) {
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
}
return null;
}
}
新建短信发送业务
/**
* 发送短信业务
* @Author caoHaiYang
* @Date 2022/8/29 13:47
*/
public interface SendMessageService {
/**
* 短信发送接口
* @param phoneNumber
* @return
*/
int sendMessage(String phoneNumber) throws Exception;
/**
* 验证短信码
* @param phoneNumber
* @param verifyCode
* @return
*/
int verifyMessageCode(String phoneNumber, String verifyCode);
}
创建业务实现类
这里的逻辑就是:
发送短信接口传入手机号之后, 调用sendSms.sendMessage
返回验证码, 然后将手机号作为key验证码作为value放入redis中并设置过期时间. 而在验证短信码接口调用时: 根据传入的手机号去redis中查验证码, 将查询到的验证码和接口传入的验证码进行比对. 成功返回1, 不成功返回0
import com.ring.config.Constants;
import com.ring.config.JedisPoolUtil;
import com.ring.model.BannerBean;
import com.ring.service.SendMessageService;
import com.ring.sms.SendSms;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;
import javax.annotation.Resource;
/**
* info:
*
* @Author caoHaiYang
* @Date 2022/8/29 16:07
*/
@Service
public class SendMessageServiceImpl implements SendMessageService {
@Resource
private SendSms sendSms;
@Override
public int sendMessage(String phoneNumber) throws Exception {
//通过阿里sms发送短信
String verifyCode = sendSms.sendMessage(phoneNumber);
if (StringUtils.isEmpty(verifyCode)) {
return 0;
}
//将短信保存到redis中
Jedis jedis = null;
try {
jedis = JedisPoolUtil.getJedis();
jedis.auth(Constants.REDIS_PASSWORD);
jedis.select(Constants.REDIS_DB);
jedis.setex(phoneNumber, 600, verifyCode);
return 1;
} catch (Exception e) {
e.printStackTrace();
}
return -1;
}
@Override
public int verifyMessageCode(String phoneNumber, String verifyCode) {
Jedis jedis = null;
try {
jedis = JedisPoolUtil.getJedis();
jedis.auth(Constants.REDIS_PASSWORD);
jedis.select(Constants.REDIS_DB);
String currentVerifyCode = jedis.get(phoneNumber);
if (verifyCode.equals(currentVerifyCode)) {
return 1;
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
}
生成代码操作
在测试完短信验证码后, 我们可以根据以下流程流程编写其他接口代码
进入OpenApi页面 -> 添加参数 -> 发起调用 -> 复制生成的sdk代码 -> 封装并复用代码
当前阿里云短信服务可以提供的接口如下图所示
发送成功后, 可以在短信服务控制台查看发送详情
查看指定时段短信发送量
查看短信具体发送内容
https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg?pwd=pces
链接:https://pan.baidu.com/s/1a3FeYANNIEo8ZvO5tIPeJg
关注后进入私聊, 回复括号内关键字[ 短信服务 ] 获取阿里云短信服务jar包提取码