Browse Source

12.17 红包修改

milestone-20251215-红包修改
huangqizhen 3 weeks ago
parent
commit
3e37608766
  1. 100
      src/main/java/com/example/demo/Util/BaseDES3.java
  2. 10
      src/main/java/com/example/demo/controller/Temporary/RedController.java
  3. 28
      src/main/java/com/example/demo/domain/vo/RedList.java
  4. 2
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  5. 6
      src/main/java/com/example/demo/service/Temporary/RedService.java
  6. 138
      src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java
  7. 2
      src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java
  8. 1
      src/main/resources/application-prod.yml
  9. 1
      src/main/resources/application-test.yml

100
src/main/java/com/example/demo/Util/BaseDES3.java

@ -0,0 +1,100 @@
package com.example.demo.Util;
import javax.crypto.Cipher;
import java.security.Key;
public class BaseDES3 {
private static String strDefaultKey = "98hltleg";
private Cipher encryptCipher = null;
private Cipher decryptCipher = null;
public static String byteArr2HexStr(byte[] arrB) throws Exception {
int iLen = arrB.length;
StringBuffer sb = new StringBuffer(iLen * 2);
for (int i = 0; i < iLen; i++) {
int intTmp = arrB[i];
while (intTmp < 0) {
intTmp = intTmp + 256;
}
if (intTmp < 16) {
sb.append("0");
}
sb.append(Integer.toString(intTmp, 16));
}
return sb.toString();
}
public static byte[] hexStr2ByteArr(String strIn) {
byte[] arrB = strIn.getBytes();
int iLen = arrB.length;
byte[] arrOut = new byte[iLen / 2];
for (int i = 0; i < iLen; i = i + 2) {
String strTmp = new String(arrB, i, 2);
arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
}
return arrOut;
}
public BaseDES3() throws Exception {
this(strDefaultKey);
}
public BaseDES3(String strKey) throws Exception {
Key key = getKey(strKey.getBytes());
encryptCipher = Cipher.getInstance("DES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
decryptCipher = Cipher.getInstance("DES");
decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
public byte[] encrypt(byte[] arrB) throws Exception {
return encryptCipher.doFinal(arrB);
}
public String encrypt(String strIn) throws Exception {
return byteArr2HexStr(encrypt(strIn.getBytes()));
}
public byte[] decrypt(byte[] arrB) throws Exception {
return decryptCipher.doFinal(arrB);
}
public String decrypt(String strIn) throws Exception {
return new String(decrypt(hexStr2ByteArr(strIn)));
}
private Key getKey(byte[] arrBTmp) {
byte[] arrB = new byte[8];
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
return key;
}
public static void main(String args[]) {
try {
BaseDES3 d = new BaseDES3();
String encryptedText = d.encrypt("90035176");
System.out.println("加密结果:" + encryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}

10
src/main/java/com/example/demo/controller/Temporary/RedController.java

@ -36,4 +36,14 @@ public class RedController {
}
return Result.success(redService.selectSum(red.getJwcode(),red.getType()));
}
@RequestMapping("/RedList")
public Result selectRedList(@RequestBody Red red) {
try {
redService.selectRedList(red.getJwcode());
}
catch (Exception e) {
return Result.error(e.getMessage());
}
return Result.success(redService.selectRedList(red.getJwcode()));
}
}

28
src/main/java/com/example/demo/domain/vo/RedList.java

@ -0,0 +1,28 @@
package com.example.demo.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
/**
* @program: GOLD
* @ClassName RedList
* @description:
* @author: huangqizhen
* @create: 202512-17 14:59
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RedList {
private Integer id;
private String title;
private BigDecimal discount;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date end_time;
}

2
src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java

@ -85,5 +85,7 @@ public class ConsumeUser implements Serializable {
private BigDecimal price; // 折扣金币
@ExcelIgnore
private Integer redMoney; //是否用红包
@ExcelIgnore
private List<String> redIds;
}

6
src/main/java/com/example/demo/service/Temporary/RedService.java

@ -1,8 +1,10 @@
package com.example.demo.service.Temporary;
import com.example.demo.domain.vo.Red;
import com.example.demo.domain.vo.RedList;
import java.math.BigDecimal;
import java.util.List;
/**
* @program: GOLD
@ -19,5 +21,7 @@ public interface RedService {
String sendJwcode(Integer jwcode);
BigDecimal selectRedSum(Integer jwcode);
String sendConsumeJwcode(Integer jwcode, BigDecimal price);
String sendConsumeJwcode(Integer jwcode, List<String> redIds );
List<RedList> selectRedList(Integer jwcode);
}

138
src/main/java/com/example/demo/serviceImpl/Temporary/RedServiceImpl.java

@ -1,9 +1,11 @@
package com.example.demo.serviceImpl.Temporary;
import com.alibaba.fastjson.JSON;
import com.example.demo.Util.BaseDES3;
import com.example.demo.Util.BusinessException;
import com.example.demo.config.RedTimeRuleConfig;
import com.example.demo.domain.vo.Red;
import com.example.demo.domain.vo.RedList;
import com.example.demo.exception.SystemException;
import com.example.demo.mapper.Temporary.RedMapper;
import com.example.demo.service.Temporary.RedService;
@ -18,12 +20,21 @@ import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException;
/**
@ -38,10 +49,15 @@ import java.time.format.DateTimeFormatter;
@Service
public class RedServiceImpl implements RedService {
@Value("${red.url}")
private String BASE_URLProd ;
private static final String BASE_URLDev = "http://gf977328.natappfree.cc";
private String BASE_URLProd;
@Value("${red.urllogin}")
private String BASE_URL_LOGIN;
private static final String BASE_URLDev = "http://af9c6249.natappfree.cc";
private static final String PATH = "/api/coupon/IssueRechargeRedPacket";
private static final String PATHRED = "/api/coupon/getTotalDiscount";
private static final String BASE_URL = "http://localhost:8080";
private static final String PATHLIST = "/api/coupon/getRedPacket";
private static final String PATHLOGIN = "/api/user/toujiaoAppLogin";
private static final String CONSUME_PATH = "/api/coupon/updateCostRedPacket";
private static final HttpClient CLIENT = HttpClient.newHttpClient();
@ -113,11 +129,11 @@ public class RedServiceImpl implements RedService {
}
}
@Override
public String sendConsumeJwcode(Integer jwcode, BigDecimal price) {
public String sendConsumeJwcode(Integer jwcode,List<String> redIds) {
try {
String body = JSON.toJSONString(java.util.Map.of("jwcode", jwcode,"discount",price));
String body = JSON.toJSONString(java.util.Map.of("jwcode", jwcode,"coupon_ids",redIds));
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URLProd + CONSUME_PATH)) //URL记得换
.uri(URI.create(BASE_URLDev + CONSUME_PATH)) //URL记得换
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
@ -134,6 +150,74 @@ public class RedServiceImpl implements RedService {
}
}
@Override
public List<RedList> selectRedList(Integer jwcode) {
try {
BaseDES3 d = new BaseDES3();
String encryptedText = d.encrypt(String.valueOf(jwcode));
String token = loginAndGetToken(encryptedText);
// 构造请求体
String body = JSON.toJSONString(Map.of(
"type", "1",
"token", token
));
log.debug("请求红包列表,用户ID: {}, URL: {}", jwcode, BASE_URLDev + PATHLIST);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URLDev + PATHLIST))
.timeout(Duration.ofSeconds(10)) // 加超时防止线程阻塞
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
// 检查 HTTP 状态码
if (resp.statusCode() != 200) {
log.error("红包服务返回非200状态码: {},响应: {}", resp.statusCode(), resp.body());
throw new BusinessException("红包服务异常,请稍后重试");
}
// 解析 JSON
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(resp.body());
// 检查是否成功根据你的接口约定可能 code==200 表示成功
// 示例假设 {"code":200, "data": {...}}
if (!root.has("data")) {
String msg = root.has("msg") ? root.get("msg").asText() : "未知错误";
log.warn("红包服务返回无data字段,响应: {}", resp.body());
throw new BusinessException("数据格式异常: " + msg);
}
JsonNode dataNode = root.get("data");
log.debug("收到红包数据: num={}, total={}, 红包数={}",
dataNode.has("num") ? dataNode.get("num").asInt() : "N/A",
dataNode.has("total") ? dataNode.get("total").asInt() : "N/A",
dataNode.has("red_packet_list") ? dataNode.get("red_packet_list").size() : 0);
// 关键提取 red_packet_list 并映射为 List<RedList>
JsonNode listNode = dataNode.get("red_packet_list");
if (listNode == null || listNode.isNull() || !listNode.isArray()) {
log.warn("red_packet_list 字段为空或非数组");
return Collections.emptyList();
}
// 使用 Jackson 的正确方法转换 JSON Array List<RedList>
List<RedList> result = mapper.readValue(mapper.treeAsTokens(listNode),
mapper.getTypeFactory().constructCollectionType(List.class, RedList.class));
log.info("成功获取红包列表,用户ID: {}, 数量: {}", jwcode, result.size());
return result;
} catch (Exception e) {
log.error("调用红包服务失败", e);
throw new BusinessException("系统异常,请联系管理员");
}
}
@Override
public BigDecimal selectRedSum(Integer jwcode) {
try {
@ -205,5 +289,49 @@ public class RedServiceImpl implements RedService {
}
}
}
// RedServiceImpl UserService 中添加
public String loginAndGetToken(String jwcode) {
try {
// 注意这个接口是 application/x-www-form-urlencoded不是 JSON
String formData = "jwcode=" + URLEncoder.encode(jwcode, StandardCharsets.UTF_8) +
"&token=" + URLEncoder.encode("9ior41AF0xTIbIG2pRnnbZi0+fEeMx8pywnIlrmTwo5FbqJ9lWrSWOxp9MkpKiNtedtUafqvzIwpFKrwuMs", StandardCharsets.UTF_8);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(BASE_URL_LOGIN+PATHLOGIN))
.timeout(Duration.ofSeconds(8))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(HttpRequest.BodyPublishers.ofString(formData))
.build();
HttpResponse<String> resp = CLIENT.send(request, HttpResponse.BodyHandlers.ofString());
if (resp.statusCode() != 200) {
log.error("登录失败,状态码: {},响应: {}", resp.statusCode(), resp.body());
throw new BusinessException("登录失败,请重试");
}
// 假设响应格式{"code":200,"msg":"success","data":{"token":"xxx","user_id":123}}
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(resp.body());
if (root.get("code").asInt() != 200) {
String msg = root.has("msg") ? root.get("msg").asText() : "未知错误";
throw new BusinessException("登录失败: " + msg);
}
JsonNode data = root.get("data");
if (data == null || !data.has("token")) {
throw new BusinessException("登录成功但未返回 token");
}
String userToken = data.get("token").asText();
log.debug("用户 {} 登录成功,token: {}", jwcode, userToken.substring(0, 10) + "...");
return userToken;
} catch (Exception e) {
log.error("登录异常,jwcode={}", jwcode, e);
throw new BusinessException("登录服务异常");
}
}
}

2
src/main/java/com/example/demo/serviceImpl/coin/ConsumeServiceImpl.java

@ -205,7 +205,7 @@ public class ConsumeServiceImpl implements ConsumeService {
log.warn("消耗累加失败,主流程继续 | jwcode={}", consumeUser.getJwcode(), e);
}
if(consumeUser.getRedMoney()==1){
redService.sendConsumeJwcode(consumeUser.getJwcode(),(consumeUser.getPrice().subtract(consumeUser.getSumGold())).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
redService.sendConsumeJwcode(consumeUser.getJwcode(),consumeUser.getRedIds());
}
return Result.success();
}

1
src/main/resources/application-prod.yml

@ -94,6 +94,7 @@ spring:
file:
upload:
url: http://api.homilychart.com/hljw/api/aws/upload
urllogin: https://api.homilychart.com/hljwgo
feishu:
webhook:
url: https://open.feishu.cn/open-apis/bot/v2/hook/1a515b19-b64f-46b7-9486-35842b9539fe

1
src/main/resources/application-test.yml

@ -103,6 +103,7 @@ bean:
red:
url: http://39.101.133.168:8828/scms
urllogin: http://39.101.133.168:8828/hljwgo
server:
port: 8081

Loading…
Cancel
Save