java 阿里云实现发送短信验证码

1.先去阿里云开通短信服务:
在这里插入图片描述
2.添加模板及签名:
标准参照:https://help.aliyun.com/document_detail/55324.html?spm=5176.sms-sign.0.0.765c1cbeNhvWBZ
在这里插入图片描述
去申请模板及签名:
在这里插入图片描述
3.创建自己的访问秘钥(AccessKeyId 与 AccessKeySecret)
在这里插入图片描述
4.代码编写,引入jar包

<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.5.3</version>
</dependency>

相关配置代码:

.yml文件添加阿里云短信相关配置:
// TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
xx:
  #阿里云短信
  aliyunMessage:
    accessKeyId: xxxxxxxxxxxxxxxxxxxx   // TODO 改这里
    secret: xxxxxxxxxxxxxxxxxxx   // TODO 改这里
    regionid: cn-hangzhou
    signName: XXX   // TODO 改这里   这里是短信签名


@Getter
@Configuration
 public class AliyunMessageConfig {
    @Value("$xx.aliyunMessage.secret}")
    private String secret;
    @Value("${xx.aliyunMessage.accessKeyId}")
    private String accessKeyId;
    @Value("${xx.aliyunMessage.regionid}")
    private String regionid;
    @Value("${xx.aliyunMessage.signName}")
    private String signName;
    @Bean
    public IAcsClient aliyunClient() {
        DefaultProfile profile = DefaultProfile.getProfile(regionid, accessKeyId, secret);
        return new DefaultAcsClient(profile);
    }
}

/**
 * @description:
 * @author: zhangt
 * @create: 2021-4-14
 **/
public enum MessageTemplateConstants {
    /**
     * 验证码(SMS_XXXXXX为模板id)
     * 模板内容: 验证码为:${code},用于登录...
     */
    VERFY_MESSAGE_ID("SMS_xxxxxxxxx", new String[]{"code"});

    private String txt;
    private String[] keys;

    MessageTemplateConstants(String txt, String[] keys) {
        this.txt = txt;
        this.keys = keys;
    }

    public static  MessageTemplateConstants search(String xx){
        for(MessageTemplateConstants c:MessageTemplateConstants.values()){
            if(c.txt.equals(xx)){
                return c;
            }
        }
        return null;
    }

    public String getTxt() {
        return txt;
    }
    public String[] getKeys() {
        return keys;
    }
    public void setKeys(String[] keys) {
        this.keys = keys;
    }
    public void setTxt(String txt) {
        this.txt = txt;
    }
}


@Service
public class SendMessageService {

    @Autowired
    private AliyunSendMessageService sendMessageService;


   /**
     * 发送短信
     *
     * @param phone
     * @param content
     */
    @Async
    public void sendAsync(String phone, String content) {
        JSONArray array = new JSONArray();
        array.add(content);
        send(phone, MessageTemplateConstants.VERFY_MESSAGE_ID, array.toJSONString());
    }
    
    /**
     * 发送短信验证码
     *
     * @param phone   手机号码
     * @param content //短信内容
     */
    @Transactional
    public String send(String phone, MessageTemplateConstants templateId, String content) {
        JSONArray array = JSONArray.parseArray(content);
        String[] keys = templateId.getKeys();
        JSONObject js = new JSONObject();
        for (int i = 0; i < keys.length; i++) {
            js.put(keys[i], array.get(i));
        }
        return sendMessageService.send(phone, templateId.getTxt(), js.toJSONString());
    }
}


@Service
public class AliyunSendMessageService {

    @Autowired
    private IAcsClient client;
    @Autowired
    private AliyunMessageConfig config;

    @Transactional
    public String send(String phone, String templateId, String content) {
        log.info("发送短信 phone={},templateId={},content={}",phone,templateId,content);
        if (!PhoneCheck.valid(phone)) {
            throw new HCException(CommonErrorCode.E100001, "手机号码不正确");
        }
        if (StringUtil.isBlank(templateId)) {
            throw new HCException(CommonErrorCode.E100001, "短信模板为空");
        }
        if (StringUtil.isBlank(content)) {
            throw new HCException(CommonErrorCode.E100001, "短信内容不在能为空");
        }
        CommonRequest request = new CommonRequest();
        request.setSysDomain("dysmsapi.aliyuncs.com");
        request.setSysVersion("2017-05-25");
        request.setSysAction("SendSms");
        request.putQueryParameter("RegionId", "cn-hangzhou");
        //必填:待发送手机号
        request.putQueryParameter("PhoneNumbers", phone);
        //必填:短信签名-可在短信控制台中找到
        request.putQueryParameter("SignName", config.getSignName());
        //必填:短信模板-可在短信控制台中找到
        request.putQueryParameter("TemplateCode", templateId);
        //可选
        request.putQueryParameter("TemplateParam", content);
        try {
            CommonResponse response = client.getCommonResponse(request);
            log.info("短信发送结果",response.getData());
            return response.getData();
        } catch (Exception e) {
            log.error("短信发送失败", e);
            return e.getMessage();
        }

    }
}

以下为测试代码:

	@Autowired
    private SendMessageService sendMessageService;

	public static void main(String[] args) throws Exception {
	         //入参为手机号码及验证码
	         sendMessageService.sendAsync(mobile, verify);
	}

完成!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值