1
zj
yesterday 662ae3929a78bc6ab44d12519c6d3d3910c8b5c0
src/main/java/com/nq/service/impl/PayServiceImpl.java
@@ -149,7 +149,7 @@
        String orderId = generatePayOrderId();
        BigDecimal amount = new BigDecimal(tradeAmount).setScale(2, RoundingMode.HALF_UP);
        String notifyUrl = "https://api.greenbackcaps.top/user/rechargeCallbackFour.do";
        String notifyUrl = "https://api.nalandacapital.mom/user/rechargeCallbackFour.do";
        String custId = "U" + user.getId();
        String mobile = StringUtils.isNotBlank(user.getPhone()) ? user.getPhone() : "0000000000";
        if (mobile.length() > 16) {
@@ -273,7 +273,7 @@
        dataObj.put("customerEmail","123456@qq.com");//需替换
        dataObj.put("customerPhone",user.getPhone());//需替换
        dataObj.put("merchantOrderNo",generatePayOrderId());//自定义订单号
        dataObj.put("notifyUrl", "https://api.greenbackcaps.top/user/rechargeCallbackZero.do");//回调通知地址
        dataObj.put("notifyUrl", "https://api.nalandacapital.mom/user/rechargeCallbackZero.do");//回调通知地址
        JSONObject requestObj = new JSONObject();
        log.info("代收参数:{}", dataObj);
        // 加密数据
@@ -372,8 +372,8 @@
        params.put("merchant_order_id", merchantOrderId);
        params.put("amount", amount.toString());
        params.put("pay_channel", payChannel);
        params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallbackThree.do"); // 异步通知地址
        params.put("page_return_url", "https://stock.greenbackcaps.top/#/user"); // 前端返回地址
        params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallbackThree.do"); // 异步通知地址
        params.put("page_return_url", "https://stock.nalandacapital.mom/#/user"); // 前端返回地址
        // 可选参数
        if (user != null) {
@@ -466,7 +466,7 @@
        // 保留两位小数,四舍五入
        amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
        params.put("total_fee", String.valueOf(amount));         // 交易金额(保留两位小数)
        params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallbackTwo.do"); // 异步通知地址
        params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallbackTwo.do"); // 异步通知地址
        params.put("reply_type", "URL");          // 执行方式
        params.put("timestamp", String.valueOf(System.currentTimeMillis()));     // 时间戳
        params.put("customer_name", StringUtils.isEmpty(UserNameUtil.formatCustomerName(user.getNickName())) ? "IsNotSet" : UserNameUtil.formatCustomerName(user.getNickName()));    // 客户姓名
@@ -528,7 +528,7 @@
        //商家订单号 保证每笔订单唯一
        params.put("mch_order_no", generatePayOrderId());
        //异步通知地址 不超过 200 字节,支付成功后发起,不能携带参数
        params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallback.do");
        params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallback.do");
        // 订单时间  时间格式yyyy-MM-dd HH:mm:ss
        params.put("order_date", getOrderTime());
        //支付类型 请查阅商户后台通道编码
@@ -1580,140 +1580,123 @@
     * 代付回调处理
     */
    @Override
    public void payoutCallback(PayoutCallbackVo vo, HttpServletResponse response) throws IOException {
        log.info("代付回调进来了:" + vo.toString());
    public void payoutCallback(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.setStatus(200);
        response.setContentType("text/plain;charset=UTF-8");
        PrintWriter pw = response.getWriter();
        
        try {
            // 验证签名
            String key = "PAXkm5ptBhvzNYBSpdm3p7ipwGUQOF8Fm3tYp0"; // 商户密钥
            Map<String, String> signParams = new HashMap<>();
            signParams.put("merchant_id", vo.getMerchantId());
            signParams.put("app_id", vo.getAppId());
            signParams.put("system_order_id", vo.getSystemOrderId());
            signParams.put("merchant_order_id", vo.getMerchantOrderId());
            signParams.put("amount", vo.getAmount());
            signParams.put("order_status", vo.getOrderStatus());
            signParams.put("msg", vo.getMsg());
        String tradeResult = request.getParameter("tradeResult");
        String merTransferId = request.getParameter("merTransferId");
        String merNo = request.getParameter("merNo");
        String tradeNo = request.getParameter("tradeNo");
        String transferAmount = request.getParameter("transferAmount");
        String applyDate = request.getParameter("applyDate");
        String version = request.getParameter("version");
        String respCode = request.getParameter("respCode");
        String sign = request.getParameter("sign");
        String signType = request.getParameter("signType");
        log.info("watchglb代付回调: tradeResult={}, merTransferId={}, merNo={}, tradeNo={}, transferAmount={}, applyDate={}, version={}, respCode={}, signType={}",
                tradeResult, merTransferId, merNo, tradeNo, transferAmount, applyDate, version, respCode, signType);
            
            boolean signValid = PaymentSignUtil.verifySign(signParams, key, vo.getSign());
            if (!signValid) {
                log.error("代付回调签名验证失败");
                pw.print("error 签名验证失败");
        if (StringUtils.isBlank(merTransferId) || StringUtils.isBlank(tradeResult)) {
            pw.print("FAIL");
                pw.flush();
                pw.close();
                return;
            }
            
            // 根据商户订单号查找代付记录
        String key = "CZ5Q6NNI6D9YTCXZAIWIC8SAQCC35UZR";
        Map<String, String> signParams = new TreeMap<>();
        if (StringUtils.isNotBlank(tradeResult)) signParams.put("tradeResult", tradeResult);
        if (StringUtils.isNotBlank(merTransferId)) signParams.put("merTransferId", merTransferId);
        if (StringUtils.isNotBlank(merNo)) signParams.put("merNo", merNo);
        if (StringUtils.isNotBlank(tradeNo)) signParams.put("tradeNo", tradeNo);
        if (StringUtils.isNotBlank(transferAmount)) signParams.put("transferAmount", transferAmount);
        if (StringUtils.isNotBlank(applyDate)) signParams.put("applyDate", applyDate);
        if (StringUtils.isNotBlank(version)) signParams.put("version", version);
        if (StringUtils.isNotBlank(respCode)) signParams.put("respCode", respCode);
        if (!PaymentSignUtil.verifySign(signParams, key, sign)) {
            log.error("watchglb代付回调验签失败, merTransferId={}, signParams={}", merTransferId, signParams);
            pw.print("FAIL");
            pw.flush();
            pw.close();
            return;
        }
        synchronized (merTransferId) {
            TransferResponse transferResponse = transferResponseService.getOne(
                    new LambdaQueryWrapper<>(TransferResponse.class)
                            .eq(TransferResponse::getMerTransferId, vo.getMerchantOrderId())
                            .eq(TransferResponse::getMerTransferId, merTransferId)
            );
            if (ObjectUtils.isEmpty(transferResponse)) {
                log.info("未找到代付订单记录,商户订单号:{}", vo.getMerchantOrderId());
                pw.print("error 未找到代付订单");
                log.error("未找到代付记录,merTransferId={}", merTransferId);
                pw.print("FAIL");
                pw.flush();
                pw.close();
                return;
            }
            // 检查是否已处理过
            if (transferResponse.getCallbackState() != 0) {
                log.info("代付回调已处理过,商户订单号:{}", vo.getMerchantOrderId());
                pw.print("success");
                pw.flush();
                pw.close();
                return;
            }
            
            // 查找提现记录
            UserWithdraw userWithdraw = userWithdrawMapper.selectByPrimaryKey(transferResponse.getWithId());
            if (ObjectUtils.isEmpty(userWithdraw)) {
                log.info("未找到提现记录,withId:{}", transferResponse.getWithId());
                pw.print("error 未找到提现记录");
                log.error("未找到提现记录,withId={}", transferResponse.getWithId());
                pw.print("FAIL");
                pw.flush();
                pw.close();
                return;
            }
            
            // 根据订单状态处理
            String orderStatus = vo.getOrderStatus();
            if ("WAIT_CONFIRM".equals(orderStatus) || "WAIT_PAY".equals(orderStatus) || "PAY_ING".equals(orderStatus)) {
                log.info("代付回调交易中,商户订单号:{},状态:{}", vo.getMerchantOrderId(), orderStatus);
                pw.print("success");
                pw.flush();
                pw.close();
                return;
            } else if ("PAY_FAIL".equals(orderStatus)) {
                // 代付失败
                transferResponse.setTradeResult(2); // 失败
                transferResponse.setCallbackState(2); // 失败
                transferResponse.setRespCode("FAIL"); // 响应状态:失败
                transferResponse.setErrorMsg(vo.getMsg()); // 失败原因
                transferResponse.setSignType("MD5"); // 签名方式
                transferResponse.setSign(vo.getSign()); // 签名
            transferResponse.setTradeNo(StringUtils.defaultIfBlank(tradeNo, transferResponse.getTradeNo()));
            transferResponse.setSignType(StringUtils.defaultIfBlank(signType, "MD5"));
            transferResponse.setSign(sign);
            transferResponse.setRespCode(StringUtils.defaultIfBlank(respCode, "SUCCESS"));
            transferResponse.setApplyDate(StringUtils.defaultIfBlank(applyDate, transferResponse.getApplyDate()));
                transferResponse.setUpdatedAt(new Date());
            if ("1".equals(tradeResult)) {
                transferResponse.setTradeResult(1);
                transferResponse.setCallbackState(1);
                transferResponseService.updateById(transferResponse);
                
                userWithdraw.setWithStatus(2); // 失败
                userWithdraw.setWithMsg("Withdrawal failed:" + vo.getMsg());
                userWithdraw.setWithStatus(1);
                userWithdraw.setWithMsg("代付成功");
                userWithdraw.setTransTime(new Date());
                userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
                
                // 返还用户资金
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId());
                if (userAssets != null) {
                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt()));
                    userAssetsMapper.updateById(userAssets);
                }
                pw.print("success");
            } else if ("2".equals(tradeResult)) {
                transferResponse.setTradeResult(2);
                transferResponse.setCallbackState(2);
                transferResponse.setErrorMsg("watchglb payout failed");
                transferResponseService.updateById(transferResponse);
                userWithdraw.setWithStatus(2);
                userWithdraw.setWithMsg("Withdrawal failed:watchglb payout failed");
                userWithdraw.setTransTime(new Date());
                userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId());
                if (userAssets != null) {
                    userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(userWithdraw.getWithAmt()));
                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt()));
                    userAssetsMapper.updateById(userAssets);
                }
                log.info("代付回调失败,商户订单号:{}", vo.getMerchantOrderId());
                pw.print("success");
                pw.flush();
                pw.close();
                return;
            } else if ("PAY_SUCCESS".equals(orderStatus)) {
                // 代付成功
                transferResponse.setTradeResult(1); // 成功
                transferResponse.setCallbackState(1); // 成功
                transferResponse.setRespCode("SUCCESS"); // 响应状态:成功
                transferResponse.setSignType("MD5"); // 签名方式
                transferResponse.setSign(vo.getSign()); // 签名
                transferResponse.setUpdatedAt(new Date());
                transferResponseService.updateById(transferResponse);
                userWithdraw.setWithStatus(1); // 成功
                userWithdraw.setWithMsg("代付成功");
                userWithdraw.setTransTime(new Date());
                userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw);
                // 扣除冻结资金
                UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId());
                if (userAssets != null) {
                    userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt()));
                    userAssetsMapper.updateById(userAssets);
                }
                log.info("代付回调成功,商户订单号:{}", vo.getMerchantOrderId());
                pw.print("success");
                pw.flush();
                pw.close();
                return;
            } else {
                log.error("代付回调未知状态,商户订单号:{},状态:{}", vo.getMerchantOrderId(), orderStatus);
                pw.print("error 未知状态");
                pw.flush();
                pw.close();
                return;
                log.warn("watchglb回调状态未知, merTransferId={}, tradeResult={}", merTransferId, tradeResult);
                pw.print("success");
            }
        } catch (Exception e) {
            log.error("代付回调处理异常:", e);
            pw.print("error 处理异常");
            pw.flush();
            pw.close();
        }