package com.java110.boot.smo.impl; import com.alibaba.fastjson.JSONObject; import com.java110.boot.smo.DefaultAbstractComponentSMO; import com.java110.boot.smo.IRegisterServiceSMO; import com.java110.core.context.IPageData; import com.java110.core.factory.AliSendMessageFactory; import com.java110.core.factory.AuthenticationFactory; import com.java110.core.factory.SendSmsFactory; import com.java110.core.log.LoggerFactory; import com.java110.utils.cache.CommonCache; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.MappingConstant; import com.java110.utils.util.Assert; import com.java110.utils.util.StringUtil; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; /** * 用户注册业务处理类 *

* Created by wuxw on 2019/3/23. */ @Service("registerServiceSMOImpl") public class RegisterServiceSMOImpl extends DefaultAbstractComponentSMO implements IRegisterServiceSMO { private final static Logger logger = LoggerFactory.getLogger(RegisterServiceSMOImpl.class); @Autowired private RestTemplate restTemplate; @Override public ResponseEntity doRegister(IPageData pd) { ResponseEntity responseEntity = null; Assert.jsonObjectHaveKey(pd.getReqData(), "username", "请求报文格式错误或未包含用户名信息"); Assert.jsonObjectHaveKey(pd.getReqData(), "passwd", "请求报文格式错误或未包含密码信息"); Assert.jsonObjectHaveKey(pd.getReqData(), "repasswd", "请求报文格式错误或未包含确认密码信息"); Assert.jsonObjectHaveKey(pd.getReqData(), "tel", "请求报文格式错误或未包含手机信息信息"); JSONObject registerInfo = JSONObject.parseObject(pd.getReqData()); //校验密码 if (!registerInfo.getString("passwd").equals(registerInfo.getString("repasswd"))) { responseEntity = new ResponseEntity("密码和确认密码不一致", HttpStatus.INTERNAL_SERVER_ERROR); return responseEntity; } //调用 手机验证码 responseEntity = this.invokeComponent("validate-tel", "validate", pd); if (responseEntity.getStatusCode() != HttpStatus.OK) { return responseEntity; } responseEntity = this.checkNameAndTelExists(pd, registerInfo.getString("username"), ""); if (responseEntity.getStatusCode() != HttpStatus.OK) { return responseEntity; } responseEntity = this.checkNameAndTelExists(pd, "", registerInfo.getString("tel")); if (responseEntity.getStatusCode() != HttpStatus.OK) { return responseEntity; } registerInfo.put("passwd", AuthenticationFactory.passwdMd5(registerInfo.getString("passwd"))); registerInfo.put("name", registerInfo.getString("username")); registerInfo.put("password", registerInfo.getString("passwd")); responseEntity = this.callCenterService(restTemplate, pd, registerInfo.toJSONString(), "user.service.register", HttpMethod.POST); return responseEntity; } private ResponseEntity checkNameAndTelExists(IPageData pd, String name, String tel) { ResponseEntity responseEntity = null; //校验用户名或手机是否存在 responseEntity = this.callCenterService(restTemplate, pd, "", "check.hasUser.byNameOrTel?name=" + name + "&tel=" + tel, HttpMethod.GET); if (responseEntity.getStatusCode() != HttpStatus.OK) { logger.error("调用后端服务异常:{}", responseEntity); return new ResponseEntity("调用中心服务异常", HttpStatus.INTERNAL_SERVER_ERROR); } Assert.jsonObjectHaveKey(responseEntity.getBody(), "userCount", "调用中心服务异常,报文中未包含userCount节点"); JSONObject userInfo = JSONObject.parseObject(responseEntity.getBody()); if (userInfo.getIntValue("userCount") > 0) { return new ResponseEntity(StringUtil.isNullOrNone(name) ? "手机号已占用" : "用户名已占用", HttpStatus.INTERNAL_SERVER_ERROR); } responseEntity = new ResponseEntity<>("成功", HttpStatus.OK); return responseEntity; } /** * 发送验证码 * * @param pd * @return */ @Override public ResponseEntity sendTelMessageCode(IPageData pd) { Assert.jsonObjectHaveKey(pd.getReqData(), "tel", "请求报文格式错误或未包含手机号信息"); JSONObject telInfo = JSONObject.parseObject(pd.getReqData()); String oldCode = CommonCache.getValue(telInfo.getString("tel") + "_validateTel_resend"); ResponseEntity sendMessageResult = null; String verifyStr = ""; if(!StringUtil.isNullOrNone(oldCode)){ verifyStr = "请稍后重试"; sendMessageResult = new ResponseEntity<>(verifyStr, HttpStatus.OK); return sendMessageResult; } String verifyCode = AliSendMessageFactory.generateMessageCode(); verifyStr = "演示环境验证码:" + verifyCode; try { if ("ON".equals(MappingCache.getValue(MappingConstant.SMS_DOMAIN,SendSmsFactory.SMS_SEND_SWITCH))) { //开始发送验证码 //AliSendMessageFactory.sendMessage(telInfo.getString("tel"), verifyCode); //TencentSendMessageFactory.sendMessage(telInfo.getString("tel"), verifyCode); SendSmsFactory.sendSms(telInfo.getString("tel"), verifyCode); verifyStr = "验证码已下发至您的手机!"; } //将验证码存入Redis中 CommonCache.setValue(telInfo.getString("tel") + "_validateTel", verifyCode.toLowerCase(), CommonCache.defaultExpireTime); //将验证码存入Redis中 CommonCache.setValue(telInfo.getString("tel") + "_validateTel_resend", verifyCode.toLowerCase(), CommonCache.RESEND_DEFAULT_EXPIRETIME); sendMessageResult = new ResponseEntity<>(verifyStr, HttpStatus.OK); } catch (Exception e) { logger.error("生成验证码失败,", e); sendMessageResult = new ResponseEntity<>("", HttpStatus.INTERNAL_SERVER_ERROR); } return sendMessageResult; } /** * 校验验证码 * * @param pd 页面请求对象 * @return */ public ResponseEntity validate(IPageData pd) { logger.debug("校验验证码参数:{}", pd.toString()); ResponseEntity verifyResult = null; Assert.jsonObjectHaveKey(pd.getReqData(), "messageCode", "请求报文中未包含 验证码" + pd.toString()); Assert.jsonObjectHaveKey(pd.getReqData(), "tel", "请求报文中未包含 手机号" + pd.toString()); JSONObject telInfo = JSONObject.parseObject(pd.getReqData()); String code = CommonCache.getValue(telInfo.getString("tel") + "_validateTel"); if (telInfo.getString("messageCode").toLowerCase().equals(code)) { verifyResult = new ResponseEntity<>("成功", HttpStatus.OK); } else { pd.setToken(""); verifyResult = new ResponseEntity<>("验证码错误", HttpStatus.INTERNAL_SERVER_ERROR); } return verifyResult; } /** * 加载地区 * * @param pd 页面请求对象 * @return */ public ResponseEntity loadArea(IPageData pd) { ResponseEntity responseEntity = null; JSONObject paramObj = JSONObject.parseObject(pd.getReqData()); responseEntity = this.callCenterService(restTemplate, pd, "", "area.listAreas?" + super.mapToUrlParam(paramObj), HttpMethod.GET); return responseEntity; } }