Browse Source
Merge branch 'sunjiabei/feature-20251021102635-银行接口' into milestone-20251104-现金管理二期
huangqizheng/feature-20251104113536-现金管理二期退款修改
Merge branch 'sunjiabei/feature-20251021102635-银行接口' into milestone-20251104-现金管理二期
huangqizheng/feature-20251104113536-现金管理二期退款修改
16 changed files with 748 additions and 1 deletions
-
15pom.xml
-
28src/main/java/com/example/demo/DemoApplicationBank.java
-
28src/main/java/com/example/demo/bank/Server.java
-
46src/main/java/com/example/demo/config/AppConfig.java
-
44src/main/java/com/example/demo/controller/cash/BankController.java
-
118src/main/java/com/example/demo/controller/coin/RechargeActivityCenterController.java
-
21src/main/java/com/example/demo/domain/DTO/BankDTO.java
-
30src/main/java/com/example/demo/domain/DTO/PaymentDTO.java
-
19src/main/java/com/example/demo/domain/vo/cash/Bank.java
-
58src/main/java/com/example/demo/domain/vo/coin/RechargeActivity.java
-
33src/main/java/com/example/demo/mapper/coin/RechargeActivityCenterMapper.java
-
18src/main/java/com/example/demo/service/cash/BankService.java
-
30src/main/java/com/example/demo/service/coin/RechargeActivityCenterService.java
-
137src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java
-
50src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java
-
74src/main/resources/mapper/RechargeActivityCenterMapper.xml
@ -0,0 +1,28 @@ |
|||||
|
package com.example.demo; |
||||
|
|
||||
|
|
||||
|
|
||||
|
import org.mybatis.spring.annotation.MapperScan; |
||||
|
import org.springframework.boot.SpringApplication; |
||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication; |
||||
|
import org.springframework.scheduling.annotation.EnableScheduling; |
||||
|
|
||||
|
@EnableScheduling // 启用调度功能 |
||||
|
@SpringBootApplication |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.coin", sqlSessionTemplateRef = "mysql1SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.pay", sqlSessionTemplateRef = "mysql3SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.cms", sqlSessionTemplateRef = "mysql4SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.live", sqlSessionTemplateRef = "mysql5SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.sqlserver", sqlSessionTemplateRef = "sqlserver1SqlSessionTemplate") |
||||
|
@MapperScan(basePackages = "com.example.demo.mapper.cash", sqlSessionTemplateRef = "mysql1SqlSessionTemplate") |
||||
|
public class DemoApplicationBank { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
System.setProperty("https.protocols", "TLSv1,TLSv1.2,TLSv1.3"); |
||||
|
// 设置客户端协议版本 |
||||
|
System.setProperty("jdk.tls.client.protocols", "TLSv1,TLSv1.2,TLSv1.3"); |
||||
|
SpringApplication.run(DemoApplication.class, args); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
package com.example.demo.bank; |
||||
|
|
||||
|
import com.stripe.Stripe; |
||||
|
import com.stripe.exception.StripeException; |
||||
|
import com.stripe.model.*; |
||||
|
import com.stripe.param.*; |
||||
|
|
||||
|
public class Server { |
||||
|
public static void main(String[] args) throws StripeException { |
||||
|
// Stripe.apiKey = "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"; |
||||
|
|
||||
|
// BalanceTransactionListParams params = |
||||
|
// BalanceTransactionListParams.builder().setLimit(3L).build(); |
||||
|
// BalanceTransactionCollection balanceTransactions = BalanceTransaction.list(params); |
||||
|
// System.out.println(balanceTransactions); |
||||
|
// BalanceTransaction balanceTransaction = |
||||
|
// BalanceTransaction.retrieve("txn_3SNkDjJHMNYcqBc01q4yHgvq"); |
||||
|
// System.out.println(balanceTransaction); |
||||
|
// Charge resource = Charge.retrieve("ch_3MrVHGLkdIwHu7ix1mN3zEiP"); |
||||
|
// ChargeCaptureParams params = ChargeCaptureParams.builder().build(); |
||||
|
// Charge charge = resource.capture(params); |
||||
|
// System.out.println(charge); |
||||
|
// ChargeListParams params = ChargeListParams.builder().setLimit(1L).build(); |
||||
|
// ChargeCollection charges = Charge.list(params); |
||||
|
// System.out.println(charges); |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,44 @@ |
|||||
|
package com.example.demo.controller.cash; |
||||
|
|
||||
|
import com.example.demo.config.interfac.Log; |
||||
|
import com.example.demo.domain.DTO.BankDTO; |
||||
|
import com.example.demo.domain.vo.cash.Bank; |
||||
|
import com.example.demo.domain.vo.coin.AuditRequest; |
||||
|
import com.example.demo.domain.vo.coin.Result; |
||||
|
import com.example.demo.service.cash.BankService; |
||||
|
import com.example.demo.service.cash.CashAuditService; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName BankController |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 10:50 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@RestController |
||||
|
@RequestMapping("/admin/cash/bank") |
||||
|
@RequiredArgsConstructor |
||||
|
@Slf4j |
||||
|
@CrossOrigin |
||||
|
public class BankController { |
||||
|
|
||||
|
@Autowired |
||||
|
private BankService bankService; |
||||
|
|
||||
|
//payment银行接口 |
||||
|
@Log("payment银行接口") |
||||
|
@PostMapping("/payment") |
||||
|
public Result getPayment(@RequestBody Bank bank){ |
||||
|
try { |
||||
|
BankDTO bankDTO = bankService.getPayment(bank); |
||||
|
return Result.success(bankDTO); |
||||
|
}catch (Exception e){ |
||||
|
return Result.error(e.getMessage()); |
||||
|
}} |
||||
|
} |
||||
@ -0,0 +1,118 @@ |
|||||
|
package com.example.demo.controller.coin; |
||||
|
|
||||
|
import com.example.demo.config.interfac.Log; |
||||
|
import com.example.demo.domain.vo.coin.RechargeActivity; |
||||
|
import com.example.demo.domain.vo.coin.Result; |
||||
|
import com.example.demo.service.coin.RechargeActivityCenterService; |
||||
|
import lombok.RequiredArgsConstructor; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.web.bind.annotation.*; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName RechargeActivityCenterController |
||||
|
* @description: 充值活动中心管理 |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-28 14:23 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@RestController |
||||
|
@RequestMapping("/admin/coin/rechargeActivityCenter") |
||||
|
@RequiredArgsConstructor |
||||
|
@Slf4j |
||||
|
@CrossOrigin |
||||
|
public class RechargeActivityCenterController { |
||||
|
|
||||
|
@Autowired |
||||
|
private RechargeActivityCenterService rechargeActivityCenterService; |
||||
|
|
||||
|
|
||||
|
// 查询活动 |
||||
|
@Log("根据ID查询充值活动") |
||||
|
@PostMapping("/selectActivity") |
||||
|
public Result selectActivity(@RequestBody RechargeActivity activity) { |
||||
|
try { |
||||
|
RechargeActivity selectResult = rechargeActivityCenterService.selectActivityById(activity); |
||||
|
if (selectResult == null) { |
||||
|
return Result.error("查询失败:未找到该活动"); |
||||
|
} |
||||
|
return Result.success(selectResult); |
||||
|
} catch (NullPointerException e) { |
||||
|
log.error("查询活动失败:空指针异常,ID={}", activity.getId(), e); |
||||
|
return Result.error("查询失败:数据为空"); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
log.error("查询活动失败:参数异常,ID={}", activity.getId(), e); |
||||
|
return Result.error("查询失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 动 |
||||
|
@Log("新增充值活动") |
||||
|
@PostMapping("/addActivity") |
||||
|
public Result addActivity(@RequestBody RechargeActivity activity) { |
||||
|
try { |
||||
|
if (activity == null) { |
||||
|
return Result.error("添加失败:活动信息不能为空"); |
||||
|
} |
||||
|
if (activity.getActivityName() == null || activity.getActivityName().trim().isEmpty()) { |
||||
|
return Result.error("添加失败:活动名称不能为空"); |
||||
|
} |
||||
|
rechargeActivityCenterService.addActivity(activity); |
||||
|
return Result.success("添加活动成功"); |
||||
|
} catch (NullPointerException e) { |
||||
|
log.error("添加活动失败:空指针异常", e); |
||||
|
return Result.error("添加失败:数据为空"); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
log.error("添加活动失败:参数异常", e); |
||||
|
return Result.error("添加失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 更新活动 |
||||
|
@Log("更新充值活动") |
||||
|
@PostMapping("/updateActivity") |
||||
|
public Result updateActivity(@RequestBody RechargeActivity activity) { |
||||
|
try { |
||||
|
if (activity == null) { |
||||
|
return Result.error("更新失败:活动信息不能为空"); |
||||
|
} |
||||
|
if (activity.getId() == null) { |
||||
|
return Result.error("更新失败:活动ID不能为空"); |
||||
|
} |
||||
|
if (activity.getActivityName() == null || activity.getActivityName().trim().isEmpty()) { |
||||
|
return Result.error("更新失败:活动名称不能为空"); |
||||
|
} |
||||
|
rechargeActivityCenterService.updateActivity(activity); |
||||
|
return Result.success("更新活动成功"); |
||||
|
} catch (NullPointerException e) { |
||||
|
log.error("更新活动失败:空指针异常", e); |
||||
|
return Result.error("更新失败:数据为空"); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
log.error("更新活动失败:参数异常", e); |
||||
|
return Result.error("更新失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// 删除活动 |
||||
|
@Log("删除充值活动") |
||||
|
@PostMapping("/deleteActivity") |
||||
|
public Result deleteActivity(@RequestParam Integer id) { |
||||
|
try { |
||||
|
if (id == null) { |
||||
|
return Result.error("删除失败:活动ID不能为空"); |
||||
|
} |
||||
|
rechargeActivityCenterService.deleteActivity(id); |
||||
|
return Result.success("删除活动成功"); |
||||
|
} catch (NullPointerException e) { |
||||
|
log.error("删除活动失败:空指针异常,ID={}", id, e); |
||||
|
return Result.error("删除失败:数据为空"); |
||||
|
} catch (IllegalArgumentException e) { |
||||
|
log.error("删除活动失败:参数异常,ID={}", id, e); |
||||
|
return Result.error("删除失败:" + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
package com.example.demo.domain.DTO; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName BankDTO |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 11:16 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Data |
||||
|
@NoArgsConstructor |
||||
|
public class BankDTO { |
||||
|
private List<PaymentDTO> paymentDTOList; |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
package com.example.demo.domain.DTO; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName PaymentDTO |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 13:35 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
@Data |
||||
|
@NoArgsConstructor |
||||
|
public class PaymentDTO { |
||||
|
private String type; |
||||
|
private String provider; |
||||
|
private String request_reference; |
||||
|
private String merchant_reference; |
||||
|
private String provider_reference; |
||||
|
private String currency; |
||||
|
private String order_amount; |
||||
|
private String charge; |
||||
|
private String net_amount; |
||||
|
private String status; |
||||
|
private String created_time; |
||||
|
private String completed_time; |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
package com.example.demo.domain.vo.cash; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName BankDTO |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 11:11 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Data |
||||
|
@NoArgsConstructor |
||||
|
public class Bank { |
||||
|
private String time = ""; |
||||
|
} |
||||
@ -0,0 +1,58 @@ |
|||||
|
package com.example.demo.domain.vo.coin; |
||||
|
|
||||
|
import com.alibaba.excel.annotation.ExcelProperty; |
||||
|
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
|
import lombok.AllArgsConstructor; |
||||
|
import lombok.Data; |
||||
|
import lombok.NoArgsConstructor; |
||||
|
|
||||
|
import java.util.Date; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName RechargeActivity |
||||
|
* @description: 充值活动信息VO类 |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-28 15:00 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Data |
||||
|
@NoArgsConstructor |
||||
|
@AllArgsConstructor |
||||
|
public class RechargeActivity { |
||||
|
|
||||
|
@ExcelProperty("活动ID") |
||||
|
private Integer id; // 活动唯一标识 |
||||
|
|
||||
|
@ExcelProperty("活动名称") |
||||
|
private String activityName; // 活动名称 |
||||
|
|
||||
|
@ExcelProperty("业绩归属地") |
||||
|
private String businessBelong; // 业绩归属地 |
||||
|
|
||||
|
@ExcelProperty("活动开始时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
||||
|
private Date startTime; // 活动开始时间 |
||||
|
|
||||
|
@ExcelProperty("活动结束时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
||||
|
private Date endTime; // 活动结束时间 |
||||
|
|
||||
|
@ExcelProperty("活动状态") |
||||
|
private String status; // 活动状态(进行中、已结束、未开始) |
||||
|
|
||||
|
@ExcelProperty("添加人") |
||||
|
private String creator; // 添加人 |
||||
|
|
||||
|
@ExcelProperty("创建时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
||||
|
private Date createTime; // 创建时间 |
||||
|
|
||||
|
@ExcelProperty("更新时间") |
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
||||
|
private Date updateTime; // 更新时间 |
||||
|
|
||||
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
||||
|
private Date activityTime; // 活动时间 |
||||
|
} |
||||
@ -0,0 +1,33 @@ |
|||||
|
package com.example.demo.mapper.coin; |
||||
|
|
||||
|
import com.example.demo.domain.vo.coin.RechargeActivity; |
||||
|
import org.apache.ibatis.annotations.Mapper; |
||||
|
import org.apache.ibatis.annotations.Param; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName RechargeActivityCenterMapper |
||||
|
* @description: 充值活动中心Mapper接口 |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-28 14:42 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Mapper |
||||
|
public interface RechargeActivityCenterMapper { |
||||
|
|
||||
|
|
||||
|
// 根据ID查询活动 |
||||
|
RechargeActivity selectActivityById(RechargeActivity activity); |
||||
|
|
||||
|
// 新增活动 |
||||
|
void addActivity(RechargeActivity activity); |
||||
|
|
||||
|
// 更新活动 |
||||
|
void updateActivity(RechargeActivity activity); |
||||
|
|
||||
|
// 删除活动 |
||||
|
void deleteActivity(@Param("id") Integer id); |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
package com.example.demo.service.cash; |
||||
|
|
||||
|
|
||||
|
import com.example.demo.domain.DTO.BankDTO; |
||||
|
import com.example.demo.domain.vo.cash.Bank; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName BankService |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 11:17 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
public interface BankService { |
||||
|
BankDTO getPayment(Bank bank); |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
package com.example.demo.service.coin; |
||||
|
|
||||
|
import com.example.demo.domain.vo.coin.RechargeActivity; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName RechargeActivityCenterService |
||||
|
* @description: 充值活动中心服务接口 |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-28 14:40 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
public interface RechargeActivityCenterService { |
||||
|
|
||||
|
|
||||
|
// 根据ID查询活动 |
||||
|
RechargeActivity selectActivityById(RechargeActivity activity); |
||||
|
|
||||
|
// 新增活动 |
||||
|
void addActivity(RechargeActivity activity); |
||||
|
|
||||
|
// 更新活动 |
||||
|
void updateActivity(RechargeActivity activity); |
||||
|
|
||||
|
// 删除活动 |
||||
|
void deleteActivity(Integer id); |
||||
|
} |
||||
@ -0,0 +1,137 @@ |
|||||
|
package com.example.demo.serviceImpl.cash; |
||||
|
|
||||
|
import com.alibaba.fastjson.JSON; |
||||
|
import com.alibaba.fastjson.JSONArray; |
||||
|
import com.alibaba.fastjson.JSONObject; |
||||
|
import com.example.demo.domain.DTO.BankDTO; |
||||
|
import com.example.demo.domain.DTO.PaymentDTO; |
||||
|
import com.example.demo.domain.vo.cash.Bank; |
||||
|
import com.example.demo.service.cash.BankService; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.springframework.http.*; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.springframework.util.LinkedMultiValueMap; |
||||
|
import org.springframework.util.MultiValueMap; |
||||
|
import org.springframework.web.client.RestTemplate; |
||||
|
|
||||
|
import java.nio.charset.StandardCharsets; |
||||
|
import java.security.MessageDigest; |
||||
|
import java.security.NoSuchAlgorithmException; |
||||
|
import java.util.List; |
||||
|
import java.util.Map; |
||||
|
import java.util.TreeMap; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName BankServiceImpl |
||||
|
* @description: |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-27 11:18 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Service |
||||
|
@Slf4j |
||||
|
public class BankServiceImpl implements BankService { |
||||
|
// 第三方API地址 |
||||
|
private static final String API_URL = "https://gateway.pa-sys.com/v1.1/reconciliation/519e26b2-8145-418c-b3e7-c1e88e52b946/settlement"; |
||||
|
// 签名密钥 |
||||
|
private static final String SECRET = "8987d1b8-1d82-4b15-af06-828d0b12076f"; |
||||
|
|
||||
|
// 注入RestTemplate用于HTTP请求(需在Spring配置类中定义) |
||||
|
private final RestTemplate restTemplate; |
||||
|
|
||||
|
public BankServiceImpl(RestTemplate restTemplate) { |
||||
|
this.restTemplate = restTemplate; |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public BankDTO getPayment(Bank bank) { |
||||
|
try { |
||||
|
// 1. 准备参数 |
||||
|
String settlementDate = bank.getTime(); // 从Bank对象获取time作为settlement_date |
||||
|
String network = "FPS"; // 固定值 |
||||
|
|
||||
|
// 2. 生成签名 |
||||
|
Map<String, String> params = new TreeMap<>(); // 按key升序排序 |
||||
|
params.put("settlement_date", settlementDate); |
||||
|
params.put("network", network); |
||||
|
|
||||
|
String signSource = buildQueryString(params) + SECRET; |
||||
|
String sign = sha512(signSource); |
||||
|
|
||||
|
// 3. 构建form-data请求参数 |
||||
|
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); |
||||
|
formData.add("settlement_date", settlementDate); |
||||
|
formData.add("network", network); |
||||
|
formData.add("sign", sign); |
||||
|
|
||||
|
// 4. 发送HTTP POST请求(优化:显式设置multipart/form-data的字符集) |
||||
|
HttpHeaders headers = new HttpHeaders(); |
||||
|
// 补充charset=UTF-8,避免部分服务器对编码敏感 |
||||
|
headers.setContentType(new MediaType("multipart", "form-data", StandardCharsets.UTF_8)); |
||||
|
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers); |
||||
|
|
||||
|
// 调用第三方API(使用配置好SSL协议的RestTemplate) |
||||
|
ResponseEntity<String> response = restTemplate.exchange( |
||||
|
API_URL, |
||||
|
HttpMethod.POST, |
||||
|
requestEntity, |
||||
|
String.class |
||||
|
); |
||||
|
|
||||
|
if (response.getStatusCode().is2xxSuccessful()) { |
||||
|
String responseBody = response.getBody(); |
||||
|
log.info("第三方API响应: {}", responseBody); |
||||
|
|
||||
|
// 解析JSON获取payload.transactions数组 |
||||
|
JSONObject jsonObject = JSON.parseObject(responseBody); |
||||
|
JSONArray transactions = jsonObject.getJSONObject("payload").getJSONArray("transactions"); |
||||
|
|
||||
|
// 创建BankDTO并设置paymentDTOList |
||||
|
BankDTO bankDTO = new BankDTO(); |
||||
|
List<PaymentDTO> paymentDTOList = transactions.toJavaList(PaymentDTO.class); |
||||
|
bankDTO.setPaymentDTOList(paymentDTOList); |
||||
|
|
||||
|
return bankDTO; |
||||
|
} else { |
||||
|
throw new RuntimeException("API请求失败,状态码: " + response.getStatusCodeValue()); |
||||
|
} |
||||
|
|
||||
|
} catch (Exception e) { |
||||
|
log.error("payment银行接口处理失败", e); |
||||
|
throw new RuntimeException("处理失败: " + e.getMessage()); |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* http_build_query的查询字符串(key=value&key=value) |
||||
|
*/ |
||||
|
private String buildQueryString(Map<String, String> params) { |
||||
|
StringBuilder sb = new StringBuilder(); |
||||
|
for (Map.Entry<String, String> entry : params.entrySet()) { |
||||
|
if (sb.length() > 0) { |
||||
|
sb.append("&"); |
||||
|
} |
||||
|
sb.append(entry.getKey()).append("=").append(entry.getValue()); |
||||
|
} |
||||
|
return sb.toString(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* SHA512加密 |
||||
|
*/ |
||||
|
private String sha512(String content) throws NoSuchAlgorithmException { |
||||
|
MessageDigest md = MessageDigest.getInstance("SHA-512"); |
||||
|
byte[] bytes = md.digest(content.getBytes(StandardCharsets.UTF_8)); |
||||
|
// 转换为十六进制字符串 |
||||
|
StringBuilder hexStr = new StringBuilder(); |
||||
|
for (byte b : bytes) { |
||||
|
String hex = Integer.toHexString(0xff & b); |
||||
|
if (hex.length() == 1) { |
||||
|
hexStr.append('0'); |
||||
|
} |
||||
|
hexStr.append(hex); |
||||
|
} |
||||
|
return hexStr.toString(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,50 @@ |
|||||
|
package com.example.demo.serviceImpl.coin; |
||||
|
|
||||
|
import com.example.demo.domain.vo.coin.RechargeActivity; |
||||
|
import com.example.demo.mapper.coin.RechargeActivityCenterMapper; |
||||
|
import com.example.demo.service.coin.RechargeActivityCenterService; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @program: gold-java |
||||
|
* @ClassName RechargeActivityCenterServiceImpl |
||||
|
* @description: 充值活动中心服务实现类 |
||||
|
* @author: Double |
||||
|
* @create: 2025−10-28 14:40 |
||||
|
* @Version 1.0 |
||||
|
**/ |
||||
|
|
||||
|
@Service |
||||
|
public class RechargeActivityCenterServiceImpl implements RechargeActivityCenterService { |
||||
|
|
||||
|
@Autowired |
||||
|
private RechargeActivityCenterMapper rechargeActivityCenterMapper; |
||||
|
|
||||
|
|
||||
|
// 根据ID查询活动 |
||||
|
@Override |
||||
|
public RechargeActivity selectActivityById(RechargeActivity activity) { |
||||
|
return rechargeActivityCenterMapper.selectActivityById(activity); |
||||
|
} |
||||
|
|
||||
|
// 新增活动 |
||||
|
@Override |
||||
|
public void addActivity(RechargeActivity activity) { |
||||
|
rechargeActivityCenterMapper.addActivity(activity); |
||||
|
} |
||||
|
|
||||
|
// 更新活动 |
||||
|
@Override |
||||
|
public void updateActivity(RechargeActivity activity) { |
||||
|
rechargeActivityCenterMapper.updateActivity(activity); |
||||
|
} |
||||
|
|
||||
|
// 删除活动 |
||||
|
@Override |
||||
|
public void deleteActivity(Integer id) { |
||||
|
rechargeActivityCenterMapper.deleteActivity(id); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,74 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
<mapper namespace="com.example.demo.mapper.coin.RechargeActivityCenterMapper"> |
||||
|
|
||||
|
<!-- 查询活动 --> |
||||
|
<select id="selectActivityById" resultType="com.example.demo.domain.vo.coin.RechargeActivity"> |
||||
|
SELECT |
||||
|
id, |
||||
|
activity_name as activityName, |
||||
|
business_belong as businessBelong, |
||||
|
start_time as startTime, |
||||
|
end_time as endTime, |
||||
|
status, |
||||
|
creator, |
||||
|
create_time as createTime, |
||||
|
update_time as updateTime |
||||
|
FROM recharge_activity |
||||
|
<where> |
||||
|
<if test="activityName != null and activityName != ''"> |
||||
|
AND activity_name = #{activityName} |
||||
|
</if> |
||||
|
<if test="activityTime != null"> |
||||
|
AND end_time >= #{activityTime} |
||||
|
AND #{activityTime} >= start_time |
||||
|
</if> |
||||
|
</where> |
||||
|
<trim prefix="ORDER BY" suffixOverrides=","> |
||||
|
create_time DESC |
||||
|
</trim> |
||||
|
</select> |
||||
|
|
||||
|
<!-- 新增活动 --> |
||||
|
<insert id="addActivity" parameterType="com.example.demo.domain.vo.coin.RechargeActivity"> |
||||
|
INSERT INTO recharge_activity ( |
||||
|
activity_name, |
||||
|
business_belong, |
||||
|
start_time, |
||||
|
end_time, |
||||
|
status, |
||||
|
creator, |
||||
|
create_time |
||||
|
) VALUES ( |
||||
|
#{activityName}, |
||||
|
#{businessBelong}, |
||||
|
#{startTime}, |
||||
|
#{endTime}, |
||||
|
#{status}, |
||||
|
#{creator}, |
||||
|
NOW() |
||||
|
) |
||||
|
</insert> |
||||
|
|
||||
|
<!-- 更新活动 --> |
||||
|
<update id="updateActivity" parameterType="com.example.demo.domain.vo.coin.RechargeActivity"> |
||||
|
UPDATE recharge_activity |
||||
|
<set> |
||||
|
<if test="activityName != null">activity_name = #{activityName},</if> |
||||
|
<if test="businessBelong != null">business_belong = #{businessBelong},</if> |
||||
|
<if test="startTime != null">start_time = #{startTime},</if> |
||||
|
<if test="endTime != null">end_time = #{endTime},</if> |
||||
|
<if test="status != null">status = #{status},</if> |
||||
|
<if test="creator != null">creator = #{creator},</if> |
||||
|
update_time = NOW() |
||||
|
</set> |
||||
|
WHERE id = #{id} |
||||
|
</update> |
||||
|
|
||||
|
<!-- 删除活动 --> |
||||
|
<delete id="deleteActivity"> |
||||
|
DELETE FROM recharge_activity |
||||
|
WHERE id = #{id} |
||||
|
</delete> |
||||
|
|
||||
|
</mapper> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue