package com.stylefeng.guns.modular.system.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.common.constant.JwtConstants; import com.stylefeng.guns.core.shiro.ShiroKit; import com.stylefeng.guns.core.shiro.ShiroUser; import com.stylefeng.guns.core.util.GetMobile; import com.stylefeng.guns.core.util.JwtTokenUtil; import com.stylefeng.guns.core.util.ToolUtil; import com.stylefeng.guns.modular.system.dao.*; import com.stylefeng.guns.modular.system.model.*; import com.stylefeng.guns.modular.system.service.*; import com.stylefeng.guns.modular.system.util.*; import com.stylefeng.guns.modular.system.warpper.LoginWarpper; import com.stylefeng.guns.modular.taxi.model.PaymentRecord; import com.stylefeng.guns.modular.taxi.service.IPaymentRecordService; import com.stylefeng.guns.modular.taxi.service.ITransactionDetailsService; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.crypto.hash.Md5Hash; import org.apache.shiro.util.ByteSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.*; @Service public class UserInfoServiceImpl extends ServiceImpl implements IUserInfoService { @Resource private UserInfoMapper userInfoMapper; @Resource private UserActivityInviteMapper userActivityInviteMapper; @Autowired private RedisUtil redisUtil; @Autowired private ALiSendSms aLiSendSms; @Autowired private WeChatUtil weChatUtil; @Autowired private IPaymentRecordService paymentRecordService; @Autowired private ICompanyCityService companyCityService; @Autowired private IUserActivityRegisteredService userActivityRegisteredService; @Autowired private IUserCouponRecordService userCouponRecordService; @Autowired private ISmsrecordService smsrecordService; @Autowired private ITransactionDetailsService transactionDetailsService; @Autowired private IUserActivityBalanceService userActivityBalanceService; // @Autowired // private ICBCPayUtil icbcPayUtil; @Resource private DriverMapper driverMapper; @Resource private DriverActivityRegisteredMapper driverActivityRegisteredMapper; @Resource private DriverActivityHistoryMapper driverActivityHistoryMapper; @Autowired private IIncomeService incomeService; @Autowired private PushUtil pushUtil; @Autowired private ISystemNoticeService systemNoticeService; @Autowired private PushMinistryOfTransportUtil pushMinistryOfTransportUtil; @Autowired private HttpClientUtil httpClientUtil; @Autowired private DateUtil dateUtil; @Autowired private PayMoneyUtil payMoneyUtil; @Value("${callbackPath}") private String callbackPath; @Value("${pushMinistryOfTransport}") private boolean pushMinistryOfTransport; private String salt = "&a.s"; private Map loginTime = new HashMap<>();//登录时间 private Map loginFailures = new HashMap<>();//登录失败次数 /** * 获取短信验证码 * @param phone * @return */ @Override public ResultUtil queryCaptcha(String phone, Integer type) throws Exception { Random random = new Random(); StringBuffer sb = new StringBuffer(); for(int i = 0; i < 4; i++){ sb.append((int) (random.nextDouble() * 10)); } String authCode = sb.toString(); String sms = "短信验证码【" + authCode + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"; //发送验证码短信 redisUtil.setStrValue(phone, authCode, 5 * 60);//设置五分钟过期 String templateCode = ""; switch (type){ case 1: templateCode = "8212979ba98f4918823986481ae2e104";//身份验证 break; case 2: templateCode = "08b2c59bdce945549c0ee6bbe46252f8";//登录确认 break; case 3: templateCode = "c39681463441496aaa4d96a642ff4227";//用户注册 break; case 4: templateCode = "c230a6b92504473c97c17741e1cc0b9d";//修改密码 break; } // HuaWeiSMSUtil.sendSms("[\"" + authCode + "\"]", phone, "8822061324669", templateCode); String sData = aLiSendSms.sendSms(phone, "SMS_317840272", "{\"code\":\"" + authCode + "\"}"); // JSONObject jsonObject = JSON.parseObject(sData); // String message = jsonObject.getString("Message"); // if(!"OK".equals(message)){ // System.err.println(message); // return ResultUtil.error(message); // } System.out.println(sms); return ResultUtil.success(); } /** * 校验短信验证码 * @param phone * @param code * @return * @throws Exception */ @Override public boolean checkCaptcha(String phone, String code) throws Exception { Object value = redisUtil.getValue(phone); if("1234".equals(code)){ return true; } if(null != value && code.equals(String.valueOf(value))){ return true; }else{ return false; } } /** * 手机验证码登录 * @param phone * @param code * @return */ @Override public ResultUtil captchaLogin(String phone, String code, String registIp, String registAreaCode,String loginType) throws Exception { Integer frequency = loginFailures.get(phone); Long time = loginTime.get(phone); if(null != time && System.currentTimeMillis() < (time + 300000) && null != frequency && frequency >= 5){ return ResultUtil.error("暂时无法登录,请5分钟后重试!"); } if(null != time && System.currentTimeMillis() >= (time + 300000)){ frequency = 0; loginFailures.put(phone, frequency); } boolean b = this.checkCaptcha(phone, code); if(!b){ frequency = (null == frequency ? 0 : frequency) + 1; loginFailures.put(phone, frequency); if(frequency == 1){ loginTime.put(phone, System.currentTimeMillis()); } return ResultUtil.error("验证码无效"); } UserInfo userInfo = userInfoMapper.queryByPhone(phone); if(null == userInfo){ userInfo = new UserInfo(); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(this.getDefaultName()); userInfo.setRegistIp(registIp); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : null); userInfo.setRegistAreaCode(registAreaCode); } this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } /** * 手机验证码登录 * @param accessToken * @return */ @Override public ResultUtil oneClickLogin(String accessToken, String registIp, String registAreaCode,String loginType,String androidOrIos) throws Exception { String response = GetMobile.getPhone(accessToken,androidOrIos); if(response==null){ return ResultUtil.error("登录失败"); } System.out.println( response); JSONObject json = JSONObject.parseObject(response); if(!json.getBoolean("success")){ return ResultUtil.error("登录失败"); } String phone = json.getJSONObject("data").getString("mobile"); UserInfo userInfo = userInfoMapper.queryByPhone(phone); if(null == userInfo){ userInfo = new UserInfo(); userInfo.setPhone(phone); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setNickName(this.getDefaultName()); userInfo.setRegistIp(registIp); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : null); userInfo.setRegistAreaCode(registAreaCode); } this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ return ResultUtil.error("账号被冻结"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); loginWarpper.setPhone(2); //smsrecordService.saveData(1, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(loginWarpper); } @Override public synchronized ResultUtil captchaLogin(String phone, String code, Integer uid, Integer type, Integer userType,String loginType) throws Exception { ResultUtil resultUtil = this.captchaLogin(phone, code, null, null,loginType); if(resultUtil.getCode() == 200 && null != uid){ if(type == 2){//司机分享 Driver driver = driverMapper.selectById(uid); List> query = driverActivityRegisteredMapper.query(userType, driver.getCompanyId()); BigDecimal bigDecimal = new BigDecimal("0"); for(Map map : query){ if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(0D) > 0){ bigDecimal = bigDecimal.add(new BigDecimal(String.valueOf(null != map.get("money") ? map.get("money") : "0"))); incomeService.saveData(2, driver.getId(), 1, Integer.valueOf(String.valueOf(map.get("id"))), null, Double.valueOf(String.valueOf(map.get("money")))); } } driver.setActivityMoney(bigDecimal.add(new BigDecimal(null != driver.getActivityMoney() ? driver.getActivityMoney() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveActivityMoney(bigDecimal.add(new BigDecimal(null != driver.getLaveActivityMoney() ? driver.getLaveActivityMoney() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setBalance(bigDecimal.add(new BigDecimal(null != driver.getBalance() ? driver.getBalance() : 0)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverMapper.updateById(driver); Map date = dateUtil.getStartAndEndDate(new Date()); //邀请用户注册 List list = driverActivityHistoryMapper.queryList(uid, 2, 1, date.get("startTime"), date.get("endTime")); for(DriverActivityHistory dah : list){ dah.setCarryOut(2); dah.setCollectionTime(new Date()); driverActivityHistoryMapper.updateById(dah); } } if(type == 1){//用户分享 UserInfo userInfo = userInfoMapper.selectById(uid); List> query = userActivityInviteMapper.query(userInfo.getCompanyId()); Date date = new Date(); for(Map map : query){ Double lavePrice = Double.valueOf(map.get("lavePrice").toString()); for(int i = Integer.valueOf(String.valueOf(map.get("totalNum"))); i > 0; i--){ //判断当前优惠券金额是否大于可发放剩余总金额 if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setActivityType(3); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId")))); userCouponRecord.setState(1); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("effective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType")))); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType")))); userCouponRecord.setInsertTime(date); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money")))); userCouponRecord.setCompanyId(userInfo.getCompanyId()); userCouponRecord.setUserId(uid); userCouponRecordService.insert(userCouponRecord); //修改剩余可发放总金额 lavePrice -= Double.valueOf(String.valueOf(map.get("money"))); } UserActivityInvite uai = userActivityInviteMapper.selectById(Integer.valueOf(map.get("id").toString())); uai.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userActivityInviteMapper.updateById(uai); } } } return resultUtil; } /** * 手机号码查询用户 * @param phone * @return * @throws Exception */ @Override public UserInfo queryByPhone(String phone) throws Exception { return userInfoMapper.queryByPhone(phone); } /** * 账号密码登录 * @param phone * @param password * @return * @throws Exception */ @Override public ResultUtil userLogin(String phone, String password,String loginType) throws Exception { Integer frequency = loginFailures.get(phone); Long time = loginTime.get(phone); if(null != time && System.currentTimeMillis() < (time + 1800000) && null != frequency && frequency >= 5){ return ResultUtil.error("暂时无法登录,请30分钟后重试!"); } if(null != time && System.currentTimeMillis() >= (time + 1800000)){ frequency = 0; loginFailures.put(phone, frequency); } UserInfo userInfo = this.queryByPhone(phone); if(null == userInfo){ return ResultUtil.error("账号无效"); } if(userInfo.getState() == 2){ return ResultUtil.error("账号被冻结"); } if(!ShiroKit.md5(password, salt).equals(userInfo.getPassWord())){ frequency = (null == frequency ? 0 : frequency) + 1; loginFailures.put(phone, frequency); if(frequency == 1){ loginTime.put(phone, System.currentTimeMillis()); } return ResultUtil.error("密码错误"); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, password,loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } /** * 微信授权登录 * @param type 登录端口(1:APP登录,2:小程序) * @param openid 微信openid * @param unionid 微信unionid * @param jscode 小程序登录时的jscode临时凭证 * @param registIp ip地址 * @param registAreaCode 当前定位区县行政编号(6位) * @return */ @Override public ResultUtil wxLogin(Integer type, String openid, String unionid, String jscode, String registIp, String registAreaCode, Integer sex, String nickName, String avatar,String loginType) throws Exception { UserInfo userInfo = null; if(type == 2){//小程序 if(ToolUtil.isEmpty(jscode)){ return ResultUtil.error("微信登录请求失败,请重试"); } Map map = weChatUtil.code2Session(jscode); openid = map.get("openid"); unionid = map.get("unionid"); userInfo = userInfoMapper.queryByOpenid2(openid); }else{//APP userInfo = userInfoMapper.queryByOpenid(openid); } if(null == userInfo){ userInfo = new UserInfo(); userInfo.setPassWord(ShiroKit.md5("", salt)); userInfo.setRegistIp(registIp); userInfo.setSex(sex); userInfo.setNickName(ToolUtil.isNotEmpty(nickName) ? nickName : this.getDefaultName()); userInfo.setAvatar(avatar); if(type == 2){ userInfo.setAppletsOpenId(openid); }else{ userInfo.setOpenId(openid); } userInfo.setUnionid(unionid); userInfo.setIsAuth(1); userInfo.setConsumption(0D); userInfo.setBalance(0D); userInfo.setState(1); //用户所属企业 if(null != registAreaCode){ Company query = companyCityService.query(registAreaCode); userInfo.setCompanyId(null != query ? query.getId() : null); userInfo.setRegistAreaCode(registAreaCode); } this.insert(userInfo); this.addCoupon(userInfo);//添加优惠券 UserInfo finalUserInfo = userInfo; new Thread(new Runnable() { @Override public void run() { if(pushMinistryOfTransport){ //上传数据 pushMinistryOfTransportUtil.baseInfoPassenger(finalUserInfo.getId()); } } }).start(); } if(userInfo.getState() == 2){ return ResultUtil.error("账号被冻结"); } Integer frequency = loginFailures.get(userInfo.getPhone()); Long time = loginTime.get(userInfo.getPhone()); if(null != time && System.currentTimeMillis() < (time + 1800000) && null != frequency && frequency >= 5){ return ResultUtil.error("暂时无法登录,请30分钟后重试!"); } if(null != time && System.currentTimeMillis() >= (time + 1800000)){ frequency = 0; loginFailures.put(userInfo.getPhone(), frequency); } if(type == 2){//小程序登录 String value = redisUtil.getValue("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ jsonObject = JSON.parseObject(value); }else{ jsonObject = new JSONObject(); } jsonObject.put(userInfo.getId().toString(), userInfo.getAppletsOpenId()); redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString()); } //调用单点登录的逻辑 this.singlePointLogin(userInfo.getId(),loginType); String token = this.getToken(userInfo, "",loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(ToolUtil.isNotEmpty(userInfo.getPhone()) ? 2 : 1); loginWarpper.setEmergencyContact(userInfo.getEmergencyContact()); loginWarpper.setEmergencyContactNumber(userInfo.getEmergencyContactNumber()); return ResultUtil.success(loginWarpper); } /** * 忘记密码操作 * @param phone * @param code * @param password * @return * @throws Exception */ @Override public ResultUtil forgetPassword(String phone, String code, String password) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.queryByPhone(phone); if(null == userInfo){ return ResultUtil.error("手机号码未注册"); } if(userInfo.getState() == 2){ return ResultUtil.error("账号已被冻结"); } userInfo.setPassWord(ShiroKit.md5(password, salt)); userInfo.setUpdateUser(userInfo.getId()); userInfo.setUpdateTime(new Date()); this.updateById(userInfo); smsrecordService.saveData(3, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(); } /** * 设置手机号码操作 * @param uid * @param phone * @param code * @return * @throws Exception */ @Override public ResultUtil bindingPhone(Integer uid, String phone, String code,String loginType) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.selectById(uid); UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if(null != userInfo1){ userInfo1.setOpenId(userInfo.getOpenId()); userInfo1.setUnionid(userInfo.getUnionid()); userInfo1.setAppletsOpenId(userInfo.getAppletsOpenId()); userInfo1.setAvatar(userInfo.getAvatar()); userInfo1.setSex(userInfo.getSex()); userInfo1.setNickName(userInfo.getNickName()); this.updateById(userInfo1); if(loginType.equals("Applets")){//小程序登录后绑定手机号码 String value = redisUtil.getValue("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ jsonObject = JSON.parseObject(value); jsonObject.remove(userInfo.getId().toString());//删除原有账号缓存的数据 }else{ jsonObject = new JSONObject(); } jsonObject.put(userInfo1.getId().toString(), userInfo.getAppletsOpenId()); redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString()); } this.deleteById(userInfo.getId());//删除原有数据 //还原之前账号领取的注册优惠券 List list = userCouponRecordService.selectList(new EntityWrapper().eq("userId", userInfo.getId())); for(UserCouponRecord ucr : list){ if(ucr.getActivityType() == 1){//赠送 } if(ucr.getActivityType() == 2){//注册 UserActivityRegistered userActivityRegistered = userActivityRegisteredService.selectById(ucr.getCouponActivityId()); userActivityRegistered.setLaveNum(userActivityRegistered.getLaveNum() + 1); userActivityRegistered.setLavePrice(userActivityRegistered.getLavePrice() + ucr.getMoney()); userActivityRegisteredService.updateById(userActivityRegistered); } if(ucr.getActivityType() == 3){//邀请 } if(ucr.getActivityType() == 4){//充值 } userCouponRecordService.deleteById(ucr.getId()); } //获取新的token等数据 String token = this.getToken(userInfo1, "",loginType); LoginWarpper loginWarpper = new LoginWarpper(); loginWarpper.setId(userInfo1.getId()); loginWarpper.setToken(token); loginWarpper.setAppid(UUIDUtil.getRandomCode()); loginWarpper.setPhone(2); return ResultUtil.success(loginWarpper); } userInfo.setPhone(phone); userInfo.setUpdateTime(new Date()); userInfo.setUpdateUser(userInfo.getId()); this.updateById(userInfo); smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(new LoginWarpper()); } /** * 从redis中获取数据 * @param request * @return * @throws Exception */ @Override public Integer getUserIdFormRedis(HttpServletRequest request) throws Exception { String requestHeader = request.getHeader(JwtConstants.AUTH_HEADER); if (requestHeader != null && requestHeader.startsWith("Bearer ")) { requestHeader = requestHeader.substring(requestHeader.indexOf(" ") + 1); String key = null; int length = requestHeader.length(); if(length > 32){ key = requestHeader.substring(length - 32); }else{ key = requestHeader; } String value = redisUtil.getValue(key); return null != value ? Integer.valueOf(value) : null; }else{ return null; } } /** * 获取用户详情 * @param uid * @return * @throws Exception */ @Override public Map queryUserInfo(Integer uid) throws Exception { return userInfoMapper.queryUserInfo(uid, null); } /** * 电话号码查询用户 * @param phone * @return * @throws Exception */ @Override public Map queryUser(String phone) throws Exception { return userInfoMapper.queryUserInfo(null, phone); } /** * 设置紧急联系人 * @param name * @param phone * @param uid * @throws Exception */ @Override public void setUrgentUser(String name, String phone, Integer uid) throws Exception { userInfoMapper.setUrgentUser(name, phone, uid); } /** * 充值余额 * @param payType * @param money * @param uid * @return * @throws Exception */ @Override public ResultUtil depositBalance(Integer payType, Double money, Integer uid, Integer type) throws Exception { UserInfo userInfo = userInfoMapper.selectById(uid); if(money.compareTo(0D) <= 0){ return ResultUtil.error("支付金额必须大于0元"); } if(payType == 1){//微信支付 // String value = redisUtil.getValue("appletOpenId"); // String appletsOpenId = null; // if(ToolUtil.isNotEmpty(value)){ // JSONObject jsonObject = JSON.parseObject(value); // appletsOpenId = jsonObject.getString(uid.toString()); // }else{ // appletsOpenId = userInfo.getAppletsOpenId(); // } Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1);//添加预支付数据 String app = (type == 1 ? "APP" : "JSAPI"); System.err.println(app); return payMoneyUtil.weixinpay("余额充值", uid.toString(), integer.toString(), money.toString(), "/base/wxCancelUserBalance", app, userInfo.getAppletsOpenId()); // String value = redisUtil.getValue("appletOpenId"); // String appletsOpenId = null; // if(ToolUtil.isNotEmpty(value)){ // JSONObject jsonObject = JSON.parseObject(value); // appletsOpenId = jsonObject.getString(uid.toString()); // }else{ // appletsOpenId = userInfo.getAppletsOpenId(); // } // Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 1, money, "", 1);//添加预支付数据 // Map map = icbcPayUtil.placeAnOrder(integer.toString(), 9, 5, uid.toString(), "余额充值", money, callbackPath + "/base/wxCancelUserBalance", uid.toString(), type, appletsOpenId); // if(map.get("code").equals("200")){ // PaymentRecord paymentRecord = paymentRecordService.selectById(integer); // paymentRecord.setCode(map.get("order_id")); // paymentRecordService.updateById(paymentRecord); // return ResultUtil.success(map.get("data")); // }else{ // return ResultUtil.error(map.get("msg"), ""); // } } if(payType == 2){//支付宝支付 Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1);//添加预支付数据 return payMoneyUtil.alipay("余额充值", "余额充值", uid.toString(), integer.toString(), money.toString(), "/base/aliCancelUserBalance"); // Integer integer = paymentRecordService.saveData(2, uid, 1, null, null, 2, money, "", 1);//添加预支付数据 // Map map = icbcPayUtil.placeAnOrder(integer.toString(), 10, 5, uid.toString(), "余额充值", money, callbackPath + "/base/aliCancelUserBalance", uid.toString(), type, null); // if(map.get("code").equals("200")){ // PaymentRecord paymentRecord = paymentRecordService.selectById(integer); // paymentRecord.setCode(map.get("order_id")); // paymentRecordService.updateById(paymentRecord); // return ResultUtil.success(map.get("data")); // }else{ // return ResultUtil.error(map.get("msg"), ""); // } } return ResultUtil.success(); } /** * 修改手机号码 * @param code * @param phone * @param uid * @return * @throws Exception */ @Override public ResultUtil updatePhone(String code, String phone, Integer uid) throws Exception { boolean b = this.checkCaptcha(phone, code); if(!b){ return ResultUtil.error("验证码无效"); } UserInfo userInfo = this.selectById(uid); UserInfo userInfo1 = userInfoMapper.queryByPhone(phone); if(null != userInfo1){ return ResultUtil.error("手机号已被注册"); } userInfo.setPhone(phone); this.updateById(userInfo); // smsrecordService.saveData(2, phone, code, "短信验证码【" + code + "】已发到您的手机,验证码将在5分钟后失效,请及时登录!"); return ResultUtil.success(); } /** * 修改密码 * @param password * @param uid * @return * @throws Exception */ @Override public ResultUtil updatePass(String password, Integer uid) throws Exception { UserInfo userInfo = this.selectById(uid); userInfo.setPassWord(ShiroKit.md5(password, salt)); this.updateById(userInfo); return ResultUtil.success(); } /** * 修改个人信息 * @param avatar * @param nickname * @param sex * @param birthday * @param uid * @throws Exception */ @Override public void updateInfo(String avatar, String nickname, Integer sex, Date birthday, Integer uid) throws Exception { UserInfo userInfo = this.selectById(uid); if(ToolUtil.isNotEmpty(avatar)){ userInfo.setAvatar(avatar); } if(ToolUtil.isNotEmpty(nickname)){ userInfo.setNickName(nickname); } if(null != sex){ userInfo.setSex(sex); } if(null != birthday){ userInfo.setBirthday(birthday); } this.updateById(userInfo); } /** * 获取实名认证数据 * @param uid * @return * @throws Exception */ @Override public Map queryRealName(Integer uid) throws Exception { return userInfoMapper.queryRealName(uid); } /** * 完成余额充值后的处理 * @param id 用户id * @param order_id 工行订单id * @param type 支付类型(1=微信,2=支付宝) * @throws Exception */ @Override public void payCancelUserBalance(Integer id, String order_id, Integer paymentRecordId, Integer type) throws Exception { UserInfo userInfo = this.selectById(id); PaymentRecord query = paymentRecordService.selectById(paymentRecordId); if(null != query){ //添加交易明细 transactionDetailsService.saveData(Integer.valueOf(id), "余额充值", query.getAmount(), 2, 1, 1, 5, null); double v = new BigDecimal(userInfo.getBalance()).add(new BigDecimal(query.getAmount())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); userInfo.setBalance(v); this.updateById(userInfo); query.setCode(order_id); query.setState(2); paymentRecordService.updateById(query); this.addCoupon(userInfo.getId(), query.getAmount(), userInfo.getCompanyId(), query.getId());//添加优惠券 }else{ System.err.println("预支付数据异常(userId = " + id + ")"); } } /** * H5接入道行龙城实现登录 * @param authCode * @return * @throws Exception */ @Override public ResultUtil dxlcLogin(String authCode, String registAreaCode,String loginType) throws Exception { Map map = new HashMap<>(); //生成环境 String path = "https://open.brightcns.com"; map.put("clientId", "4821416759766550929"); map.put("clientSecret", "yuDyNoOuFeknuLGbLSsWZoaLtHGQaelobgmMlbpgquyAacyBXomwDDSgErKWtDwy"); //测试环境 // String path = "https://open.test.brightcns.cn"; // map.put("clientId", "4818328904840251536"); // map.put("clientSecret", "JZrYSBvtVlIRbnsnoJuaqheRWAEHcEJVgeAeIHAUojwUwZIAVzSpAWxgozhfPbcq"); map.put("grantType", "authorization_code"); map.put("authCode", authCode); String get = httpClientUtil.pushHttpRequset("GET", path + "/api/oauth/accessToken", map, null, ""); System.err.print("获取accessToken:" + get); JSONObject jsonObject = JSON.parseObject(get); Boolean success = jsonObject.getBoolean("success"); String code = jsonObject.getString("code"); if(success && "SUCCESS".equals(code)){ JSONObject data = jsonObject.getJSONObject("data"); String accessToken = data.getString("accessToken"); String userId = data.getString("userId"); String refreshToken = data.getString("refreshToken"); Map userInfo = this.getUserInfo(accessToken); if(null == userInfo){ return ResultUtil.error("获取用户信息失败"); } return this.captchaLogin(userInfo.get("phone"), "1234", null, registAreaCode, loginType); }else{ return ResultUtil.error(jsonObject.getString("msg")); } } /** * 小程序使用手机号登录绑定微信 * @param userId * @param jscode * @return * @throws Exception */ @Override public ResultUtil phoneLoginBindingWeChat(Integer userId, String jscode) throws Exception { Map map = weChatUtil.code2Session(jscode); String openid = map.get("openid"); String unionid = map.get("unionid"); //将当前小程序openid存储到缓存中用后面的支付时使用 String value = redisUtil.getValue("appletOpenId"); JSONObject jsonObject = null; if(ToolUtil.isNotEmpty(value)){ jsonObject = JSON.parseObject(value); }else{ jsonObject = new JSONObject(); } jsonObject.put(userId.toString(), openid); redisUtil.setStrValue("appletOpenId", jsonObject.toJSONString()); return ResultUtil.success(); } public Map getUserInfo(String accessToken){ String path = "https://open.brightcns.com";//生产环境 // String path = "https://open.test.brightcns.cn";//测试环境 Map map = new HashMap<>(); map.put("accessToken", accessToken); String get = httpClientUtil.pushHttpRequset("GET", path + "/api/userinfo", map, null, ""); System.err.print("获取用户信息:" + get); JSONObject jsonObject = JSON.parseObject(get); Boolean success = jsonObject.getBoolean("success"); String code = jsonObject.getString("code"); if(success && "SUCCESS".equals(code)){ Map map1 = new HashMap<>(); JSONObject data = jsonObject.getJSONObject("data"); map1.put("userId", data.getString("userId")); map1.put("phone", data.getString("phone")); map1.put("userName", data.getString("userName")); return map1; } return null; } /** * 添加充值活动优惠券 * @param userId * @param money * @param companyId * @throws Exception */ public synchronized void addCoupon(Integer userId, Double money, Integer companyId, Integer paymentRecordId) throws Exception{ List> query = userActivityBalanceService.query(money, companyId); List list = new ArrayList<>(); for(Map map : query){ //添加通用优惠券 Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice"))); if(null != map.get("bcompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("generalNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("bmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("bcompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("bmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("bfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("bcouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("bcouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("beffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("bId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("bmoney"))); } } //专车优惠券 if(null != map.get("ccompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("specialNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("cmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ccompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("cmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("cfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ccouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ccouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("ceffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("cId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("cmoney"))); } } //出租车优惠券 if(null != map.get("dcompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("taxiNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("dmoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("dcompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("dmoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("dfullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("dcouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("dcouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("deffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("dId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("dmoney"))); } } //跨城优惠券 if(null != map.get("ecompanyId")){ for(int i = 0; i < Integer.valueOf(String.valueOf(map.get("intercityNum"))); i++){ //判断当前发放的优惠券是否大于剩余总发放金额 if(Double.valueOf(String.valueOf(map.get("emoney"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userId); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("ecompanyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("emoney")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("efullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("ecouponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("ecouponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + Integer.valueOf(String.valueOf(map.get("eeffective")))); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setPaymentRecordId(paymentRecordId); userCouponRecord.setActivityType(4); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("eId")))); list.add(userCouponRecord); //开始修改剩余总发放金额 lavePrice -= Double.valueOf(String.valueOf(map.get("emoney"))); } } UserActivityBalance uab = userActivityBalanceService.selectById(Integer.valueOf(map.get("id").toString())); uab.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userActivityBalanceService.updateById(uab); if(list.size() > 0){ userCouponRecordService.insertBatch(list); } } } /** * 获取默认名称 * @return */ public String getDefaultName(){ int num = this.selectCount(new EntityWrapper().ne("flag", 3)) + 1000001; return "KY" + String.valueOf(num).substring(1); } /** * 获取token * @param userInfo * @param password * @return */ private String getToken(UserInfo userInfo, String password,String type) throws Exception{ if(ToolUtil.isEmpty(type))type="APP"; //封装请求账号密码为shiro可验证的token UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(userInfo.getPhone(), password.toCharArray()); String credentials = userInfo.getPassWord(); ByteSource credentialsSalt = new Md5Hash(salt); SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo( new ShiroUser(), credentials, credentialsSalt, ""); //校验用户账号密码 HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.hashAlgorithmName); md5CredentialsMatcher.setHashIterations(ShiroKit.hashIterations); boolean passwordTrueFlag = md5CredentialsMatcher.doCredentialsMatch( usernamePasswordToken, simpleAuthenticationInfo); String s = JwtTokenUtil.generateToken(String.valueOf(userInfo.getId())); redisUtil.setStrValue(s.substring(s.length() - 32), String.valueOf(userInfo.getId()), 180 * 24 * 60 * 60); redisUtil.setStrValue("USER_"+type+"_" + userInfo.getPhone(), s.substring(s.length() - 32)); redisUtil.setStrValue("USER_"+type +"_"+ userInfo.getId(), s); return s; } /** * 注册时查询活动添加优惠券 * @param userInfo * @throws Exception */ private synchronized void addCoupon(UserInfo userInfo) throws Exception{ //添加优惠券 List> list = userActivityRegisteredService.query(userInfo.getCompanyId()); int num = 0; for(Map map : list){ if(null != map){ Integer totalNum = Integer.valueOf(String.valueOf(map.get("totalNum"))); Double lavePrice = Double.valueOf(String.valueOf(map.get("lavePrice"))); for(int i = totalNum; i > 0; i--){ //判断当前发放的优惠券是否大于剩余可发送总金额 if(Double.valueOf(String.valueOf(map.get("money"))).compareTo(lavePrice) > 0){ break; } UserCouponRecord userCouponRecord = new UserCouponRecord(); userCouponRecord.setUserId(userInfo.getId()); userCouponRecord.setCompanyId(Integer.valueOf(String.valueOf(map.get("companyId")))); userCouponRecord.setMoney(Double.valueOf(String.valueOf(map.get("money")))); userCouponRecord.setFullMoney(Double.valueOf(String.valueOf(map.get("fullMoney")))); userCouponRecord.setInsertTime(new Date()); userCouponRecord.setState(1); userCouponRecord.setCouponUseType(Integer.valueOf(String.valueOf(map.get("couponUseType")))); userCouponRecord.setCouponType(Integer.valueOf(String.valueOf(map.get("couponType")))); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); Integer integer = Integer.valueOf(String.valueOf(null != map.get("effective") ? map.get("effective") : "0")); calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + integer); userCouponRecord.setExpirationTime(calendar.getTime()); userCouponRecord.setCouponId(Integer.valueOf(String.valueOf(map.get("couponId")))); userCouponRecord.setCouponActivityId(Integer.valueOf(String.valueOf(map.get("id")))); userCouponRecord.setActivityType(2); userCouponRecordService.insert(userCouponRecord); //修改剩余可发放总金额 lavePrice -= Double.valueOf(String.valueOf(map.get("money"))); num++; } UserActivityRegistered uar = userActivityRegisteredService.selectById(Integer.valueOf(map.get("id").toString())); uar.setLavePrice(new BigDecimal(lavePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userActivityRegisteredService.updateById(uar); } } //添加系统消息 systemNoticeService.addSystemNotice(1, "您已获得" + num + "张优惠券,点击查看", userInfo.getId(), 2); } /** * 单点登录 * @param id */ private void singlePointLogin(Integer id,String type) throws Exception{ if(ToolUtil.isEmpty(type))type="APP"; //开始验证当前账号是否在别处登录 String value = redisUtil.getValue("USER_"+type+"_" + id); if(ToolUtil.isNotEmpty(value)){//将另外设备上的强迫下线 //开始清除redis中无效的数据 UserInfo userInfo = userInfoMapper.selectById(id); String key = redisUtil.getValue("USER_"+type+"_" + userInfo.getPhone()); redisUtil.remove(key);//删除个人信息数据 redisUtil.remove("USER_"+type+"_" + userInfo.getPhone());//删除后台冻结相关缓存 redisUtil.remove("USER_"+type+"_" + id);//清除存储的token } } }