From 0ababc615d5b381f856ca84fb8dc715cdb2c4b5b Mon Sep 17 00:00:00 2001
From: peter <14100000001@qq.com>
Date: Thu, 15 Jan 2026 14:22:53 +0800
Subject: [PATCH] 2-10演示站搭建

---
 src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java |  435 +++++++++++++----------------------------------------
 1 files changed, 111 insertions(+), 324 deletions(-)

diff --git a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
index 20d95a2..032a7b7 100644
--- a/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
+++ b/src/main/java/com/nq/service/impl/UserWithdrawServiceImpl.java
@@ -25,6 +25,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 import javax.annotation.Resource;
@@ -395,10 +396,8 @@
                 }
             }else if(state == 1){//走代付
                 return getObjectServerResponseOne(withId, request, response, userWithdraw, user, userAssets);
-            }else if(state == 4){//代付 2
-                return getObjectServerResponseTwo(withId, request, response, userWithdraw, user, userAssets);
             }else{
-                return ServerResponse.createBySuccessMsg("请选择对应的操作!");
+                return ServerResponse.createByErrorMsg("请选择对应的操作!");
             }
         }catch (Exception e){
             log.info("提现失败:"+e.getMessage());
@@ -407,185 +406,7 @@
         return ServerResponse.createBySuccessMsg("操作失败!");
     }
 
