阿里云短信推送_AliyunSMS

第一步:pom文件引入所需依赖包

    <!--aliyun短信发送-->
    <dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-core</artifactId>
		<version>3.5.1</version>
		<scope>compile</scope>
	</dependency>
	<dependency>
		<groupId>com.aliyun</groupId>
		<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
		<version>1.1.0</version>
		<scope>compile</scope>
	</dependency>

了解<scope></scope>:

<scope></scope>表示对于该包的依赖范围作用域,默认取值为compile。

<scope>test</scope>
test范围指的是测试范围有效,在编译和打包时都不会使用这个依赖。

<scope>compile</scope>
compile范围指的是编译范围有效,在编译和打包时都会将依赖存储进去。

<scope>provided</scope>
provided范围指的是在编译和测试的过程有效,最后生成war包时不会加入。

<scope>runtime</scope>
runtime在运行的时候依赖,在编译的时候不依赖。

第二步:配置文件

#阿里云短信配置
aliyun:
  sms:
    accessKeyId: ******                //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    accessKeySecret: ******            //此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    product: Dysmsapi                  //产品名称:云通信短信API产品,开发者无需替换
    domain: dysmsapi.aliyuncs.com      //产品域名,开发者无需替换
    regionId: cn-hangzhou
    signName: ******            //短信签名-可在短信控制台中找到
    dateFormat: yyyyMMdd
    endpointName: cn-hangzhou
    templateCode: ******      //短信模板-可在短信控制台中找到
    outId: yourOutId          //outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者

第三步:代码

1.阿里云短信配置类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Slf4j
@Component
@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "aliyun.sms")
public class AliyunSMSConfig {


    private String accessKeyId;
    private String accessKeySecret;
    private String product;
    private String domain;
    private String regionId;
    private String signName;
    private String dateFormat;
    private String endpointName;
    private String templateCode;
    private String outId;

}

 2.阿里云发送短信相关

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.ciip.cloud.core.common.util.SpringContextUtil;
import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Title: AliYunSMSSender
 * Description: 阿里云发送短信相关
 *
 */

@Component
@Slf4j
public class AliYunSMSSender {

    // 自动注册短信服务的配置
    @Autowired
    private AliyunSMSConfig smsConfig;
    

    public static SMS newSMS(){
        return new SMS();
    }

    // 一个短信实体
    @Data
    public static class SMS {
        private String phoneNumbers;
        private String templateParam;
        private String outId;
        private String templateCode;
        private String signName;
    }

    @Data
    public static class Result {
        private SendSmsResponse sendSmsResponse;
        private SMS sms;
    }

    //发送短信
    public static SendSmsResponse send(SMS sms) {
        AliYunSMSSender aliYunSMSSender = (AliYunSMSSender) SpringContextUtil.getBean("aliYunSMSSender");
        return aliYunSMSSender.sendSms(sms);
    }
    //发送短信
    public SendSmsResponse sendSms(SMS sms) {
        sms.setTemplateCode(StrUtil.isEmpty(sms.getTemplateCode())?smsConfig.getTemplateCode():sms.getTemplateCode());
        sms.setOutId(smsConfig.getOutId());
        IAcsClient acsClient = getClient();
        SendSmsRequest request = getRequest(sms);
        SendSmsResponse sendSmsResponse = null;
        try {
            sendSmsResponse = acsClient.getAcsResponse(request);
        } catch (ClientException e) {
            log.error("发送短信发生错误。错误代码是 [{}],错误消息是 [{}],错误请求ID是 [{}],错误Msg是 [{}],错误类型是 [{}]", e.getErrCode(), e.getMessage(), e.getRequestId(), e.getErrMsg(), e.getErrorType());
            e.printStackTrace();
        }
        return sendSmsResponse;
    }

    // 获取短信请求
    private SendSmsRequest getRequest(SMS sms) {
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(sms.getPhoneNumbers());
        request.setSignName(StrUtil.isEmpty(sms.getSignName())?smsConfig.getSignName():sms.getSignName());
        request.setTemplateCode(sms.getTemplateCode());
        request.setTemplateParam(sms.getTemplateParam());
        request.setOutId(sms.getOutId());
        return request;
    }
    
