Browse Source

20260117银行接口

milestone-20260113-现金管理0109
sunjiabei 1 month ago
parent
commit
afdbfcf15e
  1. 36
      src/main/java/com/example/demo/controller/cash/BankController.java
  2. 2
      src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java
  3. 2
      src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java
  4. 6
      src/main/java/com/example/demo/service/cash/BankService.java
  5. 265
      src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java
  6. 17
      src/main/resources/cashMapper/CashCollectionMapper.xml

36
src/main/java/com/example/demo/controller/cash/BankController.java

@ -81,6 +81,31 @@ public class BankController {
} }
//stripe银行接口(批量) //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银行接口(批量)") @Log("firstdata银行接口(批量)")
@PostMapping("/firstdataAuto") @PostMapping("/firstdataAuto")
public Result firstdataAuto(@RequestBody BankDTO bankDTO) { 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());
}
}
} }

2
src/main/java/com/example/demo/domain/DTO/FirstdataRequestDTO.java

@ -18,7 +18,7 @@ public class FirstdataRequestDTO {
String key; String key;
String secret; String secret;
long clientRequestId; long clientRequestId;
long time ;
long time;
String hmacBase64; String hmacBase64;
} }

2
src/main/java/com/example/demo/mapper/cash/CashCollectionMapper.java

@ -78,11 +78,13 @@ public interface CashCollectionMapper {
CashCollection selectByBankCode(String bankCode); CashCollection selectByBankCode(String bankCode);
void updateByGoldCoinOrderCodeByPayment(PaymentDTO paymentDTO); void updateByGoldCoinOrderCodeByPayment(PaymentDTO paymentDTO);
void updateByGoldCoinOrderCodeByStripe(StripeDTO stripeDTO); void updateByGoldCoinOrderCodeByStripe(StripeDTO stripeDTO);
void updateByGoldCoinOrderCodeByStripe2(StripeDTO stripeDTO);
void updateByGoldCoinOrderCodeByFirstdata(FirstdataDTO firstdataDTO); void updateByGoldCoinOrderCodeByFirstdata(FirstdataDTO firstdataDTO);
void updateByGoldCoinOrderCodeByIpay88(Ipay88DTO ipay88DTO); void updateByGoldCoinOrderCodeByIpay88(Ipay88DTO ipay88DTO);
List<String> selectFirstdataList(); List<String> selectFirstdataList();
List<CashCollection> selectIpayList(); List<CashCollection> selectIpayList();
List<String> selectStripeList(); List<String> selectStripeList();
List<String> selectStripe2List();
List<String> selectPaymentList(); List<String> selectPaymentList();
} }

6
src/main/java/com/example/demo/service/cash/BankService.java

