Commit 36767de3 authored by Allen Chen's avatar Allen Chen

commit

parent e48f183c
......@@ -73,12 +73,6 @@
<artifactId>thumbnailator</artifactId>
<version>0.4.19</version>
</dependency>
<!-- HTTP请求工具(用于下载网络图片,也可使用Spring自带RestTemplate) -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
......
......@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.ta.pddserver.entity.*;
import org.ta.pddserver.model.enums.IdentityErrorType;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.model.pddjy.request.*;
import org.ta.pddserver.model.pddlg.common.TraceObject;
......@@ -18,6 +19,7 @@ import org.ta.pddserver.service.impl.*;
import org.ta.pddserver.utils.JsonResponse;
import org.ta.pddserver.utils.PddJYPriceTool;
import org.ta.pddserver.utils.PddSignTool;
import org.ta.pddserver.utils.WorldexUtil;
import java.io.BufferedReader;
import java.io.IOException;
......@@ -210,7 +212,15 @@ public class PddOpenController {
PddServiceConsoUserIdentifyRequest identifyRequest = JSON.parseObject(body, PddServiceConsoUserIdentifyRequest.class);
UserIdentify(identifyRequest);
log.info("pdd.service.conso.user.identify");
// todo 不需特殊回复,但是code区分状态码
IdentityErrorType errorType = WorldexUtil.verifyIdentity(identifyRequest.getName(), identifyRequest.getMobileNo(), identifyRequest.getIdNumber());
if(!errorType.equals(IdentityErrorType.Correct)) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("success", false);
jsonObject.put("code", errorType.getValue());
jsonObject.put("message", errorType.getDesc());
return jsonObject;
}
}
break;
default: {
......
......@@ -3,6 +3,7 @@ package org.ta.pddserver.model.enums;
import lombok.Getter;
public enum IdentityErrorType {
Correct(1, "正确"),
TelephoneWrong(302, "用户用的是护照号,校验失败(手机号格式有问题)"),
NameWrong(303, "用户用的是护照号,校验失败(姓名格式有问题)"),
UnknownWrong(306, "其它网络类可以重试的未知错误(如依赖下游不可用或超时)"),
......
package org.ta.pddserver.utils;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
......@@ -46,16 +48,34 @@ public class ImageUtils {
*/
private byte[] downloadImage(String imageUrl) throws IOException {
try {
HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(imageUrl);
// 发送请求并获取响应(设置超时时间,避免阻塞)
return httpClient.execute(httpGet, response -> {
if (response.getCode() != 200) {
throw new IOException("图片下载失败,HTTP状态码:" + response.getCode());
HttpHeaders headers = new HttpHeaders();
headers.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");
HttpEntity<Void> requestEntity = new HttpEntity<>(headers);
// 2. RestTemplate 发送GET请求,获取图片二进制数据( ResponseEntity<byte[]> 接收二进制响应)
ResponseEntity<byte[]> response;
try {
response = new RestTemplate().exchange(
imageUrl,
HttpMethod.GET,
requestEntity,
byte[].class // 响应体类型:字节数组(直接接收图片二进制)
);
} catch (RestClientException e) {
throw new RestClientException("图片下载失败,URL:" + imageUrl + ",原因:" + e.getMessage());
}
// 3. 校验响应是否成功(HTTP 200 OK)
if (!response.getStatusCode().is2xxSuccessful()) {
throw new RestClientException("图片下载失败,HTTP状态码:" + response.getStatusCode() + ",URL:" + imageUrl);
}
// 响应体转字节数组
return EntityUtils.toByteArray(response.getEntity());
});
// 4. 提取图片二进制数据
byte[] imageBytes = response.getBody();
if (imageBytes == null || imageBytes.length == 0) {
throw new IllegalArgumentException("下载的图片为空,URL:" + imageUrl);
}
return imageBytes;
} catch (Exception e) {
e.printStackTrace();
}
......
package org.ta.pddserver.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.ta.pddserver.model.enums.IdentityErrorType;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class WorldexUtil {
private static final String URL = "https://api.worldex.kr";
private static String token = "";
private static Long timeout = 0L;
public static JSONObject login() {
Map<String, String> map = new HashMap<String, String>();
map.put("userName", "hjpddjy");
map.put("password", "hjpddjy123");
String resp = WorldexUtil.sendJsonPost("/api/user/signIn", map, null);
log.info("resp = {}", resp);
JSONObject json = JSONObject.parseObject(resp);
if (json.getInteger("code") == 2000) {
return json.getJSONObject("data");
}
return null;
}
public static IdentityErrorType verifyIdentity(String name, String phone, String code) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", name);
map.put("mobile_phone_no", phone);
map.put("customs_clearance_code", code);
String token = WorldexUtil.getToken();
String resp = WorldexUtil.sendJsonPost("/api/worldex/retrievePersEcm", map, token);
log.info("resp = {}", resp);
JSONObject json = JSONObject.parseObject(resp);
if (json.getInteger("code") == 2000) {
JSONObject data = json.getJSONObject("data");
if (data.getInteger("tCnt").intValue() == 1) {
return IdentityErrorType.Correct;
}
String errMsgCn = data.getJSONObject("persEcmQryRtnErrInfoVo").getString("errMsgCn");
if (errMsgCn == null) {
return IdentityErrorType.UnknownWrong;
}
if (errMsgCn.startsWith("입력하신 납세의무자명") && errMsgCn.contains("이 개인통관고유부호의 성명과 일치하지 않습니다")) {
return IdentityErrorType.CodeNameInconsistency;
}
if (errMsgCn.startsWith("납세의무자 휴대전화번호가 일치하지 않습니다")) {
return IdentityErrorType.CodeTelephoneInconsistency;
}
if (errMsgCn.startsWith("납세의무자 개인통관고유부호가 존재하지 않습니다")) {
return IdentityErrorType.CodeUnused;
}
return IdentityErrorType.InformationInconsistency;
}
return null;
}
private static String getToken() {
long now = System.currentTimeMillis() / 1000 - 100;
if (token.isEmpty() || timeout < now) {
String newToken = WorldexUtil.requestToken();
if (newToken != null) {
token = newToken;
timeout = now + 24 * 60 * 60;
}
}
return token;
}
private static String requestToken() {
JSONObject jsonObject = WorldexUtil.login();
if (jsonObject != null) {
String token = jsonObject.getString("token");
log.info("token:{}", token);
return token;
}
log.error("login failed");
return "";
}
public static String sendJsonPost(String url, Object requestObj, String token) {
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
RestTemplate restTemplate = new RestTemplate();
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Accept-Language", "zh-cn");
httpHeaders.set("token", token);
HttpEntity<Object> httpEntity = new HttpEntity<Object>(requestObj, httpHeaders);
ResponseEntity<String> resp = restTemplate.exchange(URL + url, HttpMethod.POST, httpEntity, String.class);
// ResponseEntity<String> resp = restTemplate.postForEntity(URL + url, requestObj, String.class, headers);
return resp.getBody();
}
}
package org.ta.pddserver;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.ta.pddserver.model.enums.IdentityErrorType;
import org.ta.pddserver.utils.WorldexUtil;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class WordexAPITest {
private static final String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiIsImtpZCI6ImtleUlkIn0.eyJpc3MiOiJhcGkud29ybGRleC5rciIsImF1ZCI6InVzZXIiLCJzdWIiOiJ0b2tlbiIsImp0aSI6ImhqcGRkankiLCJpYXQiOjE3NjE4MTI0ODEsIm5iZiI6MTc2MTgxMjQyMSwiZXhwIjoxNzYxODg0NDgxfQ.xeukpmS86euu44XzyQ8USM2tMCdXIqCXhjoe1QrpgcB2O5dHkY3_ixAWNmL2c7SnDOWL0kHanLX-h668zDQiHQ";
@Test
public void testLogin() {
JSONObject jsonObject = WorldexUtil.login();
if (jsonObject != null) {
String token = jsonObject.getString("token");
log.info("token:{}", token);
return;
}
log.error("login failed");
//
}
@Test
public void verify() {
org.ta.pddserver.model.enums.IdentityErrorType type = WorldexUtil.verifyIdentity("nanjiexi", "P11111111", "01099999999");
log.info("type:{}", type);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment