这个短信服务我感觉还是蛮良心的,可以提供免费测试,新用户注册好像是免费测试133条短信
官方文档
附上官方地址链接:容联云短信服务 Java SDK 参考文档
使用详解
这里直接贴上我的代码案例得了(简化版,易阅读)
1、导入 Maven 依赖
<dependency>
<groupId>com.cloopen</groupId>
<artifactId>java-sms-sdk</artifactId>
<version>1.0.3</version>
</dependency>
2、编写 Service 接口以及实现类
编写业务方法,这里是详情案例
省略了一些判空逻辑和 Redis 的限时判断查询,主要是看 SDK 如何使用
@Service
public class MessageApiServiceImpl implements MessageApiService {
/**
* ACOUNT SID 和 AUTH TOKEN 在登陆官网后,在 “应用-管理控制台” 中查看开发者主账号获取
*
* 正式上线需要使用自己创建的应用的 App ID
* APP ID 的获取:登陆官网,在“应用-应用列表”,点击应用名称,看应用详情获取 APP ID
*
* templa id : 模板 id,在平台上创建的短信模板的ID值,测试的时候可以使用系统的默认模板,id 为 1。
*/
private final String ACOUNT_SID = "8aaf07088****************d2039f";
private final String ACOUNT_TOKEN = "918bc1***************977e888a3a";
private final String APP_ID = "8aaf070880***************03a6"; //测试用
private final String TEMPLATE_ID = "1";
private final String SERVER_IP = "sandboxapp.cloopen.com";
private final String SERVER_PORT = "8883";
/**
* 发送手机验证码
* @param phone 手机号
* @param code 程序生成随机的验证码
* @return 发送成功or失败
*/
@Override
public boolean send(String phone, String code) {
HashMap<String, Object> result = null;
// 初始化 SDK
CCPRestSmsSDK restAPI = new CCPRestSmsSDK();
// 初始化服务器 IP 地址和端口
// 测试环境:restAPI.init("sandboxapp.cloopen.com", "8883");
// 生产环境:restAPI.init("app.cloopen.com", "8883");
restAPI.init(SERVER_IP, SERVER_PORT);
// 初始化主帐号和主帐号令牌
restAPI.setAccount(ACOUNT_SID,ACOUNT_TOKEN);
// 初始化应用 ID
restAPI.setAppId(APP_ID);
// 发送短信
// 第一个参数:你的测试手机号
// 第二个参数:模板 id,因为创建模板需要提供公司的营业执照、线上网站的链接等信息,所以我们采用测试用的模板 id:"1"
// 第三个参数:数组第一个参数存放验证码,数组第二个参数存放模板内容:例:【云通讯】您使用的是云通讯短信模板,您的验证码是{123456},请于{5}分钟内正确输入
result = restAPI.sendTemplateSMS(phone,TEMPLATE_ID,new String[] {code,"5"});
// 为什么用 000000 判断?因为官方指定的成功返回值就是 000000,待会在下面放个截图证明
if("000000".equals(result.get("statusCode"))){
//正常返回输出 data 包体信息(map)
HashMap<String,Object> data = (HashMap<String, Object>) result.get("data");
Set<String> keySet = data.keySet();
for(String key:keySet){
Object object = data.get(key);
System.out.println(key +" = "+object);
}
return true;
}else{
// 异常返回输出错误码和错误信息
System.out.println("错误码=" + result.get("statusCode") +" 错误信息= "+result.get("statusMsg"));
return false;
}
}
@Override
public boolean send(HashMap smsMap) {
if(!StringUtils.isEmpty(smsMap.get("phone"))) {
String code = (String)smsMap.get("code");
return this.send(smsMap.get("phone").toString(),code);
}
return false;
}
}
获取初始化参数的途径
代码为什么要用 000000 判断?
官方文档都有解释的:短信错误码
不能单纯的返回 true 或者 false,因为状态太多了,布尔类型只有两个值,不足以判断那么多种情况
默默说一句,如果这里用枚举类型来判断的话,就显而易见了,就避免了让用户来猜测:“为什么用000000” 来判断呢?这种情况的发生。
若使用枚举 SEND_SUCCESS ,直接不用猜了
if(SMSUtils.SEND_SUCCESS.getStatus().equals(result.get("statusCode"))){ }
不过这只是我的猜测,枚举其实也有优劣,这里不细说
3、编写 Controller
@RestController
@RequestMapping(value = "/api/sms")
public class MessageApiController {
@Resource
private MessageApiService messageApiService;
/**
* @param phone 手机号
*/
@GetMapping("sendCode/{phone}")
private CommonResult sendCode(@PathVariable("phone") String phone) {
// 生成六位随机数,作为验证码
code = RandomUtils.getSixBitRandom();
boolean isSend = messageApiService.send(phone,code);
// 发送成功,然后将message放入redis计时
// 设置 ttl 过期时间,五分钟内有效
return new CommonResult(ResultCodeEnum.SUCCESS);
}
}