    // 获取短信发送服务机
    private IAcsClient getClient() {
        IClientProfile profile = DefaultProfile.getProfile(smsConfig.getRegionId(), smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
        try {
            DefaultProfile.addEndpoint(smsConfig.getEndpointName(), smsConfig.getRegionId(), smsConfig.getProduct(), smsConfig.getDomain());
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return new DefaultAcsClient(profile);
    }
    
    // 构建一个查询器
    @Data
    public static class Query {

        /** 业务ID */
        private String bizId;
        private String phoneNumber;
        private Date sendDate;
        private Long pageSize;
        private Long currentPage;
    }

    /**
     * 查询短信发送结果
     * @param query 查询条件
     */
    public QuerySendDetailsResponse querySendDetails(Query query) {
        IAcsClient acsClient = getClient();
        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
        request.setPhoneNumber(query.getPhoneNumber());
        request.setBizId(query.getBizId());
        SimpleDateFormat ft = new SimpleDateFormat(smsConfig.getDateFormat());
        request.setSendDate(ft.format(query.getSendDate()));
        request.setPageSize(query.getPageSize());
        request.setCurrentPage(query.getCurrentPage());
        QuerySendDetailsResponse querySendDetailsResponse = null;
        try {
            querySendDetailsResponse = acsClient.getAcsResponse(request);
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return querySendDetailsResponse;
    }



}

 3.阿里云发送短信接口


import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;


/**
 * 阿里云发送短信接口
 * 
 */
public class AliYunSMSUtils {
    

    /**
     * 短信验证码信息
     *            
     * @param code
     * @param phone
     * @return
     */
    public static String sendValidateCode(String code,String phone){
        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");

        AliYunSMSSender.SMS sms= AliYunSMSSender.newSMS();
        sms.setPhoneNumbers(phone);

        //必填:短信签名-可在短信控制台中找到
        sms.setSignName("XXXXXX");   

        //必填:短信模板-可在短信控制台中找到
        sms.setTemplateCode("SMS_XXXXXX");

        sms.setTemplateParam("{\"code\":\""+code+"\"}");

        SendSmsResponse sendSmsResponse = AliYunSMSSender.send(sms);

        if(sendSmsResponse.getCode() != null) {
            return sendSmsResponse.getCode();
        }else {
            return null;
        }
    }

4.controller类:

    /**
     * 获取手机验证码
     * @param sourceType 来源类型
     * @param mobile  手机号
     * @param request
     * @return
     */
    @ApiOperation(value="获取手机验证码", notes = "")
    @PostMapping(value =  CIIPCommonConstant.ApiAuth.ANON +"/register/getMobileValidateCode")
    public ResponseMessage  getMobileValidateCode(@RequestParam(value = "sourceType",required = true) String sourceType,
                                                  @RequestParam(value = "mobile",required = true) String mobile, HttpServletRequest request){
        return ciipUserService.getMobileValidateCode(sourceType,mobile,request);
    }

5.service层:

    /**
     * 获取手机验证码
     * @param mobile  手机号
     * @param request 请求对象
     * @return
     */
    ResponseMessage getMobileValidateCode(String type,String mobile, HttpServletRequest request);

 6.service实现层:

 @Override
    public ResponseMessage getMobileValidateCode(String type,String mobile, HttpServletRequest request) {
        if(StringUtils.isEmpty(type)||StringUtils.isEmpty(mobile)){
            return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
        }
        //此处是生成6位数验证码工具类
        String validateCode = CoreUtils.randomString(6, true);

        //响应code
        String respCode=null;
        if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.BINDING)){
            //手机绑定  
            respCode = AliYunSMSUtils.sendValidateCode(validateCode, mobile);
        }else if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.UPDATE)){
            //手机变更  
            respCode = AliYunSMSUtils.sendValidateCode(validateCode, mobile);
        }else{
            return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
        }

        //发送成功后存入redis
        if(respCode!=null){
            //默认,300s,5分钟过期
            int time=300;

            //TODO 这里根据来源类别来存储不同类型的验证码
            if(type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.BINDING)){
                //手机绑定 ->验证码 
                redisUtil.setWithExpireTime(CIIPCommonConstant.CIIP_PROTAL, CIIPCommonConstant.VALIDATE_CODE_KEY_BINDING + mobile,JSON.toJSONString(validateCode), time);
            }else if (type.equals(CIIPCommonConstant.MobileValidateCodeSouceType.UPDATE)){
                //手机变更 ->验证码  
                redisUtil.setWithExpireTime(CIIPCommonConstant.CIIP_PROTAL, CIIPCommonConstant.VALIDATE_CODE_KEY_UPDATE+ mobile,JSON.toJSONString(validateCode), time);
            }else {
                return ResultUtil.error(UserCenterStatusCode.PARAM_ERROR.getCode(),UserCenterStatusCode.PARAM_ERROR.getMsg());
            }
            return ResultUtil.success(UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_SUCCESS.getCode(),UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_SUCCESS.getMsg());
        }
        return ResultUtil.error(UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_ERROR.getCode(),UserCenterStatusCode.REG_SEND_MOBLIE_VALIDATE_ERROR.getMsg());
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值