容联云短信服务使用(Java SDK)

311 阅读3分钟

这个短信服务我感觉还是蛮良心的,可以提供免费测试,新用户注册好像是免费测试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;
    }
}

获取初始化参数的途径

W6GIZONTHLHRPRL.png

A6F5TY0F7.png

代码为什么要用 000000 判断?

官方文档都有解释的:短信错误码

不能单纯的返回 true 或者 false,因为状态太多了,布尔类型只有两个值,不足以判断那么多种情况

默默说一句,如果这里用枚举类型来判断的话,就显而易见了,就避免了让用户来猜测:“为什么用000000” 来判断呢?这种情况的发生。

若使用枚举 SEND_SUCCESS ,直接不用猜了

if(SMSUtils.SEND_SUCCESS.getStatus().equals(result.get("statusCode"))){ }

不过这只是我的猜测,枚举其实也有优劣,这里不细说

RU.png

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);
    }
}