|
@@ -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()+"");
|
|
|
+ }
|
|
|
|
|
|
}
|