From b671f447f445f8da07b96a124597dcbec6f16c4c Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Mon, 27 Oct 2025 13:58:54 +0800 Subject: [PATCH 1/4] =?UTF-8?q?10=E6=9C=8827=E6=97=A5=E9=93=B6=E8=A1=8C?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 15 +++ .../java/com/example/demo/DemoApplicationBank.java | 28 +++++ src/main/java/com/example/demo/bank/Server.java | 23 ++++ .../java/com/example/demo/config/AppConfig.java | 46 ++++++- .../demo/controller/cash/BankController.java | 44 +++++++ .../java/com/example/demo/domain/DTO/BankDTO.java | 21 ++++ .../com/example/demo/domain/DTO/PaymentDTO.java | 30 +++++ .../java/com/example/demo/domain/vo/cash/Bank.java | 19 +++ .../com/example/demo/service/cash/BankService.java | 18 +++ .../demo/serviceImpl/cash/BankServiceImpl.java | 137 +++++++++++++++++++++ 10 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/demo/DemoApplicationBank.java create mode 100644 src/main/java/com/example/demo/bank/Server.java create mode 100644 src/main/java/com/example/demo/controller/cash/BankController.java create mode 100644 src/main/java/com/example/demo/domain/DTO/BankDTO.java create mode 100644 src/main/java/com/example/demo/domain/DTO/PaymentDTO.java create mode 100644 src/main/java/com/example/demo/domain/vo/cash/Bank.java create mode 100644 src/main/java/com/example/demo/service/cash/BankService.java create mode 100644 src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java diff --git a/pom.xml b/pom.xml index 1eef049..a329465 100644 --- a/pom.xml +++ b/pom.xml @@ -166,6 +166,21 @@ jaxb-api 2.3.1 + + com.stripe + stripe-java + 30.0.0 + + + org.apache.httpcomponents.client5 + httpclient5 + 5.3.1 + + + com.alibaba + fastjson + 1.2.83 + diff --git a/src/main/java/com/example/demo/DemoApplicationBank.java b/src/main/java/com/example/demo/DemoApplicationBank.java new file mode 100644 index 0000000..7de0065 --- /dev/null +++ b/src/main/java/com/example/demo/DemoApplicationBank.java @@ -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); + } + +} diff --git a/src/main/java/com/example/demo/bank/Server.java b/src/main/java/com/example/demo/bank/Server.java new file mode 100644 index 0000000..257e03c --- /dev/null +++ b/src/main/java/com/example/demo/bank/Server.java @@ -0,0 +1,23 @@ +package com.example.demo.bank; + +import com.stripe.Stripe; +import com.stripe.exception.StripeException; +import com.stripe.model.*; +import com.stripe.param.BalanceTransactionListParams; +import com.stripe.param.PaymentIntentSearchParams; +import com.stripe.param.ProductCreateParams; +import com.stripe.param.PriceCreateParams; + +public class Server { + public static void main(String[] args) throws StripeException { + Stripe.apiKey = "sk_test_51SKwgEQqF1eV5j2cyHz7uZ28OsPHzt9nXv1DCOmr4buFHpGhhgmskCz2XOxtCbbQMZIEkELTWIlMgZWcK6PeflZj00nRijQkLx"; + + BalanceTransactionListParams params = + BalanceTransactionListParams.builder().setLimit(3L).build(); + BalanceTransactionCollection balanceTransactions = BalanceTransaction.list(params); + System.out.println(balanceTransactions); + BalanceTransaction balanceTransaction = + BalanceTransaction.retrieve("txn_3SKxVWQqF1eV5j2c07IJegQv"); + System.out.println(balanceTransaction); + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/config/AppConfig.java b/src/main/java/com/example/demo/config/AppConfig.java index a50aa5b..3c2f690 100644 --- a/src/main/java/com/example/demo/config/AppConfig.java +++ b/src/main/java/com/example/demo/config/AppConfig.java @@ -2,16 +2,60 @@ package com.example.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; +import javax.net.ssl.*; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + @Configuration public class AppConfig { @Bean - public RestTemplate restTemplate() { + public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyManagementException { RestTemplate restTemplate = new RestTemplate(); + + // 配置SSL支持 + restTemplate.setRequestFactory(createSSLRequestFactory()); + restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); return restTemplate; } + + /** + * 创建支持SSL的HTTP请求工厂 + */ + private ClientHttpRequestFactory createSSLRequestFactory() throws NoSuchAlgorithmException, KeyManagementException { + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + public void checkClientTrusted(X509Certificate[] certs, String authType) { + } + public void checkServerTrusted(X509Certificate[] certs, String authType) { + } + } + }; + + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + + // 创建主机名验证器,信任所有主机 + HostnameVerifier allHostsValid = (hostname, session) -> true; + HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); + + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(30000); // 30秒连接超时 + factory.setReadTimeout(60000); // 60秒读取超时 + + return factory; + } } + diff --git a/src/main/java/com/example/demo/controller/cash/BankController.java b/src/main/java/com/example/demo/controller/cash/BankController.java new file mode 100644 index 0000000..1535bcf --- /dev/null +++ b/src/main/java/com/example/demo/controller/cash/BankController.java @@ -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/bank") +@RequiredArgsConstructor +@Slf4j +@CrossOrigin +public class BankController { + + @Autowired + private BankService bankService; + + //payment银行接口 + @Log("payment银行接口") + @PostMapping("/payment") + public Result payment(@RequestBody Bank bank){ + try { + BankDTO bankDTO = bankService.payment(bank); + return Result.success(bankDTO); + }catch (Exception e){ + return Result.error(e.getMessage()); + }} +} diff --git a/src/main/java/com/example/demo/domain/DTO/BankDTO.java b/src/main/java/com/example/demo/domain/DTO/BankDTO.java new file mode 100644 index 0000000..fb7af48 --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/BankDTO.java @@ -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 paymentDTOList; +} diff --git a/src/main/java/com/example/demo/domain/DTO/PaymentDTO.java b/src/main/java/com/example/demo/domain/DTO/PaymentDTO.java new file mode 100644 index 0000000..09073dd --- /dev/null +++ b/src/main/java/com/example/demo/domain/DTO/PaymentDTO.java @@ -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; +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/cash/Bank.java b/src/main/java/com/example/demo/domain/vo/cash/Bank.java new file mode 100644 index 0000000..28bb31a --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/cash/Bank.java @@ -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 = ""; +} diff --git a/src/main/java/com/example/demo/service/cash/BankService.java b/src/main/java/com/example/demo/service/cash/BankService.java new file mode 100644 index 0000000..cd5eff8 --- /dev/null +++ b/src/main/java/com/example/demo/service/cash/BankService.java @@ -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 payment(Bank bank); +} diff --git a/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java new file mode 100644 index 0000000..a531d4d --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java @@ -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"; + // 签名密钥(与PHP中的$secret一致) + 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 payment(Bank bank) { + try { + // 1. 准备参数 + String settlementDate = bank.getTime(); // 从Bank对象获取time作为settlement_date + String network = "FPS"; // 固定值 + + // 2. 生成签名(复刻PHP逻辑,此处无需修改) + Map 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 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> requestEntity = new HttpEntity<>(formData, headers); + + // 调用第三方API(使用配置好SSL协议的RestTemplate) + ResponseEntity 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 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 params) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry 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(); + } +} From adcb639b3724c4fd5a58aaf3c16bbbaa8e57c263 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Tue, 28 Oct 2025 14:06:43 +0800 Subject: [PATCH 2/4] =?UTF-8?q?10=E6=9C=8827=E6=97=A5=E9=93=B6=E8=A1=8C?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3demo=E9=83=A8=E5=88=86=E8=A7=84=E8=8C=83?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/controller/cash/BankController.java | 6 +++--- src/main/java/com/example/demo/service/cash/BankService.java | 2 +- .../java/com/example/demo/serviceImpl/cash/BankServiceImpl.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) 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 1535bcf..5359a8d 100644 --- a/src/main/java/com/example/demo/controller/cash/BankController.java +++ b/src/main/java/com/example/demo/controller/cash/BankController.java @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.*; **/ @RestController -@RequestMapping("/admin/bank") +@RequestMapping("/admin/cash/bank") @RequiredArgsConstructor @Slf4j @CrossOrigin @@ -34,9 +34,9 @@ public class BankController { //payment银行接口 @Log("payment银行接口") @PostMapping("/payment") - public Result payment(@RequestBody Bank bank){ + public Result getPayment(@RequestBody Bank bank){ try { - BankDTO bankDTO = bankService.payment(bank); + BankDTO bankDTO = bankService.getPayment(bank); return Result.success(bankDTO); }catch (Exception e){ return Result.error(e.getMessage()); 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 cd5eff8..d77699e 100644 --- a/src/main/java/com/example/demo/service/cash/BankService.java +++ b/src/main/java/com/example/demo/service/cash/BankService.java @@ -14,5 +14,5 @@ import com.example.demo.domain.vo.cash.Bank; **/ public interface BankService { - BankDTO payment(Bank bank); + BankDTO getPayment(Bank bank); } 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 a531d4d..6188a2d 100644 --- a/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/cash/BankServiceImpl.java @@ -35,7 +35,7 @@ import java.util.TreeMap; 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"; - // 签名密钥(与PHP中的$secret一致) + // 签名密钥 private static final String SECRET = "8987d1b8-1d82-4b15-af06-828d0b12076f"; // 注入RestTemplate用于HTTP请求(需在Spring配置类中定义) @@ -46,13 +46,13 @@ public class BankServiceImpl implements BankService { } @Override - public BankDTO payment(Bank bank) { + public BankDTO getPayment(Bank bank) { try { // 1. 准备参数 String settlementDate = bank.getTime(); // 从Bank对象获取time作为settlement_date String network = "FPS"; // 固定值 - // 2. 生成签名(复刻PHP逻辑,此处无需修改) + // 2. 生成签名 Map params = new TreeMap<>(); // 按key升序排序 params.put("settlement_date", settlementDate); params.put("network", network); From 7b50e5e4b821c038a8056cd9f8c23b7566b84114 Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Wed, 29 Oct 2025 11:26:09 +0800 Subject: [PATCH 3/4] =?UTF-8?q?10=E6=9C=8828=E6=97=A5=E6=B4=BB=E5=8A=A8dem?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/bank/Server.java | 26 +++-- .../coin/RechargeActivityCenterController.java | 118 +++++++++++++++++++++ .../demo/domain/vo/coin/RechargeActivity.java | 58 ++++++++++ .../mapper/coin/RechargeActivityCenterMapper.java | 33 ++++++ .../coin/RechargeActivityCenterService.java | 30 ++++++ .../coin/RechargeActivityCenterServiceImpl.java | 50 +++++++++ .../mapper/RechargeActivityCenterMapper.xml | 74 +++++++++++++ 7 files changed, 378 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/example/demo/controller/coin/RechargeActivityCenterController.java create mode 100644 src/main/java/com/example/demo/domain/vo/coin/RechargeActivity.java create mode 100644 src/main/java/com/example/demo/mapper/coin/RechargeActivityCenterMapper.java create mode 100644 src/main/java/com/example/demo/service/coin/RechargeActivityCenterService.java create mode 100644 src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java create mode 100644 src/main/resources/mapper/RechargeActivityCenterMapper.xml diff --git a/src/main/java/com/example/demo/bank/Server.java b/src/main/java/com/example/demo/bank/Server.java index 257e03c..c21e35e 100644 --- a/src/main/java/com/example/demo/bank/Server.java +++ b/src/main/java/com/example/demo/bank/Server.java @@ -3,21 +3,25 @@ package com.example.demo.bank; import com.stripe.Stripe; import com.stripe.exception.StripeException; import com.stripe.model.*; -import com.stripe.param.BalanceTransactionListParams; -import com.stripe.param.PaymentIntentSearchParams; -import com.stripe.param.ProductCreateParams; -import com.stripe.param.PriceCreateParams; +import com.stripe.param.*; public class Server { public static void main(String[] args) throws StripeException { Stripe.apiKey = "sk_test_51SKwgEQqF1eV5j2cyHz7uZ28OsPHzt9nXv1DCOmr4buFHpGhhgmskCz2XOxtCbbQMZIEkELTWIlMgZWcK6PeflZj00nRijQkLx"; - BalanceTransactionListParams params = - BalanceTransactionListParams.builder().setLimit(3L).build(); - BalanceTransactionCollection balanceTransactions = BalanceTransaction.list(params); - System.out.println(balanceTransactions); - BalanceTransaction balanceTransaction = - BalanceTransaction.retrieve("txn_3SKxVWQqF1eV5j2c07IJegQv"); - System.out.println(balanceTransaction); +// BalanceTransactionListParams params = +// BalanceTransactionListParams.builder().setLimit(3L).build(); +// BalanceTransactionCollection balanceTransactions = BalanceTransaction.list(params); +// System.out.println(balanceTransactions); +// BalanceTransaction balanceTransaction = +// BalanceTransaction.retrieve("txn_3SKxVWQqF1eV5j2c07IJegQv"); +// 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(3L).build(); + ChargeCollection charges = Charge.list(params); + System.out.println(charges); } } \ No newline at end of file diff --git a/src/main/java/com/example/demo/controller/coin/RechargeActivityCenterController.java b/src/main/java/com/example/demo/controller/coin/RechargeActivityCenterController.java new file mode 100644 index 0000000..df370d8 --- /dev/null +++ b/src/main/java/com/example/demo/controller/coin/RechargeActivityCenterController.java @@ -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()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/coin/RechargeActivity.java b/src/main/java/com/example/demo/domain/vo/coin/RechargeActivity.java new file mode 100644 index 0000000..ca7142c --- /dev/null +++ b/src/main/java/com/example/demo/domain/vo/coin/RechargeActivity.java @@ -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; // 活动时间 +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/mapper/coin/RechargeActivityCenterMapper.java b/src/main/java/com/example/demo/mapper/coin/RechargeActivityCenterMapper.java new file mode 100644 index 0000000..6ba2fcb --- /dev/null +++ b/src/main/java/com/example/demo/mapper/coin/RechargeActivityCenterMapper.java @@ -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); +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/service/coin/RechargeActivityCenterService.java b/src/main/java/com/example/demo/service/coin/RechargeActivityCenterService.java new file mode 100644 index 0000000..fba1cef --- /dev/null +++ b/src/main/java/com/example/demo/service/coin/RechargeActivityCenterService.java @@ -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); +} diff --git a/src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java new file mode 100644 index 0000000..06c75c7 --- /dev/null +++ b/src/main/java/com/example/demo/serviceImpl/coin/RechargeActivityCenterServiceImpl.java @@ -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); + } +} \ No newline at end of file diff --git a/src/main/resources/mapper/RechargeActivityCenterMapper.xml b/src/main/resources/mapper/RechargeActivityCenterMapper.xml new file mode 100644 index 0000000..f500faa --- /dev/null +++ b/src/main/resources/mapper/RechargeActivityCenterMapper.xml @@ -0,0 +1,74 @@ + + + + + + + + + + INSERT INTO recharge_activity ( + activity_name, + business_belong, + start_time, + end_time, + status, + creator, + create_time + ) VALUES ( + #{activityName}, + #{businessBelong}, + #{startTime}, + #{endTime}, + #{status}, + #{creator}, + NOW() + ) + + + + + UPDATE recharge_activity + + activity_name = #{activityName}, + business_belong = #{businessBelong}, + start_time = #{startTime}, + end_time = #{endTime}, + status = #{status}, + creator = #{creator}, + update_time = NOW() + + WHERE id = #{id} + + + + + DELETE FROM recharge_activity + WHERE id = #{id} + + + \ No newline at end of file From 8d52124fff7d3b96a3392485e029583f120471db Mon Sep 17 00:00:00 2001 From: sunjiabei Date: Tue, 4 Nov 2025 10:21:37 +0800 Subject: [PATCH 4/4] =?UTF-8?q?10=E6=9C=8828=E6=97=A5=E6=B4=BB=E5=8A=A8dem?= =?UTF-8?q?o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/demo/bank/Server.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/example/demo/bank/Server.java b/src/main/java/com/example/demo/bank/Server.java index c21e35e..55b258a 100644 --- a/src/main/java/com/example/demo/bank/Server.java +++ b/src/main/java/com/example/demo/bank/Server.java @@ -7,21 +7,22 @@ import com.stripe.param.*; public class Server { public static void main(String[] args) throws StripeException { - Stripe.apiKey = "sk_test_51SKwgEQqF1eV5j2cyHz7uZ28OsPHzt9nXv1DCOmr4buFHpGhhgmskCz2XOxtCbbQMZIEkELTWIlMgZWcK6PeflZj00nRijQkLx"; +// 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_3SKxVWQqF1eV5j2c07IJegQv"); +// 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(3L).build(); - ChargeCollection charges = Charge.list(params); - System.out.println(charges); +// ChargeListParams params = ChargeListParams.builder().setLimit(1L).build(); +// ChargeCollection charges = Charge.list(params); +// System.out.println(charges); + } } \ No newline at end of file