Forráskód Böngészése

提交短信发送代码

chenken 7 éve
szülő
commit
0fe0c1fb27

+ 8 - 3
examcloud-exchange-inner-api-client/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/client/SendSmsServiceClient.java

@@ -5,8 +5,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
 
 import cn.com.qmth.examcloud.exchange.inner.api.SendSmsCloudService;
+import cn.com.qmth.examcloud.exchange.inner.api.request.CheckSmsCodeReq;
 import cn.com.qmth.examcloud.exchange.inner.api.request.SendSmsReq;
-import cn.com.qmth.examcloud.exchange.inner.api.response.SendSmsResp;
 
 /**
  * 
@@ -29,7 +29,12 @@ public class SendSmsServiceClient extends BasicCloudClientSupport implements Sen
 	}
 
 	@Override
-	public SendSmsResp sendIdentifyingCode(SendSmsReq sendSmsReq) {
-		return post("/sendSms/sendIdentifyingCode", sendSmsReq, SendSmsResp.class);
+	public String sendIdentifyingCode(SendSmsReq sendSmsReq) {
+		return post("/sendSms/sendIdentifyingCode", sendSmsReq, String.class);
+	}
+
+	@Override
+	public String checkIdentifyingCode(CheckSmsCodeReq checkSmsCodeReq) {
+		return post("/sendSms/sendIdentifyingCode", checkSmsCodeReq, String.class);
 	}
 }

+ 22 - 10
examcloud-exchange-inner-api-provider/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/provider/SendSmsProvider.java

@@ -1,16 +1,17 @@
 package cn.com.qmth.examcloud.exchange.inner.api.provider;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
 
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.exchange.inner.api.SendSmsCloudService;
+import cn.com.qmth.examcloud.exchange.inner.api.request.CheckSmsCodeReq;
 import cn.com.qmth.examcloud.exchange.inner.api.request.SendSmsReq;
-import cn.com.qmth.examcloud.exchange.inner.api.response.SendSmsResp;
 import cn.com.qmth.examcloud.exchange.inner.service.SendSmsService;
 import cn.com.qmth.examcloud.exchange.inner.service.bean.SendSmsInfo;
 
@@ -22,7 +23,7 @@ import cn.com.qmth.examcloud.exchange.inner.service.bean.SendSmsInfo;
  * @description SendSmsProvider.java
  */
 @Controller