-    private ServerResponse getObjectServerResponseTwo(Integer withId, HttpServletRequest request, HttpServletResponse response, UserWithdraw userWithdraw, User user, UserAssets userAssets) throws IOException {
-        String orderNumber = getOrderTime();
-        String result = payForAnOrderTwo(request, response,user, userWithdraw,orderNumber);
 
-        // 创建 ObjectMapper 实例
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        // 将 JSON 字符串转换为实体类对象
-        PayoutResponse payResponse = objectMapper.readValue(result, PayoutResponse.class);
-        if (payResponse.getCode() == 1) {
-            log.error("代付打款失败!失败原因:"+payResponse.getMessage());
-            return ServerResponse.createByErrorMsg("代付打款失败!失败原因:"+payResponse.getMessage());
-        }
-
-        TransferResponse transferResponse = new TransferResponse();
-        transferResponse.setRespCode(String.valueOf(payResponse.getCode()));
-        transferResponse.setSignType("代付2");
-        transferResponse.setSign("代付2");
-        transferResponse.setErrorMsg(String.valueOf(payResponse.getErrno()));
-        transferResponse.setMerTransferId(orderNumber);
-        transferResponse.setTransferAmount(userWithdraw.getWithAmt());
-        // 获取当前日期和时间
-        LocalDateTime currentDateTime = LocalDateTime.now();
-        // 定义日期时间格式
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        // 将当前时间格式化为字符串
-        String formattedDate = currentDateTime.format(formatter);
-        transferResponse.setApplyDate(formattedDate);
-        transferResponse.setTradeNo(payResponse.getData().getOrderNumber());
-        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("操作失败!");
-    }
-
-    private ServerResponse<Object> getObjectServerResponseOne(Integer withId, HttpServletRequest request, HttpServletResponse response, UserWithdraw userWithdraw, User user, UserAssets userAssets) throws IOException {
-        String result = payForAnOrder(request, response, userWithdraw);
-        if (StringUtils.isEmpty(result)) {
-            return ServerResponse.createByErrorMsg("代付打款失败!");
-        }
-        ObjectMapper objectMapper = new ObjectMapper();
-
-        // 将 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", "100789033");
-        // 商家转账订单号 保证每笔订单唯一
-        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 = "TKFMXNSNKDP0RUFEKV44SW411VUNDZLG";
-
-        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 payForAnOrderTwo(HttpServletRequest request, HttpServletResponse response, User user, UserWithdraw userWithdraw, String orderNumber) throws IOException {
-        request.setCharacterEncoding("UTF-8");
-        // 创建一个Map来存储请求参数
-        Map<String, String> reqMap = new HashMap<String, String>();
-
-        // 填充Map参数
-        reqMap.put("merchantid", "T805673557385213");             // 商户号
-        reqMap.put("out_trade_no",orderNumber );      // 商户订单号
-        // 转换为 BigDecimal
-        BigDecimal amount = new BigDecimal(String.valueOf(userWithdraw.getWithAmt()));
-
-        // 保留两位小数,四舍五入
-        amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
-        reqMap.put("total_fee", String.valueOf(amount));              // 交易金额(保留两位小数)
-        reqMap.put("notify_url", "https://www.example.com/notify"); // 异步通知地址
-        reqMap.put("timestamp", String.valueOf(System.currentTimeMillis())); // 时间戳
-        reqMap.put("payment_mode", "IMPS");             // 代付模式(IMPS)
-        reqMap.put("account_number", userWithdraw.getBankNo());     // 账号
-        reqMap.put("ifsc", userWithdraw.getBankName());                 // IFSC
-        reqMap.put("customer_name", StringUtils.isEmpty(UserNameUtil.formatCustomerName(user.getNickName())) ? "IsNotSet" : UserNameUtil.formatCustomerName(user.getNickName()));         // 客户姓名(必须是英文,去除空格)
-        reqMap.put("customer_mobile", user.getPhone());    // 客户手机号
-        reqMap.put("customer_email", "test@gmail.com");    // 客户手机号
-        // 生成签名
-        String sign = SignatureGeneratorUtil.generateSign(reqMap,"0cfc8e1a446a1e5214b4032f2d6007e2");
-        reqMap.put("sign", sign);
-        String reqUrl = "https://v2.fastechservicepro.com/payout/unifiedorder";
-        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) {
         return this.userWithdrawMapper.deleteByUserId(userId);
@@ -619,152 +440,118 @@
 
     }
 
-    @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") && (vo.getTradeResult().equals(1) || vo.getTradeResult().equals("1"))) {
-                    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("代付验证失败"+",回调信息【"+vo.toString()+"】");
-                    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();
-                }
+    /**
+     * 代付接口调用
+     */
+    private ServerResponse getObjectServerResponseOne(Integer withId, HttpServletRequest request, 
+                                                       HttpServletResponse response, UserWithdraw userWithdraw, 
+                                                       User user, UserAssets userAssets) throws Exception {
+        try {
+            // 配置参数(建议放到配置文件中)
+            String appId = "db270b73dc384c89ae7241d6465cee03"; // 从商户后台获取
+            String key = "PAXkm5ptBhvzNYBSpdm3p7ipwGUQOF8Fm3tYp0"; // 商户密钥
+            String payoutUrl = "https://www.copays.net/open-api/create-payout-order"; // 代付接口地址
+            
+            // 生成商户订单号
+            String merchantOrderId = generatePayoutOrderId(withId);
+            
+            // 处理金额,保留两位小数
+            BigDecimal amount = userWithdraw.getWithAmt();
+            amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
+            
+            // 构建请求参数
+            Map<String, String> params = new HashMap<>();
+            params.put("app_id", appId);
+            params.put("merchant_order_id", merchantOrderId);
+            params.put("amount", amount.toString());
+            params.put("payout_mode", "INDIA_IMPS"); // 代付模式,根据实际情况选择
+            params.put("customer_account_type", userWithdraw.getBankAddress()); // 账号类型
+            params.put("customer_account_no", userWithdraw.getBankNo()); // 收款人账号(银行卡号或UPI ID)
+            params.put("notify_url", "https://api.durocaspitall.com/user/payoutCallback.do"); // 异步通知地址
+            
+            // 生成签名
+            String sign = PaymentSignUtil.generateSign(params, key);
+            params.put("sign", sign);
+            
+            log.info("代付请求参数:{}", params);
+            log.info("生成的签名:{}", sign);
+            
+            // 发送请求
+            String result = HttpClientUtil.doPost(payoutUrl, params, "utf-8");
+            log.info("代付返回参数:{}", result);
+            
+            // 解析响应
+            ObjectMapper objectMapper = new ObjectMapper();
+            PayoutOrderResponseVo payoutResponse = objectMapper.readValue(result, PayoutOrderResponseVo.class);
+            
+            // 检查响应
+            if (!Integer.valueOf(200).equals(payoutResponse.getCode())) {
+                log.error("代付下单失败,返回码:{},消息:{},请求参数:{}",
+                        payoutResponse.getCode(), payoutResponse.getMessage(), params);
+                
+                // 代付失败,返还用户资金
+                userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(userWithdraw.getWithAmt()));
+                userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt()));
+                userAssetsMapper.updateById(userAssets);
+                
+                userWithdraw.setWithStatus(2); // 失败
+                userWithdraw.setWithMsg("fail:" + payoutResponse.getMessage());
+                userWithdraw.setTransTime(new Date());
+                userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
+                
+                return ServerResponse.createByErrorMsg("fail:" + payoutResponse.getMessage(),request);
             }
