短信业务用户:
用户登录名称 sms@1683247591077299.onaliyun.comAccessKey ID LTAI5tEB5qwx5uains3ia9Li AccessKey Secret vhwlGWI30bkIFszOmJLusHaQMv5MvL
1、了解阿里云用户权限操作
一、登录阿里云,进入控制台,点击右上角头像,选择 【AccessKey 管理】。
二、点击 【开始使用子用户 AccessKey】。
三、点击左侧菜单栏【用户组】,然后点击【创建用户组】,填写相关信息,点击【确认】完成用户组的创建。
用户组:用户组里面可以添加很多用户,可以给用户组分配权限,这样用户组里面的所有用户就都拥有这些权限了,避免反复分配权限!
四、创建好用户组后,点击用户组列表右侧的【添加权限】,然后搜索 sms,选择 AliyunDysmsFullAccess:管理短信服务(SMS)的权限,点击【确认】为用户组添加 sms 权限。
五、点击左侧菜单栏【用户】,然后点击【创建用户】,填写相关信息,勾选 编程访问,点击【确认】完成用户的创建。
注意:勾选编程访问后,创建完用户会显示 AccessKey 信息并提示你保存好,一定要将AccessKey 信息妥善保存,避免用的时候找不到,AccessKey Secret只在当前页显示一次!
如果AccessKey 信息不小心被他人获取,可以在用户详情的认证管理对该AccessKey进行【禁用】或者【删除】。
六、点击【添加到用户组】,将创建好的用户添加到创建好的用户组里。
可以发现用户会自动继承所属用户组的权限。
2、开通阿里云短信服务
一、搜索款搜索 短信服务,点击【短信服务】,进入短信服务控制台。
二、点击左侧菜单栏的【快速学习】,开通短信服务并快速了解短信服务相关信息。
可以测试短信发送,了解短信计费规则等。
3、添加短信模板
一、选择左侧菜单【国内消息】,选择【模板管理】,点击【添加模板】。
二、填写相关内容(申请说明,需要正当理由),填写完后等待审核。
4、添加签名(公司的名称)
一、选择左侧菜单【国内消息】,选择【管理】,点击【添加模板】。
二、填写相关内容(适用场景选择 验证码,申请说明,需要正当理由,一般是人工审核),填写完后等待审核。
5、编写测试代码
一、选择左侧【快速学习】,点击下方的查看【API Demo】,跳转到API Demo的页面,可以查看示例代码。
现在更新了:变成了升级版的sdk,但是原版的也不是不可以用!!

升级版:
二、创建空的Springboot项目。
三、添加Maven依赖。
<!-- 阿里云SDK-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.3</version>
</dependency>
<!-- json工具类 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
<!-- Redis:验证码一定时间内需要过期,所以验证码应当放在redis里面存储一份! -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
四、编写测试代码。
package com.cxy;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.rmi.ServerException;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class AliyunSmsApplicationTests {
@Test
public void contextLoads() {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 构建请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com"); // 不要动
request.setSysVersion("2017-05-25"); // 不要动
request.setSysAction("SendSms");
// 自定义参数(手机号,验证码,签名,模板)
request.putQueryParameter("PhoneNumbers", "17674102xxx"); // 手机号
request.putQueryParameter("SignName", "xxx"); // 签名
request.putQueryParameter("TemplateCode", "SMS_199770xxx"); // 模版Code
// 构建一个信息的验证码
Map<String,Object> param = new HashMap<>();
param.put("code",569712);
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //短信参数
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
} catch (ClientException e) {
e.printStackTrace();
}
}
}
6、编写可复用的微服务接口,实现验证码的发送
一、创建service接口 SendSms
package com.cxy.service;
import java.util.Map;
public interface SendSms {
boolean send(String PhoneNumbers, String TemplateCode, Map<String,Object> code);
}
二、创建service实现类 SendSmsImpl
package com.cxy.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class SendSmsImpl implements SendSms {
/**
* 发送短信
* @param PhoneNumbers 手机号
* @param TemplateCode 模板code
* @param code 短信参数(验证码)
* @return
*/
@Override
public boolean send(String PhoneNumbers, String TemplateCode, Map<String, Object> code) {
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
// 构建请求
CommonRequest request = new CommonRequest();
request.setSysMethod(MethodType.POST);
request.setSysDomain("dysmsapi.aliyuncs.com"); // 不要动
request.setSysVersion("2017-05-25"); // 不要动
request.setSysAction("SendSms");
// 自定义参数(手机号,签名,模板,验证码)
request.putQueryParameter("PhoneNumbers", PhoneNumbers); // 手机号
request.putQueryParameter("SignName", "xxx"); // 签名
request.putQueryParameter("TemplateCode", TemplateCode); // 模版Code
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(code)); // 短信参数(验证码)
try {
CommonResponse response = client.getCommonResponse(request);
System.out.println(response.getData());
return response.getHttpResponse().isSuccess();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
三、创建controller控制器 SmsApiController
package com.cxy.controller;
import com.cxy.impl.SendSms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@RestController
public class SmsApiController {
@Autowired
private SendSms sendSms;
@Autowired
private RedisTemplate<String,String> redisTemplate;
@GetMapping("/send/{phone}")
public String code(@PathVariable("phone") String phone){
String code = redisTemplate.opsForValue().get(phone);
if (!StringUtils.isEmpty(code)){
return phone + ":" + code + "已存在,还没有过期";
}
code = (int)((Math.random()*9+1)*100000) + ""; // 生成6位随机数
Map<String,Object> param = new HashMap<>();
param.put("code",code);
boolean result = sendSms.send(phone, "SMS_199770xxx", param);
if (result){
redisTemplate.opsForValue().set(phone,code,5, TimeUnit.MINUTES);
return phone + ":" + code + "已发送成功";
}
return "发送失败";
}
}
4、打开Redis服务,启动项目,测试访问。