From f35c8cb2bc38f49ec3b803c60428f1352e83b763 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E9=B9=8F=E8=BE=89?= <18322780655@163.com> Date: Thu, 24 Aug 2023 09:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/gateway/util/MD5Util.java | 199 ++++++++++++++++++ .../controller/SystemApiController.java | 102 +++++++++ .../system/controller/UserController.java | 6 +- .../system/service/SystemApiService.java | 80 +++++++ .../admin/system/service/Userservice.java | 112 ++++++++-- .../common/system/util/ExceptionUtil.java | 2 + .../lkl/service/MerchantLklService.java | 5 + 7 files changed, 483 insertions(+), 23 deletions(-) create mode 100644 gateway-service/src/main/java/com/chaozhangui/system/gateway/util/MD5Util.java create mode 100644 newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/SystemApiController.java create mode 100644 newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/SystemApiService.java diff --git a/gateway-service/src/main/java/com/chaozhangui/system/gateway/util/MD5Util.java b/gateway-service/src/main/java/com/chaozhangui/system/gateway/util/MD5Util.java new file mode 100644 index 0000000..b89cb14 --- /dev/null +++ b/gateway-service/src/main/java/com/chaozhangui/system/gateway/util/MD5Util.java @@ -0,0 +1,199 @@ +package com.chaozhangui.system.gateway.util; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.Map; + +public class MD5Util { + + + private static final Logger log = LoggerFactory.getLogger(MD5Util.class); + + private static final String hexDigIts[] = {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}; + + public static String encrypt(String plainText) { + try { + return encrypt(plainText,true); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + log.error("MD5加密异常:",e); + return null; + } + } + + /** + * @Title: encrypt + * @Description: TODO(16位或32位密码) + * @param @param + * plainText + * @param @param + * flag true为32位,false为16位 + * @throws UnsupportedEncodingException + */ + public static String encrypt(String plainText, boolean flag) throws UnsupportedEncodingException { + try { + if (ObjectUtil.isEmpty(plainText)) { + return null; + } + MessageDigest md = MessageDigest.getInstance("MD5"); + String encrStr = byteArrayToHexString(md.digest(plainText.getBytes("UTF-8"))); + if (flag) + return encrStr; + else + return encrStr.substring(8, 24); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + + } + + @SuppressWarnings("unchecked") + public static String encrypt(Object obj,String privateKey){ + if(obj==null){ + return null; + } + Map map = new HashMap(); + if(obj instanceof Map){ + map=(Map) obj; + }else{ + map = BeanUtil.transBean2Map(obj); + } + return encrypt(map,privateKey,true); + } + + /** + * @Title: encrypt + * @Description: TODO(16位或32位密码) + * @param @param + * plainText + * @param @param + * flag true为32位,false为16位 + * @throws UnsupportedEncodingException + */ + public static String encrypt(Map map, String privateKey,boolean flag) { + String param = null; + map.remove("sign"); + map.remove("encrypt"); + String result = BeanUtil.mapOrderStr(map); + result= result.concat("&key=").concat(privateKey); + System.out.println("待加密的数据:"+result); + if (StringUtils.isEmpty(result)) { + return null; + } + param = encrypt(encrypt(result)+privateKey); + if (flag) { + return param; + } else { + param = param.substring(8, 24); + } + return param; + } + + + + public static String encrypt(Map map, boolean flag) { + String param = null; + map.remove("sign"); + map.remove("encrypt"); + String result = BeanUtil.mapOrderStr(map); + System.out.println("待加密的数据:"+result); + if (StringUtils.isEmpty(result)) { + return null; + } + param = encrypt(encrypt(result)); + if (flag) { + return param; + } else { + param = param.substring(8, 24); + } + return param; + } + + + + + public static String encryptString(String result, boolean flag) { + String param = null; + System.out.println("待加密的数据:"+result); + if (StringUtils.isEmpty(result)) { + return null; + } + param = encrypt(result); + if (flag) { + return param; + } else { + param = param.substring(8, 24); + } + return param; + } + + public static Map resultMap = new HashMap(); + @SuppressWarnings("unchecked") + public static Map mapFn(Map map) { + for (String key : map.keySet()) { + if (map.get(key) != null && map.get(key) != "" && (!key.equals("BTYPE") && !key.equals("SIGN"))) { + if (key.equals("INPUT")) { + if (map.get(key) != null) { + mapFn((Map) map.get(key)); + } + } else { + resultMap.put(key, map.get(key)); + } + } + } + return resultMap; + } + + @SuppressWarnings("unchecked") + public static boolean check(Object obj,String privateKey){ + Map map=new HashMap(); + if(obj==null){ + return false; + } + if(obj instanceof Map){ + map=(Map) obj; + }else{ + map = BeanUtil.transBean2Map(obj); + } + + System.out.println("check:"+ JSONUtil.toJsonStr(map)); + String sign=(String)map.get("sign"); + if(sign==null){ + return false; + } + String str=encrypt(obj,privateKey); + System.out.println("check: "+str); + + return sign.equals(str)?true:false; + } + + public static String byteArrayToHexString(byte b[]){ + StringBuffer resultSb = new StringBuffer(); + for(int i = 0; i < b.length; i++){ + resultSb.append(byteToHexString(b[i])); + } + return resultSb.toString(); + } + + public static String byteToHexString(byte b){ + int n = b; + if(n < 0){ + n += 256; + } + int d1 = n / 16; + int d2 = n % 16; + return hexDigIts[d1] + hexDigIts[d2]; + } + + + +} diff --git a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/SystemApiController.java b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/SystemApiController.java new file mode 100644 index 0000000..7819c5d --- /dev/null +++ b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/SystemApiController.java @@ -0,0 +1,102 @@ +package com.chaozhanggui.admin.system.controller; + +import com.chaozhanggui.admin.system.service.SystemApiService; +import com.chaozhanggui.admin.system.util.RSAUtil; +import com.chaozhanggui.common.system.config.RespBody; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +/** + * 系统设置 + */ +@CrossOrigin(origins = "*") +@RestController +@RequestMapping("systemApi") +@Slf4j +public class SystemApiController { + + + @Autowired + SystemApiService systemApiService; + + /** + * 获取appid 信息 + * @param loginName + * @param token + * @param userId + * @param appId + * @param pageNum + * @param pageSize + * @return + */ + @GetMapping("querySystemApis") + public RespBody querySystemApis(@RequestHeader("loginName") String loginName, @RequestHeader("token") String token, @RequestHeader("userId") String userId + ,@RequestParam("appId") String appId ,@RequestParam("pageNum") Integer pageNum + ,@RequestParam("pageSize") Integer pageSize + ){ + return systemApiService.querySystemApi(appId,pageNum,pageSize); + } + + + /** + * 修改api 配置 + * @param loginName + * @param token + * @param userId + * @param id + * @param ip + * @param publicKey + * @param privateKey + * @return + */ + @GetMapping("modfityApi") + public RespBody modfityApi(@RequestHeader("loginName") String loginName, @RequestHeader("token") String token, @RequestHeader("userId") String userId + ,@RequestParam("id") Integer id,@RequestParam("ip") String ip,@RequestParam("publicKey") String publicKey,@RequestParam("privateKey") String privateKey ){ + return systemApiService.modifyApi(id,ip,publicKey,privateKey); + } + + /** + * 新增api + * @param loginName + * @param token + * @param userId + * @param appId + * @param ip + * @param publicKey + * @param privateKey + * @return + */ + @GetMapping("initApi") + public RespBody initApi(@RequestHeader("loginName") String loginName, @RequestHeader("token") String token, @RequestHeader("userId") String userId + ,@RequestParam("appId") String appId,@RequestParam("ip") String ip,@RequestParam("publicKey") String publicKey,@RequestParam("privateKey") String privateKey ){ + return systemApiService.insertApi(appId,ip,publicKey,privateKey); + } + + + /** + * 生成密钥对 + * @param loginName + * @param token + * @param userId + * @return + */ + @GetMapping("createKey") + public RespBody createKey(@RequestHeader("loginName") String loginName, @RequestHeader("token") String token, @RequestHeader("userId") String userId + ){ + try { + RSAUtil.KeyStore keys= RSAUtil.createKeys(); + Map map=new HashMap<>(); + map.put("publicKey",keys.getPublicKey()); + map.put("privateKey",keys.getPrivateKey()); + return new RespBody("000000",map); + + } catch (Exception e) { + e.printStackTrace(); + } + return new RespBody("999944"); + } +} diff --git a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/UserController.java b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/UserController.java index 46dfbc4..daec97a 100644 --- a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/UserController.java +++ b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/controller/UserController.java @@ -231,6 +231,10 @@ public class UserController { public RespBody withdrawalProfit(@RequestHeader("loginName") String loginName, @RequestHeader("token") String token, @RequestHeader("userId") String userId, @RequestParam("amount") BigDecimal amount ){ - return userservice.withdrawalProfit(userId, amount); + try { + return userservice.withdrawalProfit(userId, amount); + } catch (Exception e) { + throw new RuntimeException(e); + } } } diff --git a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/SystemApiService.java b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/SystemApiService.java new file mode 100644 index 0000000..8870958 --- /dev/null +++ b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/SystemApiService.java @@ -0,0 +1,80 @@ +package com.chaozhanggui.admin.system.service; + +import cn.hutool.core.util.ObjectUtil; +import com.chaozhanggui.common.system.config.RespBody; +import com.chaozhanggui.dao.system.dao.*; +import com.chaozhanggui.dao.system.entity.*; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +@Service +public class SystemApiService { + + @Autowired + GuserSetMapper guserSetMapper; + + @Autowired + TbPlussMerchantBaseInfoMapper baseInfoMapper; + + @Autowired + TbPlussUserAppMapper tbPlussUserAppMapper; + + @Autowired + TbPlussMerchantStoreMapper tbPlussMerchantStoreMapper; + public RespBody querySystemApi(String appId,Integer pageNum,Integer pageSize){ + PageHelper.startPage(pageNum, pageSize); + List list=guserSetMapper.selectByAppId(appId); + PageInfo pageInfo=new PageInfo(list); + return new RespBody("000000",pageInfo); + } + + public RespBody modifyApi(Integer id,String ip,String publicKey,String privateKey){ + + GuserSet guserSet=guserSetMapper.selectByPrimaryKey(id); + if(ObjectUtil.isEmpty(guserSet)){ + return new RespBody("000034"); + } + guserSet.setIp(ip); + guserSet.setPublicKey(publicKey); + guserSet.setPrivateKey(privateKey); + guserSet.setUpdateTime(new Date()); + guserSetMapper.updateByPrimaryKeySelective(guserSet); + return new RespBody("000000"); + } + + + public RespBody insertApi(String appId,String ip,String publicKey,String privateKey){ + TbPlussMerchantBaseInfo baseInfo= baseInfoMapper.selectByMerchantcode(appId); + if(ObjectUtil.isEmpty(baseInfo)){ + return new RespBody("000034"); + } + TbPlussUserApp userApp= tbPlussUserAppMapper.selectByUserId(baseInfo.getUserid()); + if(ObjectUtil.isEmpty(userApp)){ + return new RespBody("000034"); + } + + TbPlussMerchantStore store=tbPlussMerchantStoreMapper.getStoreByMerchantCode(baseInfo.getMerchantcode()); + if(ObjectUtil.isEmpty(store)){ + return new RespBody("000034"); + } + + GuserSet set=new GuserSet(); + set.setAppId(appId); + set.setStoreId(store.getId().toString()); + set.setStoreName(store.getStorename()); + set.setStoreCode(store.getStoreid()); + set.setMerchantName(store.getMerchantname()); + set.setToken(userApp.getToken()); + set.setIp(ip); + set.setPublicKey(publicKey); + set.setPrivateKey(privateKey); + set.setCreateTime(new Date()); + guserSetMapper.insert(set); + return new RespBody("000000"); + } +} diff --git a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/Userservice.java b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/Userservice.java index 6d93efe..2a0f299 100644 --- a/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/Userservice.java +++ b/newadmin/admin/src/main/java/com/chaozhanggui/admin/system/service/Userservice.java @@ -14,12 +14,14 @@ import com.chaozhanggui.common.system.config.RespBody; import com.chaozhanggui.dao.system.dao.*; import com.chaozhanggui.dao.system.entity.*; import com.chaozhanggui.dao.system.model.CashStatus; +import com.chaozhanggui.dao.system.util.N; import com.chaozhanggui.system.service.AliPayService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -52,6 +54,12 @@ public class Userservice { @Resource AliPayService aliPayService; + @Autowired + TbPlussUserAccountMapper tbPlussUserAccountMapper; + + @Autowired + TbPlussUserAccountFlowMapper tbPlussUserAccountFlowMapper; + public RespBody doLogin(String loginName,String password,String userType,String ip) throws Exception { Boolean flag=false; if("FO".equals(userType)||"SO".equals(userType)||"MG".equals(userType)){ @@ -322,6 +330,7 @@ public class Userservice { + @Transactional(rollbackFor = Exception.class) public RespBody modifyOutFlow(Integer id,String userId,String status) throws Exception{ if(ObjectUtil.isEmpty(id)||ObjectUtil.isEmpty(userId)||ObjectUtil.isEmpty(status)){ log.error("参数错误"); @@ -431,10 +440,33 @@ public class Userservice { it.setStatus("1"); return true; }).collect(Collectors.toList()); + + if(promotion.getTypeCode().equals("MG")){ cash.setStatus(1); } cash.setCashstatus(JSONUtil.toJsonStr(cashStatusList)); + + //释放资金 + TbPlussUserAccount userAccount= tbPlussUserAccountMapper.selectByPrimaryKey(cash.getUserid()); + if(ObjectUtil.isEmpty(userAccount)|| N.gt(cash.getCashamt(),userAccount.getFreezeBalance())){ + throw new Exception("冻结资金不足"); + } + + userAccount.setFreezeBalance(userAccount.getFreezeBalance().subtract(cash.getCashamt())); + userAccount.setUpdateTime(new Date()); + tbPlussUserAccountMapper.updateByPrimaryKey(userAccount); + + TbPlussUserAccountFlow flow=new TbPlussUserAccountFlow(); + + flow.setUserId(cash.getUserid()); + flow.setBizCode("105"); + flow.setBizName("提现拒绝解冻"); + flow.setAmount(cash.getCashamt()); + flow.setBalance(userAccount.getBalance()); + flow.setCreateTime(new Date()); + tbPlussUserAccountFlowMapper.insert(flow); + break; case "2": cashStatusList.stream().filter(it->{ @@ -444,9 +476,9 @@ public class Userservice { //支付宝打款 try { aliPayService.alipayTransfer(cash.getVirrealcashamt().toString(),cash.getAccountno(),cash.getAccountname(),"",cash.getCashnumber()); - } catch (AlipayApiException e) { - e.printStackTrace(); - return false; + modFunds(cash.getUserid(),cash.getCashamt()); + } catch (Exception e) { + throw new RuntimeException(e); } } return true; @@ -462,6 +494,41 @@ public class Userservice { tbPlussCashMapper.updateByPrimaryKey(cash); return new RespBody("000000"); + } + + + public void modFunds(Integer userId,BigDecimal amount) throws Exception { + //释放资金,扣除资金 + TbPlussUserAccount userAccount= tbPlussUserAccountMapper.selectByPrimaryKey(userId); + if(ObjectUtil.isEmpty(userAccount)|| N.gt(amount,userAccount.getFreezeBalance())){ + throw new Exception("冻结资金不足"); + } + userAccount.setFreezeBalance(userAccount.getFreezeBalance().subtract(amount)); + userAccount.setBalance(userAccount.getBalance().subtract(amount)); + userAccount.setUpdateTime(new Date()); + tbPlussUserAccountMapper.updateByPrimaryKey(userAccount); + + TbPlussUserAccountFlow flow=new TbPlussUserAccountFlow(); + flow.setUserId(userId); + flow.setBizCode("105"); + flow.setBizName("提现解冻"); + flow.setAmount(amount); + flow.setBalance(userAccount.getBalance()); + flow.setCreateTime(new Date()); + tbPlussUserAccountFlowMapper.insert(flow); + + + flow=new TbPlussUserAccountFlow(); + flow.setUserId(userId); + flow.setBizCode("106"); + flow.setBizName("提现扣除"); + flow.setAmount(amount); + flow.setBalance(userAccount.getBalance()); + flow.setCreateTime(new Date()); + tbPlussUserAccountFlowMapper.insert(flow); + + + } public RespBody getUserBalance(String userId){ @@ -482,7 +549,8 @@ public class Userservice { } - public RespBody withdrawalProfit(String userId,BigDecimal amount){ + @Transactional(rollbackFor = Exception.class) + public RespBody withdrawalProfit(String userId,BigDecimal amount) throws Exception{ TbPlussUserInfo userInfo= userInfoMapper.selectByPrimaryKey(Long.valueOf(userId)); @@ -510,21 +578,10 @@ public class Userservice { return new RespBody("000032"); } -// TbPlussMerchantBaseInfo baseInfo= baseInfoMapper.selectByUserId(userId); -// if(ObjectUtil.isEmpty(baseInfo)){ -// log.error("商户信息不存在"); -// return new RespBody("000031"); -// } - - BigDecimal profit= tbPlussCashMapper.selectByUserId(userId); - - BigDecimal fronzenAmt=tbPlussCashMapper.selectCashFrozenAmountByUserId(userId); - - BigDecimal successAmt=tbPlussCashMapper.selectCashAmt(userId); - - if(amount.compareTo(profit.subtract(fronzenAmt).subtract(successAmt))>0){ - log.error("可提余额不足:{},{},{}",userId,amount,profit.subtract(fronzenAmt).subtract(successAmt)); + TbPlussUserAccount userAccount= tbPlussUserAccountMapper.selectByPrimaryKey(Integer.valueOf(userId)); + if(ObjectUtil.isEmpty(userAccount)|| N.gt(amount,userAccount.getBalance().subtract(userAccount.getFreezeBalance()))){ + log.error("可提余额不足:{},{},{}",userId,amount,userAccount.getBalance().subtract(userAccount.getFreezeBalance())); return new RespBody("000029"); } @@ -540,10 +597,6 @@ public class Userservice { TbPlussCash cash=new TbPlussCash(); cash.setUserid(Integer.valueOf(userId)); cash.setUsername(userInfo.getTruename()); -// cash.setMerchantcode(baseInfo.getMerchantcode()); -// cash.setMerchantname(baseInfo.getMerchantname()); -// cash.setAccountno(account.getAccountno()); -// cash.setAccountname(account.getAccountname()); cash.setCashamt(amount); cash.setCreatedt(new Date()); cash.setCashnumber(StringUtil.getBillno()); @@ -553,6 +606,21 @@ public class Userservice { cash.setRatiocharge(cash.getCashamt().multiply(BigDecimal.valueOf(0.08))); cash.setCashstatus(JSONUtil.toJsonStr(getCashMap(promotion.getParentUserId(),new LinkedList<>()))); tbPlussCashMapper.insertSelective(cash); + + + userAccount.setFreezeBalance(userAccount.getFreezeBalance().add(amount)); + userAccount.setUpdateTime(new Date()); + tbPlussUserAccountMapper.updateByPrimaryKey(userAccount); + + TbPlussUserAccountFlow flow=new TbPlussUserAccountFlow(); + flow.setUserId(Integer.valueOf(userId)); + flow.setBizCode("108"); + flow.setBizName("提现冻结"); + flow.setAmount(amount); + flow.setBalance(userAccount.getBalance()); + flow.setCreateTime(new Date()); + tbPlussUserAccountFlowMapper.insert(flow); + return new RespBody("000000"); } diff --git a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/ExceptionUtil.java b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/ExceptionUtil.java index e238278..85a4595 100644 --- a/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/ExceptionUtil.java +++ b/newadmin/common-api/src/main/java/com/chaozhanggui/common/system/util/ExceptionUtil.java @@ -49,6 +49,7 @@ public class ExceptionUtil { map.put("000031","商户信息不存在"); map.put("000032","小于最小提现金额"); map.put("000033","平台不允许提现"); + map.put("000034","资源不存在"); @@ -112,6 +113,7 @@ public class ExceptionUtil { map.put("999941","不允许成为创客"); map.put("999942","已成为创客或者正在审核中"); map.put("999943","失败"); + map.put("999944","生成密钥对异常,请稍后重试"); } } diff --git a/newadmin/lkl-service-api/src/main/java/com/chaozhanggui/system/lkl/service/MerchantLklService.java b/newadmin/lkl-service-api/src/main/java/com/chaozhanggui/system/lkl/service/MerchantLklService.java index 4e6bd78..01cc47c 100644 --- a/newadmin/lkl-service-api/src/main/java/com/chaozhanggui/system/lkl/service/MerchantLklService.java +++ b/newadmin/lkl-service-api/src/main/java/com/chaozhanggui/system/lkl/service/MerchantLklService.java @@ -381,8 +381,13 @@ public class MerchantLklService { return map; } + + + public static String getBase64() { + + String encodeBase64String = org.apache.commons.codec.binary.Base64.encodeBase64String((client_id + ":" + client_secret).getBytes()); return encodeBase64String;