使用腾讯云发送短信
1.先申请腾讯云短信服务:https://console.cloud.tencent.com/smsv2
2.短信服务代码
package com.atguigu.msmservice.controller; import com.atguigu.commonutils.R; import com.atguigu.msmservice.service.MsmService; import com.atguigu.msmservice.utils.RandomUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/edumsm/msm") @CrossOrigin public class MsmController { @Autowired private MsmService msmService; @Autowired private RedisTemplate<String,String> redisTemplate; //发送短信的方法 @GetMapping("send/{phone}") @CrossOrigin public R sendMsm(@PathVariable String phone) { //1 从redis获取验证码,如果获取到直接返回 String code = redisTemplate.opsForValue().get(phone); if(!StringUtils.isEmpty(code)) { return R.ok(); } //2 如果redis获取 不到,进行阿里云发送 //生成随机验证码, Map<String, Object> param = new HashMap<>(); String verificationCode = RandomUtil.getSixBitRandom(); param.put("verificationCode",verificationCode); //调用service发送短信的方法 boolean isSend = msmService.send(param,phone); if(isSend) { //发送成功,把发送成功验证码放到redis里面 //设置有效时间 redisTemplate.opsForValue().set(phone,verificationCode,5, TimeUnit.MINUTES); return R.ok(); } else { return R.error().message("短信发送失败"); } } }
短信服务实现类
package com.atguigu.msmservice.service.impl; import com.atguigu.msmservice.service.MsmService; import com.atguigu.msmservice.utils.RandomUtil; import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.sms.v20210111.SmsClient; import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @Service public class MsmServiceImpl implements MsmService { /** * 发送短信的方法 */ @Override public boolean send(Map<String,Object> param,String phone) { if(StringUtils.isEmpty(phone)) { return false; } try { //这里是实例化一个Credential,也就是认证对象,参数是密钥对;你要使用肯定要进行认证 Credential credential = new Credential("你的secretId", "你的secretKey"); //HttpProfile这是http的配置文件操作,比如设置请求类型(post,get)或者设置超时时间了、还有指定域名了 //最简单的就是实例化该对象即可,它的构造方法已经帮我们设置了一些默认的值 HttpProfile httpProfile = new HttpProfile(); //这个setEndpoint可以省略的 httpProfile.setEndpoint("sms.tencentcloudapi.com"); //实例化一个客户端配置对象,这个配置可以进行签名(使用私钥进行加密的过程),对方可以利用公钥进行解密 ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); //实例化要请求产品(以sms为例)的client对象 SmsClient smsClient = new SmsClient(credential, "ap-beijing", clientProfile); //实例化request封装请求信息 SendSmsRequest request = new SendSmsRequest(); String[] phoneNumber = {phone}; //手机号 request.setPhoneNumberSet(phoneNumber); //SDK AppID request.setSmsSdkAppId("你的SDK AppID"); //签名内容 request.setSignName("LilLazy公众号"); //模板id request.setTemplateId("你的模板id");
//模板内容的参数有几个就要设置几个,我这里有两个 String[] templateParamSet = {param.get("verificationCode").toString,"5"}; request.setTemplateParamSet(templateParamSet); //发送短信 SendSmsResponse response = smsClient.SendSms(request); return true; } catch (Exception e) { return false; } } }
短信服务常见问题和解决办法:https://cloud.tencent.com/document/product/382/9558