在实现验证码发送之前,我们先去选择发送短信支持的云服务。腾讯云,阿里云...都可以(只要支持)
本文提供的是阿里云服务。
前置工作
在阿里云官网(阿里云-计算,为了无法计算的价值)搜索短信服务,进入控制台
1, 进入控制台后,申请资质,申请签名(资质不通过,签名也不会通过),申请模板。(很简单,点点点就行)。
2, 申请accesskey和accesskeysecret 点击进入申请即可。特别注意(accesskeysecret只在第一次申请成功后显示,后续就不会在显示!!!一定要保存好这两个key,后续代码签名验证时会用到)
3, 绑定测试手机号,因为测试需要,不绑定手机号无法完成对应手机的短信下发
4,购买短信额度(新用户可以免费领取一百条短信额度) 链接(阿里云通信产品免费试用)
5,在控制台点击"快速学习和测试",选择审核通过的签名和模板。调用API,选择审核通过的测试手机号,先进行一次测试(必填项下拉框都有提示)
后置工作
在测试无误后 选择SDK示例查看对应计算机语言代码
复制对应代码即可,由于阿里云给出的代码包含main函数(方便测试),而实际开发可能完全不需要,所以大家可以借鉴以下我修改后的代码(v2.0代码)
package com.DemoText.listen;
import cn.hutool.core.util.RandomUtil;
import com.DemoText.config.PublicKEY;
import com.DemoText.config.RabbitKEY;
import com.DemoText.pojo.resp.SendRESP;
import com.aliyun.tea.*;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Component
public class PhoneListen {
// 从配置文件读取accesskey和accesskeysecret
@Value("${aliyun.accesskey}")
private String accessKeyId;
@Value("${aliyun.accesskeysecret}")
private String accessKeySecret;
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RabbitListener(queues = RabbitKEY.PHONEQUEUE)
public void SendMSM(SendRESP sendRESP, Message message, Channel channel) {
try {
// 生成验证码
String code = RandomUtil.randomNumbers(6);
com.aliyun.dysmsapi20170525.Client client = createClient(accessKeyId, accessKeySecret);
com.aliyun.dysmsapi20170525.models.SendSmsRequest sendSmsRequest = new com.aliyun.dysmsapi20170525.models.SendSmsRequest()
.setSignName("审核通过的签名")
.setTemplateCode("模板code")
.setPhoneNumbers(接收短信的测试手机号)
.setTemplateParam("{\"code\":\"" + code + "\"}");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
client.sendSmsWithOptions(sendSmsRequest, runtime);
// 手机验证码放入redis
stringRedisTemplate.opsForValue().set(PublicKEY.PHONE + sendRESP.getPhone(), code, 60, TimeUnit.MINUTES);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
try {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
throw new RuntimeException(e);
}
}
/**
* 使用AK&SK初始化账号Client
*
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
public static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,您的 AccessKey ID
.setAccessKeyId(accessKeyId)
// 必填,您的 AccessKey Secret
.setAccessKeySecret(accessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
config.endpoint = "dysmsapi.aliyuncs.com";
return new com.aliyun.dysmsapi20170525.Client(config);
}
}
这样,短信下发就圆满完成啦。