diff --git a/src/main/java/com/example/demo/controller/cash/BankController.java b/src/main/java/com/example/demo/controller/cash/BankController.java index 32d4263..cb71533 100644 --- a/src/main/java/com/example/demo/controller/cash/BankController.java +++ b/src/main/java/com/example/demo/controller/cash/BankController.java @@ -81,6 +81,31 @@ public class BankController { } //stripe银行接口(批量) + @Log("stripe2银行接口(批量)") + @PostMapping("/stripe2Auto") + public Result stripe2Auto(@RequestBody BankDTO bankDTO) { + try { + return Result.success(bankService.stripe2Auto(bankDTO)); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + //stripe银行接口(单个) + @Log("stripe银行接口(单个)") + @PostMapping("/getStripe2") + public Result getStripe2(@RequestBody BankDTO bankDTO) { + try { + if (bankDTO.getOrderNo().isEmpty()) { + return Result.error("订单号为空"); + } + return bankService.getStripe2(bankDTO); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } + + //stripe银行接口(批量) @Log("firstdata银行接口(批量)") @PostMapping("/firstdataAuto") public Result firstdataAuto(@RequestBody BankDTO bankDTO) { @@ -115,4 +140,15 @@ public class BankController { } } + + //银行接口(批量) + @Log("银行接口(批量)") + @PostMapping("/bankAuto") + public Result bankAuto() { + try { + return Result.success(bankService.bankAuto()); + } catch (Exception e) { + return Result.error(e.getMessage()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java b/src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java index e3b6052..147d1bc 100644 --- a/src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java +++ b/src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java @@ -18,7 +18,7 @@ public class FirstdataRequestDTO { String key; String secret; long clientRequestId; - long time ; + long time; String hmacBase64; } diff --git a/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java b/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java index e298016..0577fa7 100644 --- a/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java +++ b/src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java @@ -78,11 +78,13 @@ public interface CashCollectionMapper { CashCollection selectByBankCode(String bankCode); void updateByGoldCoinOrderCodeByPayment(PaymentDTO paymentDTO); void updateByGoldCoinOrderCodeByStripe(StripeDTO stripeDTO); + void updateByGoldCoinOrderCodeByStripe2(StripeDTO stripeDTO); void updateByGoldCoinOrderCodeByFirstdata(FirstdataDTO firstdataDTO); void updateByGoldCoinOrderCodeByIpay88(Ipay88DTO ipay88DTO); List selectFirstdataList(); List selectIpayList(); List selectStripeList(); + List selectStripe2List(); List selectPaymentList(); } diff --git a/src/main/java/com/example/demo/service/cash/BankService.java b/src/main/java/com/example/demo/service/cash/BankService.java index ce9c7a2..47f537e 100644 --- a/src/main/java/com/example/demo/service/cash/BankService.java +++ b/src/main/java/com/example/demo/service/cash/BankService.java @@ -27,6 +27,12 @@ public interface BankService { //stripe银行接口(单个) Result getStripe(BankDTO bankDTO) throws StripeException; + //stripe银行接口(批量) + Result stripe2Auto(BankDTO bankDTO); + + //stripe银行接口(单个) + Result getStripe2(BankDTO bankDTO) throws StripeException; + //firstdata银行接口(批量) Result firstdataAuto(BankDTO bankDTO); diff --git a/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java index c56f282..326adf1 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java @@ -275,6 +275,263 @@ public class BankServiceImpl implements BankService { @Override public Result stripeAuto(BankDTO bankDTO) { try { + Stripe.apiKey = "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"; +// Stripe.apiKey = "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"; + if (bankDTO.getSum() <= 0) { + return Result.error("最大条数不能小于等于0"); + } + // 收集处理信息 + List messages = new ArrayList<>(); + // 从Stripe获取最近的收费记录(最多200条) + List allCharges = new ArrayList<>(); + String startingAfter = null; + int totalLimit = bankDTO.getSum(); // 目标获取条数 + int pageSize = 100; // 单次最大获取条数 + + do { + // 计算当前页需查询的条数(最后一页可能不足100条) + int currentPageSize = Math.min(pageSize, totalLimit - allCharges.size()); + if (currentPageSize <= 0) { + break; // 已获取足够条数,停止 + } + Long startTime = LocalDate.parse(bankDTO.getStartTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atStartOfDay(ZoneId.of("Asia/Shanghai")).toEpochSecond(); + Long endTime = LocalDate.parse(bankDTO.getEndTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atStartOfDay(ZoneId.of("Asia/Shanghai")).toEpochSecond(); + ChargeListParams.Created createdCondition = ChargeListParams.Created.builder() + .setGte(startTime) // 大于等于开始时间 + .setLt(endTime) // 小于结束时间 + .build(); + ChargeListParams params = ChargeListParams.builder() + .setLimit((long) currentPageSize) + .setStartingAfter(startingAfter) + .setCreated(createdCondition) // 加入时间筛选 + .build(); + + try { + // 执行分页查询 + ChargeCollection charges = Charge.list(params); + List currentPageData = charges.getData(); + allCharges.addAll(currentPageData); + + // 更新分页游标:若有下一页且未达200条,继续 + boolean hasMore = charges.getHasMore() && allCharges.size() < totalLimit; + startingAfter = hasMore ? currentPageData.get(currentPageData.size() - 1).getId() : null; + + } catch (StripeException e) { + log.error("Stripe 分页查询失败:" + e.getMessage()); + break; // 异常时停止查询,返回已获取的数据 + } + + } while (startingAfter != null); + + // 创建StripeDTO列表用于存储所有处理后的数据 + List stripeDTOList = new ArrayList<>(); + // 获取需要处理的订单号列表 + List orderNoList = cashCollectionMapper.selectStripeList(); + // 处理每一条Stripe数据 + for (Charge charge : allCharges) { + try { + // 获取charge对应的余额交易ID + String balanceTransactionId = charge.getBalanceTransaction(); + + // 通过余额交易ID获取详细信息 + BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(balanceTransactionId); + + // 创建StripeDTO对象并填充所需数据点 + StripeDTO stripeDTO = new StripeDTO(); + + // 从metadata中获取订单号 + if (charge.getMetadata() != null) { + stripeDTO.setOrderNo(charge.getMetadata().get("order_no")); + } + + // 设置余额交易ID + stripeDTO.setBalanceTransaction(charge.getBalanceTransaction()); + + // 设置付款币种和金额(来自charge) + stripeDTO.setCurrency(charge.getCurrency().toUpperCase()); + stripeDTO.setAmount(String.valueOf(balanceTransaction.getAmount())); + + // 设置收款币种(来自charge) + stripeDTO.setChargeCurrency(charge.getCurrency().toUpperCase()); + + // 设置到账金额和手续费(来自balanceTransaction) + stripeDTO.setNet(String.valueOf(balanceTransaction.getNet())); + stripeDTO.setFee(String.valueOf(balanceTransaction.getFee())); + + // 设置到账币种(来自balanceTransaction) + stripeDTO.setCurrency(balanceTransaction.getCurrency().toUpperCase()); + + // 设置available_on日期 + if (balanceTransaction.getAvailableOn() != null) { + long availableOnInSeconds = balanceTransaction.getAvailableOn(); + // 将Unix时间戳转换为Date对象 + Date availableOnDate = new Date(availableOnInSeconds * 1000L); + stripeDTO.setAvailableOn(availableOnDate); + } + + // 添加到列表中 + stripeDTOList.add(stripeDTO); + + // 如果订单号存在,且在selectStripeList返回的列表中,则更新数据库中的记录 + if (stripeDTO.getOrderNo() != null && !stripeDTO.getOrderNo().isEmpty()) { + + // 检查当前订单号是否在列表中 + if (orderNoList.contains(stripeDTO.getOrderNo())) { + cashCollectionMapper.updateByGoldCoinOrderCodeByStripe(stripeDTO); + messages.add("成功处理订单: " + stripeDTO.getOrderNo()); + } + else{ + messages.add("订单号不在数据库中: " + stripeDTO.getOrderNo()); + } + } + } catch (Exception e) { + log.error("处理Stripe数据失败,chargeId: " + charge.getId(), e); + // 继续处理其他数据,不中断整个流程 + } + } + + // 创建响应VO对象 + BankVO bankVO = new BankVO(); + bankVO.setStripeDTOList(stripeDTOList); + bankVO.setMessage(messages); + + return Result.success(bankVO); + } catch (Exception e) { + log.error("stripe银行接口处理失败", e); + throw new RuntimeException("处理失败: " + e.getMessage()); + } + } + + + //stripe银行接口(单个) + @Override + public Result getStripe(BankDTO bankDTO) throws StripeException { + try { + // 设置Stripe API密钥 + Stripe.apiKey = "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"; +// Stripe.apiKey = "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"; + // 方式一:通过订单号查找最近数据 + String orderNo = bankDTO.getOrderNo(); + + if (bankDTO.getSum() <= 0) { + return Result.error("最大条数不能小于等于0"); + } + + // 从Stripe获取最近的收费记录(最多200条) + List allCharges = new ArrayList<>(); + String startingAfter = null; + int totalLimit = bankDTO.getSum(); // 目标获取条数 + int pageSize = 100; // 单次最大获取条数 + + do { + // 计算当前页需查询的条数(最后一页可能不足100条) + int currentPageSize = Math.min(pageSize, totalLimit - allCharges.size()); + if (currentPageSize <= 0) { + break; // 已获取足够条数,停止 + } + Long startTime = LocalDate.parse(bankDTO.getStartTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atStartOfDay(ZoneId.of("Asia/Shanghai")).toEpochSecond(); + Long endTime = LocalDate.parse(bankDTO.getEndTime(), DateTimeFormatter.ofPattern("yyyyMMdd")).atStartOfDay(ZoneId.of("Asia/Shanghai")).toEpochSecond(); + ChargeListParams.Created createdCondition = ChargeListParams.Created.builder() + .setGte(startTime) // 大于等于开始时间 + .setLt(endTime) // 小于结束时间 + .build(); + ChargeListParams params = ChargeListParams.builder() + .setLimit((long) currentPageSize) + .setStartingAfter(startingAfter) + .setCreated(createdCondition) // 加入时间筛选 + .build(); + + try { + // 执行分页查询 + ChargeCollection charges = Charge.list(params); + List currentPageData = charges.getData(); + allCharges.addAll(currentPageData); + + // 更新分页游标:若有下一页且未达200条,继续 + boolean hasMore = charges.getHasMore() && allCharges.size() < totalLimit; + startingAfter = hasMore ? currentPageData.get(currentPageData.size() - 1).getId() : null; + + } catch (StripeException e) { + log.error("Stripe 分页查询失败:" + e.getMessage()); + break; // 异常时停止查询,返回已获取的数据 + } + + } while (startingAfter != null); + + // 在获取的所有记录中查找匹配订单号的记录 + Charge matchedCharge = null; + System.out.println(allCharges); + for (Charge charge : allCharges) { + // 从metadata中获取订单号进行匹配 + if (charge.getMetadata() != null) { + String chargeOrderNo = charge.getMetadata().get("order_no"); + if (chargeOrderNo != null && orderNo.equals(chargeOrderNo)) { + matchedCharge = charge; + break; + } + } + } + + // 如果未找到匹配的订单,返回错误信息 + if (matchedCharge == null) { + return Result.error("未找到订单号 " + orderNo + " 的支付记录"); + } + + // 获取匹配到的charge对应的余额交易ID + String balanceTransactionId = matchedCharge.getBalanceTransaction(); + + // 通过余额交易ID获取详细信息 + BalanceTransaction balanceTransaction = BalanceTransaction.retrieve(balanceTransactionId); + + // 创建StripeDTO对象并填充所需数据点 + StripeDTO stripeDTO = new StripeDTO(); + // 设置订单号 + stripeDTO.setOrderNo(matchedCharge.getMetadata().get("order_no")); + // 设置余额交易ID + stripeDTO.setBalanceTransaction(matchedCharge.getBalanceTransaction()); + + // 设置付款币种和金额(来自charge和来自balanceTransaction) + stripeDTO.setCurrency(matchedCharge.getCurrency().toUpperCase()); + stripeDTO.setAmount(String.valueOf(balanceTransaction.getAmount())); + + // 设置收款币种(来自charge) + stripeDTO.setChargeCurrency(matchedCharge.getCurrency().toUpperCase()); + + // 设置到账金额和手续费(来自balanceTransaction) + stripeDTO.setNet(String.valueOf(balanceTransaction.getNet())); + stripeDTO.setFee(String.valueOf(balanceTransaction.getFee())); + + // 设置到账币种(来自balanceTransaction) + stripeDTO.setCurrency(balanceTransaction.getCurrency().toUpperCase()); + + // 设置available_on日期 + if (balanceTransaction.getAvailableOn() != null) { + long availableOnInSeconds = balanceTransaction.getAvailableOn(); + // 将Unix时间戳转换为Date对象 + Date availableOnDate = new Date(availableOnInSeconds * 1000L); + stripeDTO.setAvailableOn(availableOnDate); + } + + // 创建响应VO对象 + BankVO bankVO = new BankVO(); + bankVO.setStripeDTO(stripeDTO); + CashCollection cashCollection = cashCollectionMapper.selectByGoldCoinOrderCode(orderNo); + if (cashCollection == null) { + return Result.error("金币系统当前日期 " + " 该订单号 " + orderNo + " 未查到"); + } else { + cashCollectionMapper.updateByGoldCoinOrderCodeByStripe(bankVO.getStripeDTO()); + } + return Result.success(bankVO); + } catch (Exception e) { + log.error("stripe银行接口处理失败", e); + throw new RuntimeException("处理失败: " + e.getMessage()); + } + } + + //stripe银行接口(批量) + @Override + public Result stripe2Auto(BankDTO bankDTO) { + try { // Stripe.apiKey = "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"; Stripe.apiKey = "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"; if (bankDTO.getSum() <= 0) { @@ -325,7 +582,7 @@ public class BankServiceImpl implements BankService { // 创建StripeDTO列表用于存储所有处理后的数据 List stripeDTOList = new ArrayList<>(); - + List orderNoList = cashCollectionMapper.selectStripe2List(); // 处理每一条Stripe数据 for (Charge charge : allCharges) { try { @@ -374,13 +631,16 @@ public class BankServiceImpl implements BankService { // 如果订单号存在,且在selectStripeList返回的列表中,则更新数据库中的记录 if (stripeDTO.getOrderNo() != null && !stripeDTO.getOrderNo().isEmpty()) { // 获取需要处理的订单号列表 - List orderNoList = cashCollectionMapper.selectStripeList(); + // 检查当前订单号是否在列表中 if (orderNoList.contains(stripeDTO.getOrderNo())) { - cashCollectionMapper.updateByGoldCoinOrderCodeByStripe(stripeDTO); + cashCollectionMapper.updateByGoldCoinOrderCodeByStripe2(stripeDTO); + messages.add("成功处理订单: " + stripeDTO.getOrderNo()); + } + else{ + messages.add("订单号不在数据库中: " + stripeDTO.getOrderNo()); } } - messages.add("成功处理订单: " + stripeDTO.getOrderNo()); } catch (Exception e) { log.error("处理Stripe数据失败,chargeId: " + charge.getId(), e); // 继续处理其他数据,不中断整个流程 @@ -402,7 +662,7 @@ public class BankServiceImpl implements BankService { //stripe银行接口(单个) @Override - public Result getStripe(BankDTO bankDTO) throws StripeException { + public Result getStripe2(BankDTO bankDTO) throws StripeException { try { // 设置Stripe API密钥 // Stripe.apiKey = "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"; @@ -516,7 +776,7 @@ public class BankServiceImpl implements BankService { if (cashCollection == null) { return Result.error("金币系统当前日期 " + " 该订单号 " + orderNo + " 未查到"); } else { - cashCollectionMapper.updateByGoldCoinOrderCodeByStripe(bankVO.getStripeDTO()); + cashCollectionMapper.updateByGoldCoinOrderCodeByStripe2(bankVO.getStripeDTO()); } return Result.success(bankVO); } catch (Exception e) { @@ -723,7 +983,7 @@ public class BankServiceImpl implements BankService { } // 银行自动处理接口(每天早上6点执行) - @Scheduled(cron = "0 54 15 * * ?") +// @Scheduled(cron = "0 54 15 * * ?") @Override public Result bankAuto() { try { @@ -767,8 +1027,10 @@ public class BankServiceImpl implements BankService { Result paymentSixDayResult = paymentAuto(dto); dto.setTime(sevenDayAgoStr); Result paymentSevenDayResult = paymentAuto(dto); + Result stripeResult = stripeAuto(dto); - Result firstdataResult = firstdataAuto(dto); + Result stripe2Result = stripe2Auto(dto); +// Result firstdataResult = firstdataAuto(dto); Result ipayResult = ipayAuto(dto); // 创建响应VO对象并收集处理结果 @@ -784,7 +1046,8 @@ public class BankServiceImpl implements BankService { messages.add("Payment Six Day Auto Result: " + (paymentSixDayResult != null ? paymentSixDayResult.toString() : "null")); messages.add("Payment Seven Day Auto Result: " + (paymentSevenDayResult != null ? paymentSevenDayResult.toString() : "null")); messages.add("Stripe Auto Result: " + (stripeResult != null ? stripeResult.toString() : "null")); - messages.add("Firstdata Auto Result: " + (firstdataResult != null ? firstdataResult.toString() : "null")); + messages.add("Stripe2 Auto Result: " + (stripe2Result != null ? stripe2Result.toString() : "null")); +// messages.add("Firstdata Auto Result: " + (firstdataResult != null ? firstdataResult.toString() : "null")); messages.add("Ipay Auto Result: " + (ipayResult != null ? ipayResult.toString() : "null")); bankVO.setMessage(messages); diff --git a/src/main/resources/cashMapper/CashCollectionMapper.xml b/src/main/resources/cashMapper/CashCollectionMapper.xml index 432f1de..f27df21 100644 --- a/src/main/resources/cashMapper/CashCollectionMapper.xml +++ b/src/main/resources/cashMapper/CashCollectionMapper.xml @@ -355,6 +355,9 @@ + @@ -389,6 +392,20 @@ order_no_status=0 where order_code=#{orderNo} + + + update cash_record_collection + SET + received_time=#{availableOn}, + payment_currency='2', + received_currency='2', + payment_amount=#{amount}, + received_amount=#{net}, + handling_charge=#{fee}, + status=4, + order_no_status=0 + where order_code=#{orderNo} + update cash_record_collection SET