-@RequestMapping("${$rmp.cloud.exchange.inner}" + "sendSms")
+@RequestMapping("${$rmp.cloud.exchange.inner}" + "/sendSms")
 public class SendSmsProvider extends ControllerSupport implements SendSmsCloudService {
 
 	private static final long serialVersionUID = -1497756895732370672L;
@@ -32,18 +33,29 @@ public class SendSmsProvider extends ControllerSupport implements SendSmsCloudSe
 
 	@Override
 	@RequestMapping(method = RequestMethod.POST, value = "/sendIdentifyingCode")
-	public SendSmsResp sendIdentifyingCode(SendSmsReq sendSmsReq){
+	public String sendIdentifyingCode(SendSmsReq sendSmsReq){
 		SendSmsInfo sendSmsInfo = new SendSmsInfo();
 		sendSmsInfo.setPhone(sendSmsReq.getPhone());
-		sendSmsInfo.setMessage(sendSmsReq.getMessage());
+		sendSmsInfo.setCode(sendSmsReq.getCode());
 		sendSmsInfo.setSign(sendSmsReq.getSign());
 		sendSmsInfo.setTemplateCode(sendSmsReq.getTemplateCode());
-		try {
-			SendSmsResponse sendSmsResponse = sendSmsService.sendIdentifyingCode(sendSmsInfo);
-		} catch (Exception e) {
-			e.printStackTrace();
+		sendSmsInfo.setEffectiveTime(sendSmsReq.getEffectiveTime());
+		sendSmsInfo.setIntervalSeconds(sendSmsReq.getIntervalSeconds());
+		sendSmsService.sendIdentifyingCode(sendSmsInfo);
+		return "";
+	}
+	
+	@Override
+	@RequestMapping(method = RequestMethod.POST, value = "/checkIdentifyingCode")
+	public String checkIdentifyingCode(CheckSmsCodeReq checkSmsCodeReq){
+		if(StringUtils.isBlank(checkSmsCodeReq.getPhone())){
+			throw new StatusException("EX-SendSmsProvider-001", "手机号码不能为空");
+		}
+		if(StringUtils.isBlank(checkSmsCodeReq.getCode())){
+			throw new StatusException("EX-SendSmsProvider-002", "验证码不能为空");
 		}
-		return null;
+		sendSmsService.checkIdentifyingCode(checkSmsCodeReq.getPhone(), checkSmsCodeReq.getCode());
+		return "";
 	}
 
 }

+ 9 - 2
examcloud-exchange-inner-api/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/SendSmsCloudService.java

@@ -1,8 +1,8 @@
 package cn.com.qmth.examcloud.exchange.inner.api;
 
 import cn.com.qmth.examcloud.commons.web.cloud.api.CloudService;
+import cn.com.qmth.examcloud.exchange.inner.api.request.CheckSmsCodeReq;
 import cn.com.qmth.examcloud.exchange.inner.api.request.SendSmsReq;
-import cn.com.qmth.examcloud.exchange.inner.api.response.SendSmsResp;
 
 /**
  * 短信发送
@@ -16,6 +16,13 @@ public interface SendSmsCloudService extends CloudService{
 	/**
 	 * 发送验证码
 	 */
-	public SendSmsResp sendIdentifyingCode(SendSmsReq sendSmsReq);
+	public String sendIdentifyingCode(SendSmsReq sendSmsReq);
+	
+	/**
+	 * 校验验证码
+	 * @param phone
+	 * @param code
+	 */
+	public String checkIdentifyingCode(CheckSmsCodeReq checkSmsCodeReq);
 	
 }

+ 31 - 0
examcloud-exchange-inner-api/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/request/CheckSmsCodeReq.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.examcloud.exchange.inner.api.request;
+
+import cn.com.qmth.examcloud.commons.web.cloud.api.BaseRequest;
+
+public class CheckSmsCodeReq  extends BaseRequest{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -5177345026766086276L;
+
+	private String phone;
+	
+	private String code;
+
+	public String getPhone() {
+		return phone;
+	}
+
+	public void setPhone(String phone) {
+		this.phone = phone;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+}

+ 30 - 6
examcloud-exchange-inner-api/src/main/java/cn/com/qmth/examcloud/exchange/inner/api/request/SendSmsReq.java

@@ -14,9 +14,9 @@ public class SendSmsReq extends BaseRequest{
 	 */
 	private String phone;
 	/**
-	 * 短信内容
+	 * 验证码
 	 */
-	private String message;
+	private String code;
 	/**
 	 * 签名
 	 */
@@ -25,6 +25,14 @@ public class SendSmsReq extends BaseRequest{
 	 * 模板code
 	 */
 	private String templateCode;
+	/**
+	 * 允许请求的间隔时间
+	 */
+	private int intervalSeconds;
+	/**
+	 * 验证码有效时间   秒
+	 */
+	private int effectiveTime;
 
 	public String getPhone() {
 		return phone;
@@ -34,12 +42,12 @@ public class SendSmsReq extends BaseRequest{
 		this.phone = phone;
 	}
 
-	public String getMessage() {
-		return message;
+	public String getCode() {
+		return code;
 	}
 
-	public void setMessage(String message) {
-		this.message = message;
+	public void setCode(String code) {
+		this.code = code;
 	}
 
 	public String getTemplateCode() {
@@ -58,4 +66,20 @@ public class SendSmsReq extends BaseRequest{
 		this.sign = sign;
 	}
 
+	public int getEffectiveTime() {
+		return effectiveTime;
+	}
+
+	public void setEffectiveTime(int effectiveTime) {
+		this.effectiveTime = effectiveTime;
+	}
+
+	public int getIntervalSeconds() {
+		return intervalSeconds;
+	}
+
+	public void setIntervalSeconds(int intervalSeconds) {
+		this.intervalSeconds = intervalSeconds;
+	}
+	
 }

+ 9 - 3
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/SendSmsService.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.exchange.inner.service;
 import cn.com.qmth.examcloud.exchange.inner.service.bean.SendSmsInfo;
 
 import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
-import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
 
 public interface SendSmsService {
 
@@ -16,7 +15,14 @@ public interface SendSmsService {
 	 * @return
 	 * @throws Exception
 	 */
-	public SendSmsResponse sendIdentifyingCode(SendSmsInfo sendSmsInfo) throws Exception;
+	public void sendIdentifyingCode(SendSmsInfo sendSmsInfo);
+	
+	/**
+	 * 校验验证码是否正确
+	 * @param phone		手机号码
+	 * @param key		验证码
+	 */
+	public boolean checkIdentifyingCode(String phone,String code);
 	
 	/**
 	 * 查询短信发送详情
@@ -24,6 +30,6 @@ public interface SendSmsService {
 	 * @return
 	 * @throws Exception
 	 */
-	public QuerySendDetailsResponse querySendDetails(String bizId,String phone) throws Exception;
+	public QuerySendDetailsResponse querySendDetails(String bizId,String phone);
 	
 }

+ 29 - 7
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/bean/SendSmsInfo.java

@@ -20,9 +20,9 @@ public class SendSmsInfo implements Serializable{
 	 */
 	private String phone;
 	/**
-	 * 短信内容
+	 * 验证码
 	 */
-	private String message;
+	private String code;
 	/**
 	 * 签名
 	 */
@@ -31,17 +31,27 @@ public class SendSmsInfo implements Serializable{
 	 * 模板code
 	 */
 	private String templateCode;
+	/**
+	 * 允许请求的间隔时间/秒
+	 */
+	private Integer intervalSeconds;
+	/**
+	 * 有效时间 / 秒
+	 */
+	private Integer effectiveTime;
+	
+	
 	public String getPhone() {
 		return phone;
 	}
 	public void setPhone(String phone) {
 		this.phone = phone;
 	}
-	public String getMessage() {
-		return message;
+	public String getCode() {
+		return code;
 	}
-	public void setMessage(String message) {
-		this.message = message;
+	public void setCode(String code) {
+		this.code = code;
 	}
 	public String getSign() {
 		return sign;
@@ -55,5 +65,17 @@ public class SendSmsInfo implements Serializable{
 	public void setTemplateCode(String templateCode) {
 		this.templateCode = templateCode;
 	}
-
+	public Integer getEffectiveTime() {
+		return effectiveTime;
+	}
+	public void setEffectiveTime(Integer effectiveTime) {
+		this.effectiveTime = effectiveTime;
+	}
+	public Integer getIntervalSeconds() {
+		return intervalSeconds;
+	}
+	public void setIntervalSeconds(Integer intervalSeconds) {
+		this.intervalSeconds = intervalSeconds;
+	}
+	
 }

+ 31 - 0
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/bean/SmsCodeRedisInfo.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.examcloud.exchange.inner.service.bean;
+
+import java.io.Serializable;
+
+public class SmsCodeRedisInfo implements Serializable{
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 2874230996452650628L;
+
+	private String code;
+	
+	private long createTime;
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public long getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(long createTime) {
+		this.createTime = createTime;
+	}
+}

+ 82 - 11
examcloud-exchange-inner-service/src/main/java/cn/com/qmth/examcloud/exchange/inner/service/impl/SendSmsServiceImpl.java

@@ -3,6 +3,8 @@ package cn.com.qmth.examcloud.exchange.inner.service.impl;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import com.aliyuncs.DefaultAcsClient;
@@ -11,15 +13,25 @@ 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.exceptions.ServerException;
 import com.aliyuncs.profile.DefaultProfile;
 import com.aliyuncs.profile.IClientProfile;
 
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
+import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
 import cn.com.qmth.examcloud.exchange.inner.service.SendSmsService;
 import cn.com.qmth.examcloud.exchange.inner.service.bean.SendSmsInfo;
+import cn.com.qmth.examcloud.exchange.inner.service.bean.SmsCodeRedisInfo;
 
 @Service("sendSmsService")
 public class SendSmsServiceImpl implements SendSmsService {
+	
+	@Autowired
+	private RedisClient redisClient;
 
+	private static final String CODE_REDIS_KEY_PREFIXS = "SMSCODE_";
+	
 	// 产品名称:云通信短信API产品,开发者无需替换
 	private static final String product = "Dysmsapi";
 
@@ -32,14 +44,26 @@ public class SendSmsServiceImpl implements SendSmsService {
 	private static final String accessKeySecret = "NyT0UfUuP900pYhYTM92AEBYP43uZA";
 	
 	@Override
-	public SendSmsResponse sendIdentifyingCode(SendSmsInfo sendSmsInfo) throws Exception {
-		// 可自助调整超时时间
+	public void sendIdentifyingCode(SendSmsInfo sendSmsInfo) {
+		SmsCodeRedisInfo smsCodeRedisInfo = redisClient.get(CODE_REDIS_KEY_PREFIXS+sendSmsInfo.getPhone(),SmsCodeRedisInfo.class);
+		if(smsCodeRedisInfo != null){
+			long createTime = smsCodeRedisInfo.getCreateTime();
+			if((System.currentTimeMillis()-createTime)<sendSmsInfo.getIntervalSeconds()*60*1000){
+				throw new StatusException("EX-sendIdentifyingCode-1",sendSmsInfo.getIntervalSeconds()+"秒内允许请求一次");
+			}
+		}
+		
+/*		// 可自助调整超时时间
 		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
 		System.setProperty("sun.net.client.defaultReadTimeout", "10000");
 
 		// 初始化acsClient,暂不支持region化
 		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,accessKeySecret);
-		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+		try {
+			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+		} catch (ClientException e) {
+			throw new StatusException("EX-100001", "DefaultProfile.addEndpoint failed");
+		}
 		IAcsClient acsClient = new DefaultAcsClient(profile);
 
 		// 组装请求对象-具体描述见控制台-文档部分内容
@@ -52,22 +76,52 @@ public class SendSmsServiceImpl implements SendSmsService {
 		request.setTemplateCode(sendSmsInfo.getTemplateCode());
 		// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
 		
-		request.setTemplateParam("{\"code\":"+sendSmsInfo.getMessage()+"}");
+		request.setTemplateParam("{\"code\":\""+sendSmsInfo.getCode()+"\"}");
 
 		// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
 		// request.setSmsUpExtendCode("90997");
 
 		// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
-		request.setOutId("yourOutId");
+		request.setOutId("yourOutId");*/
 
 		// hint 此处可能会抛出异常,注意catch
-		SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
-
-		return sendSmsResponse;
+		/*try {
+			SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
+			if("ok".equalsIgnoreCase(sendSmsResponse.getCode())){
+				putCodeInfoToRedis(sendSmsInfo);
+			}else{
+				throw new StatusException("EX-sendIdentifyingCode-2", "code:"+sendSmsResponse.getCode()+",message:"+sendSmsResponse.getMessage());
+			}
+		} catch (ServerException e) {
+			throw new StatusException("EX-sendIdentifyingCode-3", "aliyun send sms failed");
+		} catch (ClientException e) {
+			throw new StatusException("EX-sendIdentifyingCode-3", "aliyun send sms failed");
+		}*/
+		putCodeInfoToRedis(sendSmsInfo);
+	}
+	
+	/**
+	 * 将短信验证码信息放入redis
+	 * @param sendSmsInfo
+	 */
+	private void putCodeInfoToRedis(SendSmsInfo sendSmsInfo){
+		String redisKey = CODE_REDIS_KEY_PREFIXS+sendSmsInfo.getPhone();
+		long currentTime = System.currentTimeMillis();
+		
+		SmsCodeRedisInfo smsCodeRedisInfo = new SmsCodeRedisInfo();
+		smsCodeRedisInfo.setCode(sendSmsInfo.getCode());
+		smsCodeRedisInfo.setCreateTime(currentTime);
+		if(sendSmsInfo.getEffectiveTime() == null){
+			sendSmsInfo.setEffectiveTime(120);//验证码默认有效时间
+		}
+		if(sendSmsInfo.getIntervalSeconds() == null){
+			sendSmsInfo.setEffectiveTime(90);//默认间隔时间
+		}
+		redisClient.set(redisKey, smsCodeRedisInfo, sendSmsInfo.getEffectiveTime());
 	}
 	
 	@Override
-	public QuerySendDetailsResponse querySendDetails(String bizId,String phone) throws Exception {
+	public QuerySendDetailsResponse querySendDetails(String bizId,String phone){
 
 		// 可自助调整超时时间
 		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
@@ -76,7 +130,11 @@ public class SendSmsServiceImpl implements SendSmsService {
 		// 初始化acsClient,暂不支持region化
 		IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId,
 				accessKeySecret);
-		DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+		try {
+			DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
+		} catch (ClientException e) {
+			e.printStackTrace();
+		}
 		IAcsClient acsClient = new DefaultAcsClient(profile);
 
 		// 组装请求对象
@@ -94,9 +152,22 @@ public class SendSmsServiceImpl implements SendSmsService {
 		request.setCurrentPage(1L);
 
 		// hint 此处可能会抛出异常,注意catch
-		QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
+		QuerySendDetailsResponse querySendDetailsResponse = null;
+		try {
+			querySendDetailsResponse = acsClient.getAcsResponse(request);
+		} catch (ServerException e) {
+			e.printStackTrace();
+		} catch (ClientException e) {
+			e.printStackTrace();
+		}
 
 		return querySendDetailsResponse;
 	}
+
+	@Override
+	public boolean checkIdentifyingCode(String phone, String code) {
+		SmsCodeRedisInfo smsCodeRedisInfo = redisClient.get(CODE_REDIS_KEY_PREFIXS+phone, SmsCodeRedisInfo.class);
+		return code.equals(smsCodeRedisInfo.getCode()+"");
+	}
 	
 }