123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539 |
- package com.boot.security.server.service;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Random;
- import java.util.UUID;
- import java.util.regex.Matcher;
- import java.util.regex.Pattern;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.mock.web.MockMultipartFile;
- import org.springframework.stereotype.Service;
- import org.springframework.web.multipart.MultipartFile;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.boot.security.server.config.MyProps;
- import com.boot.security.server.config.TokenThread;
- import com.boot.security.server.dao.CusAuditInfoDao;
- import com.boot.security.server.dao.CusAuthInfoDao;
- import com.boot.security.server.dao.CusLoginInfoDao;
- import com.boot.security.server.dao.CusSelfInfoDao;
- import com.boot.security.server.dao.DictDao;
- import com.boot.security.server.dao.SmsVerifycodeDao;
- import com.boot.security.server.model.CusAuditInfo;
- import com.boot.security.server.model.CusAuthInfo;
- import com.boot.security.server.model.CusLoginInfo;
- import com.boot.security.server.model.CusSelfInfo;
- import com.boot.security.server.model.Dict;
- import com.boot.security.server.model.FileInfo;
- import com.boot.security.server.model.SmsVerifycode;
- import com.boot.security.server.utils.AesCbcUtil;
- import com.boot.security.server.utils.DateTimeUtil;
- import com.boot.security.server.utils.HttpUtil;
- import com.boot.security.server.utils.SMSUtil;
- import com.boot.security.server.utils.StrUtil;
- @Service("wxService")
- public class WxService {
-
- private static final Logger log = LoggerFactory.getLogger("adminLogger");
-
- @Autowired
- private MyProps myProps;
- @Autowired
- private FileService fileService;
-
- @Autowired
- private SmsVerifycodeDao smsVerifycodeDao;
-
- @Autowired
- private CusLoginInfoDao cusLoginInfoDao;
-
- @Autowired
- private CusAuthInfoDao cusAuthInfoDao;
-
- @Autowired
- private CusSelfInfoDao cusSelfInfoDao;
-
- @Autowired
- private CusAuditInfoDao cusAuditInfoDao;
-
- @Autowired
- private DictDao dictDao;
-
- /**
- * 微信用户登录
- *@return
- **/
- public String wxLogin(Map<String,Object> paramMap) {
- log.info("微信用户登录---------start-------");
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String code = (String) paramMap.get("code");
- String iv = (String) paramMap.get("iv");
- String encryptedData = (String) paramMap.get("encryptedData");
- if(StrUtil.isEmpty(code)) {
- resultMap.put("data", "");
- resultMap.put("code", "1");
- resultMap.put("msg", "code不能为空!");
- log.info("微信用户登录失败---------code为空-------");
- return JSON.toJSONString(resultMap);
- }
- Map<String,Object> dataMap = new HashMap<String,Object>();
- String token = "";
- String session_key = "";
- String openid = "";
- String unionid = "";
-
- String appid = myProps.getWxAppid();
- String secret = myProps.getWxSecret();
- String auth = myProps.getWxAuth();
- String url = myProps.getWxloginUrl();
- log.info("微信登录url:"+url+"appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type="+auth );
- String result = HttpUtil.sendGet(url+"appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type="+auth, "");
- log.info("微信登录接口返回结果:"+result);
- if("fail".equals(result)) {
- resultMap.put("data", "");
- resultMap.put("code", "1");
- resultMap.put("msg", "fail");
- log.info("微信用户登录失败---------fail-------");
- return JSON.toJSONString(resultMap);
- }else {
- JSONObject reJo = JSON.parseObject(result);
- if(StrUtil.isNotEmpty(reJo.getString("errcode"))) {
- resultMap.put("data", "");
- resultMap.put("code", "1");
- resultMap.put("msg", reJo.getString("errcode"));
- log.info("微信用户登录失败---------code失效-------");
- return JSON.toJSONString(resultMap);
- }else {
- log.info("微信用户登录成功---------result:"+JSON.toJSONString(result));
- token = UUID.randomUUID().toString().replaceAll("-", "");
- session_key = reJo.getString("session_key");
- openid = reJo.getString("openid");
- unionid = reJo.getString("unionid");
- // 查询登录信息表中是否有此openid
- CusLoginInfo detailByOpenId = cusLoginInfoDao.getDetailByOpenId(openid);
- // 存入微信用户登录信息表
- CusLoginInfo cusLoginInfo = new CusLoginInfo();
- if(detailByOpenId!=null) {
- cusLoginInfo.setOpenId(openid);
- cusLoginInfo.setToken(token);
- cusLoginInfo.setSessionKey(session_key);
- cusLoginInfo.setUnionId(unionid);
- cusLoginInfo.setLastModTime(DateTimeUtil.getCurrentDateTime());
- log.info("微信用户登录成功---------token更新-------");
- cusLoginInfoDao.updateByOpenId(cusLoginInfo);
- }else {
- cusLoginInfo.setOpenId(openid);
- cusLoginInfo.setToken(token);
- cusLoginInfo.setSessionKey(session_key);
- cusLoginInfo.setUnionId(unionid);
- cusLoginInfo.setCreateTime(DateTimeUtil.getCurrentDateTime());
- cusLoginInfo.setLastModTime(DateTimeUtil.getCurrentDateTime());
- log.info("微信用户登录成功---------添加登录信息成功-------");
- cusLoginInfoDao.save(cusLoginInfo);
- // 解密用户基本信息,添加用户基本信息
- try {
- String resu = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
- JSONObject jo = JSON.parseObject(resu);
- String nickName=jo.getString("nickName"); //用户昵称
- String jsonsds=jo.getString("avatarUrl"); //用户头像
- String sex = jo.getString("gender");//性别
- //String unionid = jo.getString("unionid");
- //String city = jo.getString("city"); //城市
- //String province = jo.getString("province");//省份
- //String country = jo.getString("country"); //国家s
- CusSelfInfo cusSelfInfo = new CusSelfInfo();
- cusSelfInfo.setId(UUID.randomUUID().toString().replaceAll("-", ""));
- cusSelfInfo.setNickName(nickName);
- cusSelfInfo.setHeadImg(jsonsds);
- cusSelfInfo.setOpenId(openid);
- cusSelfInfo.setUserType("1");//普通用户
- cusSelfInfo.setCreateTime(DateTimeUtil.getCurrentDateTime());
- cusSelfInfo.setLastModBy(nickName);
- cusSelfInfo.setCreateUser(nickName);
- cusSelfInfo.setLastModTime(DateTimeUtil.getCurrentDateTime());
- if("1".equals(sex)) {
- cusSelfInfo.setSex("1");
- }else if("2".equals(sex)) {
- cusSelfInfo.setSex("0");
- }else {
- cusSelfInfo.setSex("2");// 未知
- }
- cusSelfInfoDao.save(cusSelfInfo);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- // 根据openid判断是否绑定手机
- CusAuthInfo isAuth = cusAuthInfoDao.getByOpenId(openid);
- if(isAuth!=null) {
- dataMap.put("isAuth", true);
- }else {
- dataMap.put("isAuth", false);
- }
- // 根据openid判断是否是大V用户
- CusAuditInfo isAudit = cusAuditInfoDao.getByOpenId(openid);
- if(isAudit!=null) {
- String auditStatus = isAudit.getAuditStatus();
- dataMap.put("isAudit", auditStatus);
- }else {
- dataMap.put("isAudit", "3");// 未申请
- }
- // 将session_key\token返回给前端
- dataMap.put("token", token);
- dataMap.put("openid", openid);
- dataMap.put("session_key", session_key);
- resultMap.put("data", dataMap);
- resultMap.put("code", "0");
- resultMap.put("msg", "成功");
- }
- }
- return JSON.toJSONString(resultMap);
- }
-
- /**
- * 微信服务鉴权
- */
- public String commenAuth(Map<String, Object> paramMap) {
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String openid = (String) paramMap.get("openId");
- String token = (String) paramMap.get("token");
- String msg = "";
- if(StrUtil.isEmpty(token)) {
- msg = "token不能为空";
- }
- if(StrUtil.isEmpty(openid)) {
- msg = "openid不能为空";
- }
- if(StrUtil.isNotEmpty(msg)) {
- resultMap.put("code", "1");
- resultMap.put("msg", msg);
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- CusLoginInfo byToken = cusLoginInfoDao.getDetailByToken(token);
- if(StrUtil.isEmpty(byToken)) {
- resultMap.put("code", "2");
- resultMap.put("msg", "token非法");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- if(!openid.equals(byToken.getOpenId())) {
- resultMap.put("code", "1");
- resultMap.put("msg", "openid不一致");
- resultMap.put("data", "");
- }else {
- resultMap.put("code", "0");
- resultMap.put("msg", "验证通过");
- resultMap.put("data", "");
- }
- return JSON.toJSONString(resultMap);
- }
-
- /**
- * 获取短信验证码
- *@return
- **/
- public String getVerifyCode(HashMap<String, Object> paramMap) {
- log.info("获取短信验证码---------start-------");
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String openid = (String) paramMap.get("openId");
- String phone = (String) paramMap.get("phone");
- String msg = "";
- if(StrUtil.isEmpty(openid)) {
- msg = "openId不能为空";
- }
- if(StrUtil.isEmpty(phone)) {
- msg = "mobile不能为空";
- }else {
- // 校验手机号
- Pattern pattern = Pattern.compile("/^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$/");
- Matcher matcher = pattern.matcher(phone);
- if(!matcher.matches()) {
- msg = "手机号不正确";
- }
- }
- if(StrUtil.isNotEmpty(msg)) {
- resultMap.put("code", "1");
- resultMap.put("msg", msg);
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- // 校验手机号是否已经使用
- // 校验是否曾经认证成功
- CusAuthInfo selective = cusAuthInfoDao.getBySelective(paramMap);
- if(selective!=null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "您已经是认证用户,无需重新认证!");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- // 校验openid是否合法
- CusLoginInfo detailByOpenId = cusLoginInfoDao.getDetailByOpenId(openid);
- if(detailByOpenId==null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "openid非法");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- // 调用56短信平台接口发送短信
- String verifyCode = String.valueOf(new Random().nextInt(899999)+100000);
- // 是否发送过验证码,且验证码有效
- SmsVerifycode smsVerifycodeTemp = smsVerifycodeDao.SelectOne(phone);
- if(smsVerifycodeTemp != null && "0".equals(smsVerifycodeTemp.getIsExpire())) {
- verifyCode = smsVerifycodeTemp.getVerifycode();
- }
- String content = "您的验证码为:"+verifyCode+",该验证码有效期为5分钟,该码只能使用一次!";
-
- String smsUrl = myProps.getSmsUrl();
- String comid = myProps.getComid();
- String smsUname = myProps.getSmsUname();
- String smsPwd = myProps.getSmsPwd();
-
- String result = "";
- try {
- String httpLink = smsUrl+"comid="+comid+"&username="+smsUname+"&userpwd="+smsPwd+"&handtel="+phone+"&sendcontent="+content+"&sendtime=定时时间&smsnumber=所用平台";
- log.info("短信平台调用地址URL>>>>"+httpLink);
- result = SMSUtil.invokeHttpSMS(httpLink);
- } catch (Exception e) {
- log.info("调用短信接口异常》》》》》",e);
- resultMap.put("code", "1");
- resultMap.put("msg", "短信接口异常");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
-
- if("1".equals(result)) {
- // 发送成功,入库
- SmsVerifycode smsVer = new SmsVerifycode();
- smsVer.setId(UUID.randomUUID().toString().replaceAll("-", ""));
- smsVer.setCreateTime(DateTimeUtil.getCurrentDateTime());
- smsVer.setLastModTime(DateTimeUtil.getCurrentDateTime());
- smsVer.setMobile(phone);
- smsVer.setOpenId(openid);
- smsVer.setSmsContent(content);
- smsVer.setVerifycode(verifyCode);
- smsVerifycodeDao.save(smsVer);
- resultMap.put("code", "0");
- resultMap.put("msg", "发送短信验证码成功");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }else {
- resultMap.put("code", "1");
- resultMap.put("msg", "发送短信验证码失败");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- }
- /**
- * 用户手机号绑定
- *@return
- **/
- public String bindMobile(HashMap<String, Object> paramMap) {
- log.info("用户手机号绑定---------start-------");
- // 微信服务鉴权
- String auth = commenAuth(paramMap);
- JSONObject jsonObject = JSON.parseObject(auth);
- if(!"0".equals((String)jsonObject.get("code"))) {
- return auth;
- }
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String openid = (String) paramMap.get("openId");
- String iv = (String) paramMap.get("iv");
- String encryptedData = (String) paramMap.get("encryptedData");
- String sessionKey = (String) paramMap.get("sessionKey");
- String mobile = "";
- //String verifyCode = (String) paramMap.get("verifyCode");
- //String mobile = (String) paramMap.get("mobile");
- // 根据openid查询用户基本信息
- CusLoginInfo loginDetaild = cusLoginInfoDao.getDetailByOpenId(openid);
- if(loginDetaild==null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "获取用户登录信息失败");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }else {
- // 解密手机号
- String result;
- try {
- result = AesCbcUtil.decrypt(encryptedData, sessionKey, iv, "UTF-8");
- if (null != result && result.length() > 0) {
- log.info("获取解密后数据————————————"+result);
- // 将解密后的JSON格式字符串转化为对象
- JSONObject jo = JSON.parseObject(result);
- mobile = jo.getString("phoneNumber");
- log.info("获取到手机号为-------"+mobile);
- }
- if(StrUtil.isEmpty(mobile)) {
- resultMap.put("code", "1");
- resultMap.put("msg", "获取手机号为空");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- // 校验手机号是否绑定其他账号
- // 校验短信验证码是否有效(暂时抛弃)
- CusAuthInfo cusAuthInfo1 = cusAuthInfoDao.getDetailByMobile(mobile);
- if(cusAuthInfo1!=null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "该手机号已绑定其他账号");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }else {
- CusAuthInfo cusAuthInfo = new CusAuthInfo();
- cusAuthInfo.setId(UUID.randomUUID().toString().replaceAll("-", ""));
- cusAuthInfo.setOpenId(openid);
- cusAuthInfo.setMobile(mobile);
- cusAuthInfo.setCreateTime(DateTimeUtil.getCurrentDateTime());
- cusAuthInfo.setLastModTime(DateTimeUtil.getCurrentDateTime());
- cusAuthInfoDao.save(cusAuthInfo);
- resultMap.put("code", "0");
- resultMap.put("msg", "用户手机号绑定成功");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- return JSON.toJSONString(resultMap);
-
- }
- /**
- * 上传文件接口
- */
- public String uploadFile(MultipartFile file, String openid,String token) throws Exception{
- Map<String,Object> resultMap = new HashMap<String,Object>();
- HashMap<String,Object> paramMap = new HashMap<String,Object>();
- paramMap.put("openId", openid);
- paramMap.put("token", token);
- // 微信服务鉴权
- String auth = commenAuth(paramMap);
- JSONObject jsonObject = JSON.parseObject(auth);
- if(!"0".equals((String)jsonObject.get("code"))) {
- return auth;
- }
-
- FileInfo fileInfo = fileService.save(file);
- resultMap.put("code", "0");
- resultMap.put("msg", "上传成功");
- resultMap.put("data", fileInfo);
-
- return JSON.toJSONString(resultMap);
- }
- /**
- * 大V认证接口
- */
- public String auditCheck(HashMap<String, Object> paramMap) {
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String openid = (String) paramMap.get("openId");
- String picPath = (String) paramMap.get("picPath");
- // 微信服务鉴权
- String auth = commenAuth(paramMap);
- JSONObject jsonObject = JSON.parseObject(auth);
- if(!"0".equals((String)jsonObject.get("code"))) {
- return auth;
- }
- // 根据openid查询用户基本信息
- CusSelfInfo selfInfo = cusSelfInfoDao.getByOpenId(openid);
- if(selfInfo==null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "获取用户基本信息失败");
- resultMap.put("data", "");
- return JSON.toJSONString(resultMap);
- }else {
- // 根据openid查看是否申请认证过
- CusAuditInfo byOpenId = cusAuditInfoDao.getByOpenIdAndStatus(openid,"0");
- // 存在申请中的数据
- if(byOpenId!=null) {
- resultMap.put("code", "1");
- resultMap.put("msg", "请勿重复申请");
- resultMap.put("data", byOpenId);
- }else {
- CusAuditInfo auditInfo = new CusAuditInfo();
- auditInfo.setId(UUID.randomUUID().toString().replaceAll("-", ""));
- auditInfo.setCusSelfId(selfInfo.getId());
- auditInfo.setCertifiedImg(picPath);
- auditInfo.setAuditStatus("0");
- auditInfo.setCreateTime(DateTimeUtil.getCurrentDateTime());
- auditInfo.setLastModTime(DateTimeUtil.getCurrentDateTime());
- auditInfo.setCreateUser("用户申请");
- auditInfo.setLastModBy("用户申请");
- auditInfo.setOpenid(openid);
- cusAuditInfoDao.save(auditInfo);
- resultMap.put("code", "0");
- resultMap.put("msg", "申请成功");
- resultMap.put("data", auditInfo);
- }
- return JSON.toJSONString(resultMap);
- }
- }
-
- /**
- * 获取字典列表接口
- * @param type
- */
- public String getDictByType(HashMap<String, Object> paramMap) {
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String type = (String) paramMap.get("type");
- // 微信服务鉴权
- String auth = commenAuth(paramMap);
- JSONObject jsonObject =JSON.parseObject(auth);
- if(!"0".equals((String)jsonObject.get("code"))) {
- return auth;
- }
- List<Dict> dictList = dictDao.listByType(type);
- resultMap.put("code", "0");
- resultMap.put("msg", "获取字典列表成功");
- resultMap.put("data", dictList);
- return JSON.toJSONString(resultMap);
- }
-
- public String createQRCode(String path,String width,String scene) {
- Map<String,Object> resultMap = new HashMap<String,Object>();
- String id = UUID.randomUUID().toString().replaceAll("-", "");
- String picName = id+".jpg";
- String url = myProps.getWxCreateQRCode();
- log.info("微信登录url:"+url);
- String accessToken = TokenThread.accessToken.getToken();
- url = url+"access_token="+accessToken;
- JSONObject json = new JSONObject();
- json.put("path", path);
- json.put("width", width);
- json.put("scene", scene);
- //json.put("is_hyaline", true);
- InputStream instream;
- try {
- instream = HttpUtil.postResponse(url, json);
- if(instream!=null) {
- MultipartFile multipartFile = new MockMultipartFile(picName,picName,"", instream);
- FileInfo save = fileService.save(multipartFile);
- log.info("生成二维码成功----------------"+JSON.toJSONString(save));
- resultMap.put("code", "0");
- resultMap.put("msg", "生成二维码成功");
- resultMap.put("data", save);
- }else {
- resultMap.put("code", "1");
- resultMap.put("msg", "生成二维码失败");
- resultMap.put("data", "");
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- return JSON.toJSONString(resultMap);
- }
-
- }
|