阿里云短信服务Java实现

阿里云短信服务Java实现文章目录 1 阿里云用户权限 2 开通阿里云短信服务 3 帮助文档 4 编写测试代码真实项目应用 1 阿里云用户权限阿里云平台有很多业务 用户登录阿里云之后 要想使用业务 必须开通该业务的权限登录阿里云网站 点击右上角头像查看个人信息 点击 accesskey 选择开始使用子账户添加用户组 类似于 Linux 中的用户组和用户新创建用户组默认没有权限 点击添加权限 可以看到阿里所有权限搜索短信 sms 添加在用户组中添加用户 勾选允许编程访问创建成功后 会生成新用户组用户 accesskey

1.阿里云用户权限

阿里云平台有很多业务,用户登录阿里云之后,要想使用业务,必须开通该业务的权限

小结:

  1. 开启子账户
  2. 新建用户组,添加权限
  3. 用户组中添加用户,具体用来操作的账号
  4. 得到acesskey,妥善保管,一旦泄露,立即删除或禁用

2.开通阿里云短信服务

在阿里云界面搜索短信服务,可以看到短信服务页面。

在这里我们可以学习,添加模板,计费规则,规则设置,安全设置

在这里插入图片描述
在这里插入图片描述
短信模板包含几个部分,签名、code(验证码),内容(写死)

在这里插入图片描述
注意模板内容中的变量,我们写程序时要准备好,申请说明要理由正当,提交后几分钟会收到结果

在这里插入图片描述

写好签名后,发送的短信会自动带【】,个人用户只能选一种适用场景,我们选验证码就可以,申请说明写正当理由

申请理由不好,可能会重复申请好几次

小结:

  1. 搜索并进入短信服务面板
  2. 找到帮助文档
  3. 添加短信模板,签名,需要申请理由正当,等待审核通过

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号