|
|
|
@ -275,8 +275,8 @@ public class BankServiceImpl implements BankService { |
|
|
|
@Override |
|
|
|
public Result stripeAuto(BankDTO bankDTO) { |
|
|
|
try { |
|
|
|
// Stripe.apiKey = "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"; |
|
|
|
Stripe.apiKey = "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"; |
|
|
|
Stripe.apiKey = "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"; |
|
|
|
// Stripe.apiKey = "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"; |
|
|
|
if (bankDTO.getSum() <= 0) { |
|
|
|
return Result.error("最大条数不能小于等于0"); |
|
|
|
} |
|
|
|
@ -405,6 +405,260 @@ public class BankServiceImpl implements BankService { |
|
|
|
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<Charge> 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<Charge> 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) { |
|
|
|
return Result.error("最大条数不能小于等于0"); |
|
|
|
} |
|
|
|
// 收集处理信息 |
|
|
|
List<String> messages = new ArrayList<>(); |
|
|
|
// 从Stripe获取最近的收费记录(最多200条) |
|
|
|
List<Charge> 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<Charge> 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<StripeDTO> stripeDTOList = new ArrayList<>(); |
|
|
|
|
|
|
|
// 处理每一条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()) { |
|
|
|
// 获取需要处理的订单号列表 |
|
|
|
List<String> orderNoList = cashCollectionMapper.selectStripe2List(); |
|
|
|
// 检查当前订单号是否在列表中 |
|
|
|
if (orderNoList.contains(stripeDTO.getOrderNo())) { |
|
|
|
cashCollectionMapper.updateByGoldCoinOrderCodeByStripe2(stripeDTO); |
|
|
|
} |
|
|
|
} |
|
|
|
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 getStripe2(BankDTO bankDTO) throws StripeException { |
|
|
|
try { |
|
|
|
// 设置Stripe API密钥 |
|
|
|
// Stripe.apiKey = "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"; |
|
|
|
Stripe.apiKey = "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"; |
|
|
|
// 方式一:通过订单号查找最近数据 |
|
|
|
@ -516,7 +770,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 +977,7 @@ public class BankServiceImpl implements BankService { |
|
|
|
} |
|
|
|
|
|
|
|
// 银行自动处理接口(每天早上6点执行) |
|
|
|
@Scheduled(cron = "0 54 15 * * ?") |
|
|
|
// @Scheduled(cron = "0 54 15 * * ?") |
|
|
|
@Override |
|
|
|
public Result bankAuto() { |
|
|
|
try { |
|
|
|
@ -767,7 +1021,9 @@ public class BankServiceImpl implements BankService { |
|
|
|
Result paymentSixDayResult = paymentAuto(dto); |
|
|
|
dto.setTime(sevenDayAgoStr); |
|
|
|
Result paymentSevenDayResult = paymentAuto(dto); |
|
|
|
|
|
|
|
Result stripeResult = stripeAuto(dto); |
|
|
|
Result stripe2Result = stripe2Auto(dto); |
|
|
|
Result firstdataResult = firstdataAuto(dto); |
|
|
|
Result ipayResult = ipayAuto(dto); |
|
|
|
|
|
|
|
@ -784,6 +1040,7 @@ 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("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")); |
|
|
|
|
|
|
|
|