| | |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | | import javax.annotation.Resource; |
| | |
| | | if (updateCount > 0) { |
| | | return ServerResponse.createBySuccessMsg("操作成功!"); |
| | | } |
| | | }else if(state == 1){//走代付 |
| | | return getObjectServerResponseOne(withId, request, response, userWithdraw, user, userAssets); |
| | | }else{ |
| | | return ServerResponse.createByErrorMsg("请选择对应的操作!"); |
| | | } |
| | |
| | | } |
| | | return ServerResponse.createBySuccessMsg("操作失败!"); |
| | | } |
| | | |
| | | |
| | | |
| | | public int deleteByUserId(Integer userId) { |
| | | return this.userWithdrawMapper.deleteByUserId(userId); |
| | |
| | | |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 代付接口调用 |
| | | */ |
| | | 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("代付下单失败:" + payoutResponse.getMessage()); |
| | | userWithdraw.setTransTime(new Date()); |
| | | userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); |
| | | |
| | | return ServerResponse.createByErrorMsg("代付下单失败:" + payoutResponse.getMessage()); |
| | | } |
| | | |
| | | // 保存代付记录 |
| | | 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; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 生成代付订单号 |
| | | */ |
| | | private String generatePayoutOrderId(Integer withId) { |
| | | // 使用提现ID + 时间戳生成唯一订单号 |
| | | long timestamp = System.currentTimeMillis(); |
| | | return "PAYOUT_" + withId + "_" + timestamp; |
| | | } |
| | | } |
| | | |