src/main/java/com/nq/common/interceptor/ApiUserAuthorityInterceptor.java
@@ -78,6 +78,9 @@ if ("/user/rechargeCallback.do".equals(url)) {//支付回调 return true; } if ("/user/noticePayment.do".equals(url)) {//代付回调 return true; } User currentUser = getCurrentUser(httpServletRequest); GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); String lang = httpServletRequest.getHeader("lang"); src/main/java/com/nq/controller/backend/AdminWithDrawController.java
@@ -4,6 +4,7 @@ import cn.afterturn.easypoi.excel.entity.ExportParams; import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.pojo.TradeResultVO; import com.nq.pojo.UserWithdraw; import com.nq.service.IUserWithdrawService; @@ -55,21 +56,30 @@ } } /** * * @param withId * @param state 1.审核通过(走代付) 2.审核(不走代付) 3.驳回 * @param authMsg * @return */ //修改资金管理 提现列表 提现状态 @RequestMapping({"updateState.do"}) @ResponseBody public ServerResponse updateState(@RequestParam(value = "withId", required = false) Integer withId, @RequestParam(value = "state", required = false) Integer state, @RequestParam(value = "authMsg", required = false) String authMsg) { @RequestParam(value = "authMsg", required = false) String authMsg, HttpServletRequest request, HttpServletResponse response) { ServerResponse serverResponse = null; try { serverResponse = this.iUserWithdrawService.updateState(withId, state, authMsg); serverResponse = this.iUserWithdrawService.updateState(withId, state, authMsg,request,response); } catch (Exception e) { log.error("admin修改充值订单状态出错 ,异常 = {}", e); } return serverResponse; } //删除资金记录 @RequestMapping({"deleteWithdraw.do"}) @ResponseBody public ServerResponse deleteWithdraw(Integer withdrawId) { src/main/java/com/nq/controller/protol/UserController.java
@@ -28,9 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @Controller @@ -70,6 +68,9 @@ @Autowired IApplyLeverServices iApplyLeverServices; @Autowired IUserWithdrawService iUserWithdrawService; private static final ThreadLocal<Boolean> orderCreated = ThreadLocal.withInitial(() -> false); private final Lock lock = new ReentrantLock(); @@ -421,6 +422,9 @@ if (payCreated.get()) { return ServerResponse.createByErrorMsg("当前充值人数过多,请稍后重试", request); } if(new BigDecimal(tradeAmoun).compareTo(new BigDecimal("1000")) < 0){ return ServerResponse.createByErrorMsg("请重新输入,最低充值金额:1000", request); } payCreated.set(true); return payService.thirdPartyRecharge(request,tradeAmoun); } catch (Exception e) { @@ -436,9 +440,16 @@ /** * 充值异步接收地址 */ @RequestMapping({"rechargeCallback.do"}) @ResponseBody public void rechargeCallback(HttpServletResponse response,RechargeCallbackVo rechargeCallbackVo) throws IOException { payService.rechargeCallback(response,rechargeCallbackVo); @PostMapping({"rechargeCallback.do"}) public void rechargeCallback(PaymentResponse vo, HttpServletResponse response) throws IOException { payService.rechargeCallback(vo,response); } /** * 代付回调通知 */ @PostMapping({"noticePayment.do"}) public void noticePayment(TradeResultVO vo,HttpServletResponse response) throws IOException { iUserWithdrawService.noticePayment(vo,response); } } src/main/java/com/nq/dao/TransferResponseMapper.java
New file @@ -0,0 +1,10 @@ package com.nq.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.nq.pojo.PaymentRecharge; import com.nq.pojo.TransferResponse; import org.apache.ibatis.annotations.Mapper; @Mapper public interface TransferResponseMapper extends BaseMapper<TransferResponse> { } src/main/java/com/nq/pojo/PaymentRecharge.java
@@ -23,7 +23,7 @@ private String orderNo; // 订单号 private String mchOrderNo; // 商家订单号 private BigDecimal amount; // 充值金额 private Integer status; // 1:已获取 2.已完成 private Integer status; // 1:已获取 2.已完成 3.失败 private Date paymentTime; // 支付时间 private Date createdAt; // 记录创建时间 private String notifyUrl; // 支付平台的回调通知URL src/main/java/com/nq/pojo/TradeResultVO.java
New file @@ -0,0 +1,43 @@ package com.nq.pojo; import lombok.Data; /** * @program: dabaogp * @description: 代付回调 * @create: 2025-03-14 10:02 **/ @Data public class TradeResultVO { // 订单状态: 1:代付成功;2:代付失败 private String tradeResult; // 商家转账单号: 代付使用的转账单号 private String merTransferId; // 商户代码: 平台分配唯一 private String merNo; // 平台订单号: 平台唯一 private String tradeNo; // 代付金额: 元为单位,保留两位小数 private String transferAmount; // 订单时间 private String applyDate; // 版本号: 默认1.0 private String version; // 回调状态: 默认SUCCESS private String respCode; // 签名: 不参与签名 private String sign; // 签名方式: MD5 不参与签名 private String signType; } src/main/java/com/nq/pojo/TransferResponse.java
New file @@ -0,0 +1,38 @@ package com.nq.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * @program: dabaogp * @description: 代付订单 * @create: 2025-03-12 18:04 **/ @Data @TableName(value ="transfer_response") public class TransferResponse { @TableId(value="id",type= IdType.AUTO) private Long id; // 主键,唯一标识 private String respCode; //响应状态,'SUCCESS' 或 'FAIL' private String errorMsg; //响应失败原因,响应成功时为 null private String signType; // 签名方式,响应成功时有值 private String sign; // 签名,响应成功时有值 private String merTransferId; // 商家转账单号 private BigDecimal transferAmount; // 转账金额 private String applyDate; // 订单时间 private String tradeNo; // 平台转账单号 private int tradeResult; // 是否转账成功状态 0已下单 1 成功 2 失败 private int callbackState; //回调状态 0 未处理, 1,成功 2.失败 private int userId; //用户id private int withId; //提现申请id private Date createdAt; // 记录创建时间 private Date updatedAt; // 记录更新时间 } src/main/java/com/nq/pojo/TransferResponseBo.java
New file @@ -0,0 +1,43 @@ package com.nq.pojo; import lombok.Data; /** * @program: dabaogp * @description: 代付下单返回 * @create: 2025-03-12 17:51 **/ @Data public class TransferResponseBo { // 响应状态,SUCCESS:响应成功, FAIL:响应失败 private String respCode; // 响应失败原因,响应成功时为 null private String errorMsg; // 签名方式,响应成功时有值,响应失败时为空 private String signType; // 签名,响应成功时有值,响应失败时为空 private String sign; // 商户代码 private String mchId; // 商家转账单号 private String merTransferId; // 转账金额 private String transferAmount; // 订单时间 private String applyDate; // 平台转账单号 private String tradeNo; // 是否转账成功状态,详见附录代付结果 private String tradeResult; } src/main/java/com/nq/pojo/UserWithdraw.java
@@ -37,7 +37,7 @@ @Excel(name = "银行支行") private String bankAddress; @Excel(name = "状态" ,replace = { "审核中_0", "成功_1", "失败_2", "取消_3" }) @Excel(name = "状态" ,replace = { "审核中_0", "成功_1", "失败_2", "取消_3","已提交_4" }) private Integer withStatus; @Excel(name = "手续费") private BigDecimal withFee; src/main/java/com/nq/service/IPayService.java
@@ -2,6 +2,7 @@ import com.nq.common.ServerResponse; import com.nq.pojo.PaymentResponse; import com.nq.pojo.RechargeCallbackVo; import javax.servlet.http.HttpServletRequest; @@ -28,5 +29,5 @@ ServerResponse withdrawNotify(HttpServletRequest paramHttpServletRequest,String key) throws IOException; void rechargeCallback(HttpServletResponse response, RechargeCallbackVo rechargeCallbackVo) throws IOException; void rechargeCallback(PaymentResponse vo, HttpServletResponse response) throws IOException; } src/main/java/com/nq/service/IUserWithdrawService.java
@@ -3,11 +3,14 @@ import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.pojo.TradeResultVO; import com.nq.pojo.UserWithdraw; import java.io.IOException; import java.math.BigDecimal; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface IUserWithdrawService { ServerResponse outMoney(String paramString,String with_Pwd, String assetsType,String bankId,HttpServletRequest paramHttpServletRequest) throws Exception; @@ -20,7 +23,8 @@ ServerResponse<PageInfo> listByAdmin(Integer paramInteger1, Integer paramInteger2, String paramString1, Integer paramInteger3, String paramString2, String paramString3, HttpServletRequest paramHttpServletRequest, int paramInt1, int paramInt2); ServerResponse updateState(Integer paramInteger1, Integer paramInteger2, String paramString) throws Exception; ServerResponse updateState(Integer paramInteger1, Integer paramInteger2, String paramString, HttpServletRequest request, HttpServletResponse response) throws Exception; int deleteByUserId(Integer paramInteger); @@ -31,4 +35,6 @@ ServerResponse deleteWithdraw(Integer withdrawId); List<UserWithdraw> exportByAdmin( Integer agentId, Integer userId, String realName, Integer state, String beginTime, String endTime, HttpServletRequest request); void noticePayment(TradeResultVO vo, HttpServletResponse response) throws IOException; } src/main/java/com/nq/service/TransferResponseService.java
New file @@ -0,0 +1,8 @@ package com.nq.service; import com.baomidou.mybatisplus.extension.service.IService; import com.nq.pojo.TransferResponse; import org.springframework.stereotype.Service; public interface TransferResponseService extends IService<TransferResponse> { } src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -90,12 +90,12 @@ String reqUrl = "https://api.watchglbpay.com/pay/web"; // User user = userService.getCurrentRefreshUser(request); // if(ObjectUtils.isNotEmpty(user)){ // GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); // String lang = request.getHeader("lang"); // return ServerResponse.createByErrorMsg(new Gson().toJson(ServerResponse.createByErrorCodeMsg(401,googleTranslateUtil.translate("请登录",lang )))); // } User user = userService.getCurrentRefreshUser(request); if(ObjectUtils.isEmpty(user)){ GoogleTranslateUtil googleTranslateUtil = new GoogleTranslateUtil(); String lang = request.getHeader("lang"); return ServerResponse.createByErrorMsg(new Gson().toJson(ServerResponse.createByErrorCodeMsg(401,googleTranslateUtil.translate("请登录",lang )))); } Map<String, String> params = new TreeMap<String, String>(); //版本号 需同步返回JSON 必填,固定值 1.0 params.put("version", "1.0"); @@ -107,7 +107,7 @@ //商家订单号 保证每笔订单唯一 params.put("mch_order_no", generatePayOrderId()); //异步通知地址 不超过 200 字节,支付成功后发起,不能携带参数 params.put("notify_url", "http://api.durocaspitall.com/user/rechargeCallback.do"); params.put("notify_url", "https://api.durocaspitall.com/user/rechargeCallback.do"); // 订单时间 时间格式yyyy-MM-dd HH:mm:ss params.put("order_date", getOrderTime()); //支付类型 请查阅商户后台通道编码 @@ -133,9 +133,6 @@ System.out.println("result值:" + result); if(StringUtils.isEmpty(result)){ return ServerResponse.createByErrorMsg("获取充值链接失败",request); } // 创建 ObjectMapper 实例 ObjectMapper objectMapper = new ObjectMapper(); @@ -146,7 +143,7 @@ return ServerResponse.createByErrorMsg("获取充值链接失败",request); } PaymentRecharge paymentRecharge = new PaymentRecharge(); paymentRecharge.setUserId(1); paymentRecharge.setUserId(user.getId()); paymentRecharge.setOrderNo(payResponse.getOrderNo()); paymentRecharge.setMchOrderNo(payResponse.getMchOrderNo()); paymentRecharge.setAmount(new BigDecimal(payResponse.getOriAmount())); @@ -156,7 +153,7 @@ paymentRecharge.setNotifyUrl(payResponse.getPayInfo()); paymentRecharge.setPayInfo(payResponse.toString()); paymentRechargeService.save(paymentRecharge); return ServerResponse.createBySuccessMsg(result); return ServerResponse.createBySuccess(payResponse.getPayInfo()); } public String generatePayOrderId() { @@ -642,35 +639,47 @@ } @Override public void rechargeCallback(HttpServletResponse response,RechargeCallbackVo rechargeCallbackVo) throws IOException { synchronized (rechargeCallbackVo.getOrderNo()){ public void rechargeCallback(PaymentResponse vo,HttpServletResponse response) throws IOException { log.info("充值回调进来了:"+vo.toString()); synchronized (vo.getOrderNo()){ PrintWriter pw = response.getWriter(); if(!rechargeCallbackVo.getTradeResult().equals("1")){ log.error("充值回调失败:"+rechargeCallbackVo.toString()); return; } PaymentRecharge paymentRecharge = paymentRechargeService.getOne(new LambdaQueryWrapper<>(PaymentRecharge.class) .eq(PaymentRecharge::getOrderNo, rechargeCallbackVo.getOrderNo()) .eq(PaymentRecharge::getMchOrderNo, rechargeCallbackVo.getMchOrderNo()) .eq(PaymentRecharge::getOrderNo, vo.getOrderNo()) .eq(PaymentRecharge::getMchOrderNo, vo.getMchOrderNo()) .eq(PaymentRecharge::getStatus,1) .last("limit 1") ); if(!vo.getTradeResult().equals("1")){ paymentRecharge.setStatus(2); paymentRecharge.setAmount(new BigDecimal(vo.getOriAmount())); paymentRecharge.setPayInfo(vo.toString()); paymentRechargeService.updateById(paymentRecharge); log.error("充值回调失败:"+vo.toString()); return; } if(ObjectUtils.isEmpty(paymentRecharge)){ pw.print("未找到充值订单"); log.info("未找到充值订单"); pw.print("error 未找到充值订单"); return; } UserAssets userAssets = userAssetsMapper.selectOne(new LambdaQueryWrapper<>(UserAssets.class) .eq(UserAssets::getUserId, paymentRecharge.getUserId()) .eq(UserAssets::getAccectType, "IN") ); ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), rechargeCallbackVo.getAmount().toString(), "2"); ServerResponse serverResponse = iUserAssetsServices.updateUserAssets(userAssets.getId(), vo.getOriAmount().toString(), "2"); if(serverResponse.getStatus() == 0){ paymentRecharge.setStatus(2); paymentRecharge.setAmount(new BigDecimal(rechargeCallbackVo.getAmount())); paymentRecharge.setPayInfo(rechargeCallbackVo.toString()); paymentRecharge.setAmount(new BigDecimal(vo.getOriAmount())); paymentRecharge.setPayInfo(vo.toString()); paymentRechargeService.updateById(paymentRecharge); } log.info("充值回调----完成"); pw.print("success"); pw.flush(); pw.close(); } } src/main/java/com/nq/service/impl/TransferResponseServiceImpl.java
New file @@ -0,0 +1,18 @@ package com.nq.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nq.dao.PaymentRechargeMapper; import com.nq.dao.TransferResponseMapper; import com.nq.pojo.PaymentRecharge; import com.nq.pojo.TransferResponse; import com.nq.service.TransferResponseService; import org.springframework.stereotype.Service; /** * @program: dabaogp * @description: * @create: 2025-03-12 18:30 **/ @Service public class TransferResponseServiceImpl extends ServiceImpl<TransferResponseMapper, TransferResponse> implements TransferResponseService { } src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -1,7 +1,9 @@ package com.nq.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.nq.dao.*; import com.nq.enums.EConfigKey; @@ -19,17 +21,24 @@ import com.nq.utils.http.HttpClientUtil; import com.nq.utils.stock.WithDrawUtils; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.nq.utils.timeutil.DateTimeUtil; import com.nq.utils.timeutil.TimeUtil; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -96,6 +105,9 @@ @Resource StockTimeSettingMapper stockTimeSettingMapper; @Autowired TransferResponseService transferResponseService; @Transactional public ServerResponse outMoney(String amt, String with_Pwd,String accsetType,String bankId,HttpServletRequest request) throws Exception { @@ -331,7 +343,8 @@ @Transactional public ServerResponse updateState(Integer withId, Integer state, String authMsg) throws Exception { public ServerResponse updateState(Integer withId, Integer state, String authMsg, HttpServletRequest request, HttpServletResponse response) throws Exception { UserWithdraw userWithdraw = this.userWithdrawMapper.selectByPrimaryKey(withId); SiteSetting siteSetting = siteSettingService.getSiteSetting(); if (userWithdraw == null) { @@ -375,19 +388,120 @@ throw new Exception("修改用户资金出错,抛出异常"); } userWithdraw.setWithMsg(authMsg); }else{ userWithdraw.setWithStatus(2); userWithdraw.setTransTime(new Date()); userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); return ServerResponse.createBySuccessMsg("操作成功!"); }else if(state == 2){//手动打款 userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); userAssetsMapper.updateById(userAssets); } userWithdraw.setWithStatus(1); userWithdraw.setTransTime(new Date()); int updateCount = this.userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("操作成功!"); } }else if(state == 1){//走代付 String result = payForAnOrder(request, response, userWithdraw); if(StringUtils.isEmpty(result)){ return ServerResponse.createByErrorMsg("代付打款失败!"); } ObjectMapper objectMapper = new ObjectMapper(); userWithdraw.setWithStatus(state); userWithdraw.setTransTime(new Date()); int updateCount = this.userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("操作成功!"); } return ServerResponse.createByErrorMsg("操作失败!"); // 将 JSON 字符串转换为实体类对象 TransferResponseBo transferResponseBo = objectMapper.readValue(result, TransferResponseBo.class); if(transferResponseBo.getRespCode().equals("FAIL")){ log.error("代付下单失败:"+result); return ServerResponse.createByErrorMsg("代付下单失败:",request); } TransferResponse transferResponse = new TransferResponse(); transferResponse.setRespCode(transferResponseBo.getRespCode()); transferResponse.setSignType(transferResponseBo.getSignType()); transferResponse.setSign(transferResponseBo.getSign()); transferResponse.setMerTransferId(transferResponseBo.getMerTransferId()); transferResponse.setTransferAmount(new BigDecimal(transferResponseBo.getTransferAmount())); transferResponse.setApplyDate(transferResponseBo.getApplyDate()); transferResponse.setTradeNo(transferResponseBo.getTradeNo()); transferResponse.setTradeResult(0); transferResponse.setCallbackState(0); transferResponse.setUserId(user.getId()); transferResponse.setCreatedAt(new Date()); transferResponse.setWithId(withId); transferResponseService.save(transferResponse); userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); userAssetsMapper.updateById(userAssets); userWithdraw.setWithStatus(4); userWithdraw.setTransTime(new Date()); int updateCount = this.userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("操作成功!"); } } return ServerResponse.createBySuccessMsg("操作失败!"); } public String payForAnOrder(HttpServletRequest request, HttpServletResponse response,UserWithdraw userWithdraw) throws IOException { request.setCharacterEncoding("UTF-8"); Map<String, String> reqMap = new HashMap<String, String>(); //申请时间 时间格式:yyyy-MM-dd HH:mm:ss reqMap.put("apply_date", getOrderTime()); //收款银行代码 详见附件银行编码或商户后台银行代码表 reqMap.put("bank_code", "IDPT0001"); //商户代码 平台分配唯一 reqMap.put("mch_id", "222887002"); // 商家转账订单号 保证每笔订单唯一 reqMap.put("mch_transferId", generatePayOrderId()); //收款银行账号 银行账号(巴西PIX代付填对应类型的PIX账号) reqMap.put("receive_account", userWithdraw.getBankNo()); //收款银行户名 reqMap.put("receive_name", userWithdraw.getBankName()); //转账金额 整数,以元为单位 reqMap.put("transfer_amount", userWithdraw.getWithAmt().toString()); //备注 reqMap.put("remark", userWithdraw.getBankAddress()); //异步通知地址 reqMap.put("back_url", "https://api.durocaspitall.com/user/noticePayment.do"); String signStr = SignUtil.sortData(reqMap); //签名方式 固定值MD5,不参与签名 reqMap.put("sign_type", "MD5"); String reqUrl = "https://api.watchglbpay.com/pay/transfer"; String merchant_key = "ZGZY3REWQJLAWRCRTHWQVGWYPMD878KQ"; String sign = SignAPI.sign(signStr, merchant_key); reqMap.put("sign", sign); System.out.println("reqMap:" + reqMap.toString().length() + " --> " + reqMap.toString()); System.out.println("签名参数排序:" + signStr.length() + " --> " + signStr); System.out.println("sign值:" + sign.length() + " --> " + sign); String result = HttpClientUtil.doPost(reqUrl, reqMap, "utf-8"); System.out.println("result值:" + result); return result; } public String generatePayOrderId() { // 获取当前时间戳(毫秒) long timestamp = System.currentTimeMillis(); // 生成一个随机的UUID并截取前8位 String randomUUID = UUID.randomUUID().toString().replace("-", "").substring(0, 8); // 将时间戳和随机UUID结合生成订单号 return timestamp + randomUUID; } public static String getOrderTime() { // 获取当前时间 LocalDateTime now = LocalDateTime.now(); // 定义输出格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 格式化当前时间 return now.format(formatter); } public int deleteByUserId(Integer userId) { @@ -422,5 +536,80 @@ } @Override public void noticePayment(TradeResultVO vo, HttpServletResponse response) throws IOException { log.info("代付回调信息:"+vo.toString()); synchronized (vo.getTradeNo()){ TransferResponse transferResponse = transferResponseService.getOne(new LambdaQueryWrapper<>(TransferResponse.class) .eq(TransferResponse::getMerTransferId, vo.getMerTransferId()) .eq(TransferResponse::getTradeNo, vo.getTradeNo()) .eq(TransferResponse::getTradeResult, 0) .eq(TransferResponse::getCallbackState, 0) ); if(ObjectUtils.isNotEmpty(transferResponse)){ UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", transferResponse.getUserId()); UserWithdraw userWithdraw = this.userWithdrawMapper.selectByPrimaryKey(transferResponse.getWithId()); if (transferResponse.getRespCode().equals("SUCCESS")) { transferResponse.setTradeResult(1); transferResponse.setCallbackState(1); transferResponseService.updateById(transferResponse); userWithdraw.setWithStatus(1); userWithdraw.setTransTime(new Date()); userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); log.info("代付回调----成功"); PrintWriter pw = response.getWriter(); pw.print("success"); pw.flush(); pw.close(); // 验签成功,响应SUCCESS return; } else { if (userAssets == null) { log.error("用户资金账户不存在!"); PrintWriter pw = response.getWriter(); pw.print("Signature Error"); pw.flush(); pw.close(); return; } if(userAssets.getAmountToBeCovered().compareTo(BigDecimal.ZERO) > 0){ BigDecimal subtract = userWithdraw.getWithAmt().subtract(userAssets.getAmountToBeCovered()); if(subtract.compareTo(BigDecimal.ZERO) > 0){ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(subtract)); userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(subtract)); userAssets.setAmountToBeCovered(BigDecimal.ZERO); }else{ userAssets.setAmountToBeCovered(userAssets.getAmountToBeCovered().subtract(userWithdraw.getWithAmt())); } }else{ userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(userWithdraw.getWithAmt())); userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); } int updateCount = userAssetsMapper.updateById(userAssets); if (updateCount > 0) { log.info("提现失败,返还用户资金成功!"); } else { log.error("返还用户资金出错,抛出异常"); } userWithdraw.setWithMsg("代付验证失败"); userWithdraw.setWithStatus(2); userWithdraw.setTransTime(new Date()); userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); transferResponse.setTradeResult(2); transferResponse.setCallbackState(2); transferResponseService.updateById(transferResponse); PrintWriter pw = response.getWriter(); pw.print("Signature Error"); pw.flush(); pw.close(); } } } } } src/main/java/com/nq/utils/SignAPI.java
@@ -32,23 +32,23 @@ } } public static String sign(String signSource, String key) { if (org.apache.commons.lang.StringUtils.isNotBlank(key)) { signSource = signSource + "&key=" + key; } return calculate(signSource); public static String sign(String signSource, String key) { if (org.apache.commons.lang.StringUtils.isNotBlank(key)) { signSource = signSource + "&key=" + key; } return calculate(signSource); } public static boolean validateSignByKey(String signSource, String key, String retsign) { if (org.apache.commons.lang.StringUtils.isNotBlank(key)) { signSource = signSource + "&key=" + key; } String signkey = calculate(signSource); System.out.println("signkey======" + signkey); if (signkey.equals(retsign)) { return true; } return false; public static boolean validateSignByKey(String signSource, String key, String retsign) { if (org.apache.commons.lang.StringUtils.isNotBlank(key)) { signSource = signSource + "&key=" + key; } String signkey = calculate(signSource); System.out.println("signkey======" + signkey); if (signkey.equals(retsign)) { return true; } return false; } }