+            
+            // 保存代付记录
+            PayoutOrderResponseVo.PayoutOrderData responseData = payoutResponse.getData();
+            TransferResponse transferResponse = new TransferResponse();
+            transferResponse.setMerTransferId(merchantOrderId); // 商户订单号
+            transferResponse.setTradeNo(responseData.getSystemOrderId()); // 系统订单号
+            transferResponse.setTransferAmount(amount);
+            transferResponse.setTradeResult(0); // 0:已下单
+            transferResponse.setCallbackState(0); // 0:未处理
+            transferResponse.setRespCode("SUCCESS"); // 响应状态:下单成功
+            transferResponse.setSignType("MD5"); // 签名方式
+            transferResponse.setSign(responseData.getSign()); // 签名
+            transferResponse.setApplyDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); // 订单时间
+            transferResponse.setUserId(user.getId());
+            transferResponse.setWithId(withId);
+            transferResponse.setCreatedAt(new Date());
+            transferResponse.setUpdatedAt(new Date());
+            transferResponseService.save(transferResponse);
+            
+            // 更新提现记录状态为已提交(4)
+            userWithdraw.setWithStatus(4); // 已提交
+            userWithdraw.setTransTime(new Date());
+            userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
+            
+            log.info("代付下单成功,订单号:{}", merchantOrderId);
+            return ServerResponse.createBySuccessMsg("代付申请已提交,请等待处理");
+            
+        } catch (Exception e) {
+            log.error("代付下单异常:", e);
+            
+            // 异常时返还用户资金
+            userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(userWithdraw.getWithAmt()));
+            userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt()));
+            userAssetsMapper.updateById(userAssets);
+            
+            userWithdraw.setWithStatus(2); // 失败
+            userWithdraw.setWithMsg("代付下单异常:" + e.getMessage());
+            userWithdraw.setTransTime(new Date());
+            userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
+            
+            throw e;
         }
     }
-    @Override
-    public void noticePaymentTwo(PaymentCallbackTwo vo, HttpServletResponse response) throws IOException {
-        log.info("代付回调信息:"+vo.toString());
-        synchronized (vo.getOrder_number()){
-            TransferResponse transferResponse = transferResponseService.getOne(new LambdaQueryWrapper<>(TransferResponse.class)
-                    .eq(TransferResponse::getMerTransferId, vo.getOut_trade_no())
-                    .eq(TransferResponse::getTradeNo, vo.getOrder_number())
-                    .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(1) && vo.getStatus().equals("payout_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(vo.getStatus().equals("payout_fail")){
-                    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("代付2验证失败:"+vo.getFail_info()+",回调信息【"+vo.toString()+"】");
-                    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();
-                }
-            }
-        }
+    
+    /**
+     * 生成代付订单号
+     */
+    private String generatePayoutOrderId(Integer withId) {
+        // 使用提现ID + 时间戳生成唯一订单号
+        long timestamp = System.currentTimeMillis();
+        return "PAYOUT_" + withId + "_" + timestamp;
     }
 }
 

--
Gitblit v1.9.3