话不多说,直接上代码:
package com.bid.common.utils;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.bid.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class phoneCodeUtils
{
@Value("${messageInfo.signName}")
private String signName1;
private static String signName;
@Value("${messageInfo.signName}")
private void setSignName(String signName){
this.signName = signName;
}
private static String templateCode;
@Value("${messageInfo.templateCode}")
private void setTemplateCode(String templateCode){
this.templateCode = templateCode;
}
private static String regionId;
@Value("${messageInfo.regionId}")
private void setRegionId(String regionId){
this.regionId = regionId;
}
private static String accessKeyId ;
@Value("${messageInfo.accessKeyId}")
private void setAcessKeyId(String accessKeyId){this.accessKeyId = accessKeyId;}
private static String secret;
@Value("${messageInfo.secret}")
private void setSecret(String secret){this.secret = secret;}
public static boolean send(String phone, String code) {
// AjaxResult ajax = new AjaxResult();
// 填写自己阿里云账号的AccessKey ID和AccessKey Secret, regionId为cn-hangzhou
DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
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", regionId);
// 根据需求替换参数
// 短信签名
request.putQueryParameter("SignName", signName);
// 短信模板ID
request.putQueryParameter("TemplateCode", templateCode);
// 目标手机号
request.putQueryParameter("PhoneNumbers", phone);
// 验证码
request.putQueryParameter("TemplateParam", "{\"code\":"+code+"}");
try {
CommonResponse response = client.getCommonResponse(request);
JSONObject json = JSONObject.parseObject(response.getData()) ;
String returnCode =(String) json.get("Code");
return "OK".equals(returnCode);
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
e.printStackTrace();
}
return false;
}
}
配置文件 yml文件:
#短信配置(根据自己实际情况填写)
messageInfo:
#短信签名
signName: 注册验证
#短信模板码
templateCode: SMS_216XXXXXX
#默认值
regionId: cn-hangzhou
#AccessKey ID和AccessKey Secret
accessKeyId: LTXXXXXXXXXXXXXX
#AccessKey Secret
secret: fITQOXXXXXXXXXXXXXXXXXXXXXXXX
调用方法:
@Override
public AjaxResult sendCode(String userPhone) {
// 自己写的生成6位随机数字字符的方法(注意: 验证码虽然是字符串,但首位也不能为0,否则发出的是5位数。)
String code = String.valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码
if(phoneCodeUtils.send(userPhone, code)){
SysPhoneVerifyCode sysPhoneVerifyCode = new SysPhoneVerifyCode();
sysPhoneVerifyCode.setPhone(userPhone);
sysPhoneVerifyCode.setCode(code);
SysPhoneVerifyCode phoneVerifyCode = userMapper.selectPhoneVerifyCodeByPhone(userPhone);
if(phoneVerifyCode!=null){
if(userMapper.updatePhoneVerifyCodeByPhone(code, phoneVerifyCode.getSendTimes()+1, userPhone) > 0){
return AjaxResult.success("验证码发送成功");
}
} else {
sysPhoneVerifyCode.setSendTimes(1);
if(userMapper.insertPhoneVerifyCode(sysPhoneVerifyCode)>0){
return AjaxResult.success("验证码发送成功");
}
}
}
return AjaxResult.error("验证码发送失败");
}
实体类SysPhoneVerifyCode:
package com.bid.system.domain;
import com.bid.common.core.domain.BaseEntity;
import lombok.Getter;
import lombok.Setter;
import java.util.Date;
@Setter
@Getter
public class SysPhoneVerifyCode extends BaseEntity {
private Long id;
private String phone;
private String code;
private Date createTime;
private Date updateTime;
private int sendTimes;
}
AjaxResult:
package com.bid.common.core.domain;
import java.util.HashMap;
import com.bid.common.constant.HttpStatus;
import com.bid.common.utils.StringUtils;
/**
* 操作消息提醒
*
* @author ruoyi
*/
public class AjaxResult extends HashMap<String, Object>
{
private static final long serialVersionUID = 1L;
/** 状态码 */
public static final String CODE_TAG = "code";
/** 返回内容 */
public static final String MSG_TAG = "msg";
/** 数据对象 */
public static final String DATA_TAG = "data";
/**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/
public AjaxResult()
{
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param code 状态码
* @param msg 返回内容
*/
public AjaxResult(int code, String msg)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
}
/**
* 初始化一个新创建的 AjaxResult 对象
*
* @param code 状态码
* @param msg 返回内容
* @param data 数据对象
*/
public AjaxResult(int code, String msg, Object data)
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
if (StringUtils.isNotNull(data))
{
super.put(DATA_TAG, data);
}
}
/**
* 返回成功消息
*
* @return 成功消息
*/
public static AjaxResult success()
{
return AjaxResult.success("操作成功");
}
/**
* 返回成功数据
*
* @return 成功消息
*/
public static AjaxResult success(Object data)
{
return AjaxResult.success("操作成功", data);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @return 成功消息
*/
public static AjaxResult success(String msg)
{
return AjaxResult.success(msg, null);
}
/**
* 返回成功消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 成功消息
*/
public static AjaxResult success(String msg, Object data)
{
return new AjaxResult(HttpStatus.SUCCESS, msg, data);
}
/**
* 返回错误消息
*
* @return
*/
public static AjaxResult error()
{
return AjaxResult.error("操作失败");
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(String msg)
{
return AjaxResult.error(msg, null);
}
/**
* 返回错误消息
*
* @param msg 返回内容
* @param data 数据对象
* @return 警告消息
*/
public static AjaxResult error(String msg, Object data)
{
return new AjaxResult(HttpStatus.ERROR, msg, data);
}
/**
* 返回错误消息
*
* @param code 状态码
* @param msg 返回内容
* @return 警告消息
*/
public static AjaxResult error(int code, String msg)
{
return new AjaxResult(code, msg, null);
}
}