feat:验证码

This commit is contained in:
xiang
2026-05-05 21:23:11 +08:00
parent 66a69a4968
commit a1d42a4b27
5 changed files with 83 additions and 15 deletions

View File

@@ -8,7 +8,8 @@ import lombok.Getter;
public enum YcCodeTypeEnum {
YC_10118(10118, "中文字符 1~4位 plus 其他类型准确率不满足 可使用本类型"),
YC_6246(30100, "通用中文点选1")
YC_6246(30100, "通用中文点选1"),
YC_310700(310700, "适合Zlb使用的word click")
;
private final Integer type;

View File

@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class YcCodeRequest {
/**
* 图片
* 图片 base64
*/
private String image;
/**
@@ -21,4 +21,9 @@ public class YcCodeRequest {
*/
private Integer type;
private String extra;
/**
* 模板图片 base64
*/
private String labelImage;
}

View File

@@ -9,10 +9,13 @@ import com.xiang.common.pojo.code.YcCodeDataResp;
import com.xiang.common.pojo.code.YcCodeRequest;
import com.xiang.common.utils.HttpService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Objects;
@Service
@@ -42,14 +45,34 @@ public class CodeServiceImpl implements ICodeService {
}
@Override
public String codeResolve(String image, String extra) {
YcCodeBaseResponse<YcCodeDataResp> resp = baseCodeResolve(YcCodeTypeEnum.YC_6246.getType(), image, extra);
if (Objects.isNull(resp)) {
public List<String> codeResolve(String image, String templateImage) {
HashMap<String, String> header = Maps.newHashMap();
header.put("Content-Type", "application/json");
YcCodeRequest ycCodeRequest = new YcCodeRequest();
ycCodeRequest.setImage(image);
ycCodeRequest.setToken("9LQ1ATKVEeO8Arhq-HavXzpHvkzdZz_r7ydmqlYhp9c");
ycCodeRequest.setLabelImage(templateImage);
String resp = HttpService.doPost(YUN_CODE_API_URL, header, JSON.toJSONString(ycCodeRequest));
YcCodeBaseResponse<YcCodeDataResp> response = JSON.parseObject(resp, new TypeReference<YcCodeBaseResponse<YcCodeDataResp>>() {
});
if (Objects.isNull(response)) {
return null;
}
Integer code = resp.getCode();
if (200 == code) {
return resp.getData().getData();
Integer code = response.getCode();
if (10000 == code) {
YcCodeDataResp data = response.getData();
if (Objects.isNull(data)) {
return null;
}
Integer dataCode = data.getCode();
if (0 == dataCode) {
String dataData = data.getData();
if (StringUtils.isNotBlank(dataData)) {
String[] split = dataData.split("\\|");
return Arrays.asList(split);
}
}
}
return null;
}

View File

@@ -4,11 +4,13 @@ import com.xiang.common.pojo.code.YcCodeBaseResponse;
import com.xiang.common.pojo.code.YcCodeDataResp;
import com.xiang.common.pojo.code.YcCodeRequest;
import java.util.List;
public interface ICodeService {
String templateCodeResolve(String image);
String codeResolve(String image, String extra);
List<String> codeResolve(String image, String extra);
YcCodeBaseResponse<YcCodeDataResp> baseCodeResolve(Integer type, String image, String extra);
}

View File

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.xiang.common.factory.JntyzxDingTalkFactory;
import com.xiang.common.pojo.jntyzx.zlb.*;
import com.xiang.common.service.ICodeService;
@@ -17,6 +18,7 @@ import com.xiang.common.utils.DateUtils;
import com.xiang.common.utils.OkHttpUtil;
import com.xiang.service.module.jntyzx.zlb.constants.ZlbUrlConstants;
import lombok.extern.slf4j.Slf4j;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
@@ -362,19 +364,54 @@ public class ZlbServiceImpl implements ZlbService {
//获取图片验证码
String s = client.postJson(ZlbUrlConstants.captchaUrl, null, "{}");
JSONObject jsonObject = JSON.parseObject(s);
String templateImage = JSON.toJSONString(jsonObject.get("templateImage"));
String templeCode = codeService.templateCodeResolve(templateImage);
String id = (String) jsonObject.get("id");
String captcha = JSON.toJSONString(jsonObject.get("captcha"));
String backgroundImage = JSON.toJSONString(JSON.parseObject(captcha).get("backgroundImage"));
String track = codeService.codeResolve(backgroundImage, templeCode);
String templateImage = JSON.toJSONString(JSON.parseObject(captcha).get("templateImage"));
List<String> trackList = codeService.codeResolve(backgroundImage, templateImage);
ZlbOrderInfo orderInfo = new ZlbOrderInfo();
orderInfo.setId(id);
//获取验证码轨迹
ZlbOrderInfo zlbOrderInfo = JSONObject.parseObject(track, ZlbOrderInfo.class);
zlbOrderInfo.setSiteOrderDetailsStr(siteOrderDetailsStr);
String jsonString = JSON.toJSONString(zlbOrderInfo);
List<ZlbOrderInfo.ZlbData.TrackList> trackListList = convert(trackList);
ZlbOrderInfo.ZlbData data = new ZlbOrderInfo.ZlbData();
// data.setBgImageWidth();
// data.setBgImageHeight();
// data.setStartTime();
// data.setStopTime();
data.setTrackList(trackListList);
orderInfo.setData(data);
orderInfo.setSiteOrderDetailsStr(siteOrderDetailsStr);
String jsonString = JSON.toJSONString(orderInfo);
log.info("json:\n {}", jsonString);
return jsonString;
}
private List<ZlbOrderInfo.ZlbData.TrackList> convert(List<String> trackList) {
List<ZlbOrderInfo.ZlbData.TrackList> result = Lists.newArrayList();
for (String track : trackList) {
String[] split = track.split(",");
String x = split[0];
String y = split[1];
ZlbOrderInfo.ZlbData.TrackList data = new ZlbOrderInfo.ZlbData.TrackList();
data.setX(Integer.valueOf(x));
data.setY(Integer.valueOf(y));
data.setT(1);
data.setType("click");
result.add(data);
ZlbOrderInfo.ZlbData.TrackList move = new ZlbOrderInfo.ZlbData.TrackList();
move.setX(Integer.valueOf(x));
move.setY(Integer.valueOf(y));
move.setT(1);
move.setType("move");
}
return result;
}
@Override
public void deleteRedis(String name) {
// 定义模糊匹配模式