修改提现

This commit is contained in:
韩鹏辉
2023-08-24 09:57:39 +08:00
parent 96df607aa4
commit f35c8cb2bc
7 changed files with 483 additions and 23 deletions

View File

@@ -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<String, Object> map = new HashMap<String,Object>();
if(obj instanceof Map){
map=(Map<String, Object>) 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<String, Object> 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<String, Object> 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<String, Object> resultMap = new HashMap<String, Object>();
@SuppressWarnings("unchecked")
public static Map<String, Object> mapFn(Map<String, Object> 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<String, Object>) map.get(key));
}
} else {
resultMap.put(key, map.get(key));
}
}
}
return resultMap;
}
@SuppressWarnings("unchecked")
public static boolean check(Object obj,String privateKey){
Map<String,Object> map=new HashMap<String,Object>();
if(obj==null){
return false;
}
if(obj instanceof Map){
map=(Map<String, Object>) 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];
}
}

View File

@@ -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<String,String> 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");
}
}

View File

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

View File

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

View File

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

View File

@@ -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","生成密钥对异常,请稍后重试");
}
}

View File

@@ -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;