@ -27,6 +27,12 @@ public interface BankService {
//stripe银行接口(单个) //stripe银行接口(单个)
Result getStripe(BankDTO bankDTO) throws StripeException; Result getStripe(BankDTO bankDTO) throws StripeException;
//stripe银行接口(批量)
Result stripe2Auto(BankDTO bankDTO);
//stripe银行接口(单个)
Result getStripe2(BankDTO bankDTO) throws StripeException;
//firstdata银行接口(批量) //firstdata银行接口(批量)
Result firstdataAuto(BankDTO bankDTO); Result firstdataAuto(BankDTO bankDTO);

265
src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java

@ -275,8 +275,8 @@ public class BankServiceImpl implements BankService {
@Override @Override
public Result stripeAuto(BankDTO bankDTO) { public Result stripeAuto(BankDTO bankDTO) {
try { 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) { if (bankDTO.getSum() <= 0) {
return Result.error("最大条数不能小于等于0"); return Result.error("最大条数不能小于等于0");
} }
@ -405,6 +405,260 @@ public class BankServiceImpl implements BankService {
public Result getStripe(BankDTO bankDTO) throws StripeException { public Result getStripe(BankDTO bankDTO) throws StripeException {
try { try {
// 设置Stripe API密钥 // 设置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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";
Stripe.apiKey = "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"; Stripe.apiKey = "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";
// 方式一通过订单号查找最近数据 // 方式一通过订单号查找最近数据
@ -516,7 +770,7 @@ public class BankServiceImpl implements BankService {
if (cashCollection == null) { if (cashCollection == null) {
return Result.error("金币系统当前日期 " + " 该订单号 " + orderNo + " 未查到"); return Result.error("金币系统当前日期 " + " 该订单号 " + orderNo + " 未查到");
} else { } else {
cashCollectionMapper.updateByGoldCoinOrderCodeByStripe(bankVO.getStripeDTO());
cashCollectionMapper.updateByGoldCoinOrderCodeByStripe2(bankVO.getStripeDTO());
} }
return Result.success(bankVO); return Result.success(bankVO);
} catch (Exception e) { } catch (Exception e) {
@ -723,7 +977,7 @@ public class BankServiceImpl implements BankService {
} }
// 银行自动处理接口(每天早上6点执行) // 银行自动处理接口(每天早上6点执行)
@Scheduled(cron = "0 54 15 * * ?")
// @Scheduled(cron = "0 54 15 * * ?")
@Override @Override
public Result bankAuto() { public Result bankAuto() {
try { try {
@ -767,7 +1021,9 @@ public class BankServiceImpl implements BankService {
Result paymentSixDayResult = paymentAuto(dto); Result paymentSixDayResult = paymentAuto(dto);
dto.setTime(sevenDayAgoStr); dto.setTime(sevenDayAgoStr);
Result paymentSevenDayResult = paymentAuto(dto); Result paymentSevenDayResult = paymentAuto(dto);
Result stripeResult = stripeAuto(dto); Result stripeResult = stripeAuto(dto);
Result stripe2Result = stripe2Auto(dto);
Result firstdataResult = firstdataAuto(dto); Result firstdataResult = firstdataAuto(dto);
Result ipayResult = ipayAuto(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 Six Day Auto Result: " + (paymentSixDayResult != null ? paymentSixDayResult.toString() : "null"));
messages.add("Payment Seven Day Auto Result: " + (paymentSevenDayResult != null ? paymentSevenDayResult.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("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("Firstdata Auto Result: " + (firstdataResult != null ? firstdataResult.toString() : "null"));
messages.add("Ipay Auto Result: " + (ipayResult != null ? ipayResult.toString() : "null")); messages.add("Ipay Auto Result: " + (ipayResult != null ? ipayResult.toString() : "null"));

17
src/main/resources/cashMapper/CashCollectionMapper.xml

@ -355,6 +355,9 @@
<select id="selectStripeList" resultType="java.lang.String"> <select id="selectStripeList" resultType="java.lang.String">
select order_code from cash_record_collection where payload='Stripe' and order_no_status=1 select order_code from cash_record_collection where payload='Stripe' and order_no_status=1
</select> </select>
<select id="selectStripe2List" resultType="java.lang.String">
select order_code from cash_record_collection where payload='Stripe2' and order_no_status=1
</select>
<select id="selectPaymentList" resultType="java.lang.String"> <select id="selectPaymentList" resultType="java.lang.String">
select order_code from cash_record_collection where payload='PaymentAsia' and order_no_status=1 select order_code from cash_record_collection where payload='PaymentAsia' and order_no_status=1
</select> </select>
@ -389,6 +392,20 @@
order_no_status=0 order_no_status=0
where order_code=#{orderNo} where order_code=#{orderNo}
</update> </update>
<!--根据OrderCode订单号更新收款订单-->
<update id="updateByGoldCoinOrderCodeByStripe2">
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>
<update id="updateByGoldCoinOrderCodeByFirstdata"> <update id="updateByGoldCoinOrderCodeByFirstdata">
update cash_record_collection update cash_record_collection
SET SET

Loading…
Cancel
Save