1.阿里云用户权限
阿里云平台有很多业务,用户登录阿里云之后,要想使用业务,必须开通该业务的权限
小结:
- 开启子账户
- 新建用户组,添加权限
- 用户组中添加用户,具体用来操作的账号
- 得到acesskey,妥善保管,一旦泄露,立即删除或禁用
2.开通阿里云短信服务
在阿里云界面搜索短信服务,可以看到短信服务页面。
在这里我们可以学习,添加模板,计费规则,规则设置,安全设置
短信模板包含几个部分,签名、code(验证码),内容(写死)
注意模板内容中的变量,我们写程序时要准备好,申请说明要理由正当,提交后几分钟会收到结果
写好签名后,发送的短信会自动带【】,个人用户只能选一种适用场景,我们选验证码就可以,申请说明写正当理由
申请理由不好,可能会重复申请好几次
小结:
- 搜索并进入短信服务面板
- 找到帮助文档
- 添加短信模板,签名,需要申请理由正当,等待审核通过
3.帮助文档
4.编写测试代码
创建springboot项目,
添加依赖,aliyun-java-sdk-core
fastjson
spring-boot-starter-data-redis
其中redis用来缓存用户信息
编写测试代码,从 api demo 拷贝来的
// This file is auto-generated, don't edit it. Thanks. package com.aliyun.sample; import com.aliyun.tea.*; import com.aliyun.dysmsapi.*; import com.aliyun.dysmsapi.models.*; import com.aliyun.teaopenapi.*; import com.aliyun.teaopenapi.models.*; public class Sample {
/ * 使用AK&SK初始化账号Client * @param accessKeyId * @param accessKeySecret * @return Client * @throws Exception */ public static com.aliyun.dysmsapi.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
Config config = new Config() // 您的AccessKey ID .setAccessKeyId(accessKeyId) // 您的AccessKey Secret .setAccessKeySecret(accessKeySecret); // 访问的域名 config.endpoint = "dysmsapi.aliyuncs.com"; return new com.aliyun.dysmsapi.Client(config); } public static void main(String[] args_) throws Exception {
java.util.List<String> args = java.util.Arrays.asList(args_); com.aliyun.dysmsapi.Client client = Sample.createClient("accessKeyId", "accessKeySecret"); SendSmsRequest sendSmsRequest = new SendSmsRequest() .setPhoneNumbers("") .setSignName("") .setTemplateCode(""); // 复制代码运行请自行打印 API 的返回值 client.sendSms(sendSmsRequest); } }
注意老版本的demo中部分方法已经和依赖包不匹配了,需要自行调整方法名
代码中相应的参数,填写我们在短信服务控制台设置好的一些模板、签名参数,账号、密码
真实项目应用
springboot项目
- 创建接口,根据api模板编写实现类,接收参数也就是用户手机号,运行代码,阿里云将向手机号发送短信消息,费用将从我们的阿里云账户扣除
接口:
手机号从用户获取,模板、code来自于我们在阿里云设置好的参数
public interface SendSms {
public boolean send(String phoneNum, String templateCode, Map<String, Object> code); }
实现类
@Service public class SendSmsImpl implements SendSms {
@Override public boolean send(String phoneNum, String templateCode, Map<String, Object> code) {
// 连接阿里云 // 第一个参数一般不动,后面两个参数是我们申请用户组时保存的账户,密码 DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", "<accessKeyId>", "<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); // 构建请求 CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); request.setDomain("dysmsapi.aliyuncs.com"); // 不要动 request.setVersion("2017-05-25"); // 不要动 request.setAction("SendSms"); // 自定义的参数,手机号,验证码,签名,模板 request.putQueryParameter("PhoneNumbers", phoneNum); request.putQueryParameter("SignName", "签名");// 签名一般不变 request.putQueryParameter("TemplateCode", templateCode);// 对应阿里云短信控制台我们设置的模板名 request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code));// code验证码 try {
CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); // 构建成功返回true return response.getHttpResponse().isSuccess(); } catch (ServerException e) {
e.printStackTrace(); } catch (ClientException e) {
e.printStackTrace(); } // 构建失败返回false return false; } }
编写controller接口
@RestController @CrossOrigin // 支持跨域访问 public class SmsApiController {
@Autowired private SendSms sendSms; @Autowired private RedisTemplate<String,String> redisTemplate; @GetMapping("/send/{phone}") public String code(@PathVariable("phone") String phone) {
// 调用方法发送,模拟真实业务使用redis String code = redisTemplate.opsForValue().get(phone); if (!StringUtils.isEmpty(code)) {
return phone + ":" + code + "已存在,还没有过期"; } // 生成验证码并存储到redis中 code = UUID.randomUUID().toString().substring(0,4); HashMap<String,Object> map = new HashMap<>(); map.put("code", code); boolean isSend = sendSms.send(phone, "自己的模板code", map); if (isSend) {
redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.SECONDS); return phone + ":" + code + "发送成功"; } else {
return "发送失败"; } } }
启动测试,访问网址,查看是否可以接收短信
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233251.html原文链接:https://javaforall.net