手机短信发送

使用场景 : 手机验证码, 一般作为权限校验 , 授权 , 消息通知等

配合使用 : 如果作为短信验证码 , 则一般配合redis使用 , 如果是普通的短信通知则不需要

以阿里云实现验证码为例:

java实现
1&.短信验证接口

@GetMapping("/getMessageCode/{phone}")
public Result getMessageCode(@PathVariable String phone) {
    String messageCode = RandomUtils.getUUIDRandom(4);
    System.out.println(phone);
    if (StringUtils.isEmpty(phone) || !FormUtils.isMobile(phone)) {
        return new Result(false, StatusCode.ERROR, "手机号为空或不合法");
    }
    //执行发送短信的逻辑
    userRegisterService.sendMessageCode(phone, messageCode);
    //将验证码存入redis
    redisTemplate.opsForValue().set(CacheKey.USER_PHONE + phone, messageCode, 60, TimeUnit.MINUTES);
    return new Result(true, StatusCode.OK, "短信发送成功,60s后过期");
}

2&.发送短信逻辑

public void sendMessageCode(String phone,String messageCode) {

        //创建远程连接客户端对象
        DefaultProfile profile = DefaultProfile.getProfile(
                smsProperties.getRegionId(),
                smsProperties.getKeyId(),
                smsProperties.getKeySecret());
        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("RegionId", smsProperties.getRegionId());
        request.putQueryParameter("PhoneNumbers", phone);
        request.putQueryParameter("SignName", smsProperties.getSignName());
        request.putQueryParameter("TemplateCode", smsProperties.getTemplateCode());

        Gson gson = new Gson();
        Map<String, String> map = new HashMap<>();
        map.put("code", messageCode);
        String json = gson.toJson(map);
        request.putQueryParameter("TemplateParam", json);

        //使用客户端对象携带请求对象发送请求并得到响应结果
        CommonResponse response = null;
        try {
            response = client.getCommonResponse(request);
        } catch (ClientException e) {
            log.error("短信发送失败:" + ExceptionUtils.getStackTrace(e));
            throw new RuntimeException("发送短信连接失败");
        }

        String data = response.getData();
        HashMap<String, String> resultMap = gson.fromJson(data, HashMap.class);
        String code = resultMap.get("Code");
        String message = resultMap.get("Message");

        if("isv.BUSINESS_LIMIT_CONTROL".equals(code)){
            log.error("短信发送过于频繁:code = " + code + ",message = " + message);
            throw new RuntimeException("发送短信过于频繁");
        }

        if(!"OK".equals(code)){
            log.error("短信发送失败:code = " + code + ",message = " + message);
            throw new RuntimeException("短信发送失败");
        }
    }

3& 相关参数及依赖配置

 @Data
@Component
//注意prefix要写到最后一个 "." 符号之前
@ConfigurationProperties(prefix="aliyun.sms")
public class MessageProperties {
	private String regionId;
	private String keyId;
 	private String keySecret;
	private String templateCode;
	private String signName;
}
//yml配置
aliyun:
	 sms:
		regionId: *****
		keyId: *****
		keySecret: *****
		templateCode: *****
		signName: *****

pom.xml依赖

	<dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-vod</artifactId>
        <version>2.15.2</version>
    </dependency>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值