From df4b4a29d302b56df60426332ad57c65064f7940 Mon Sep 17 00:00:00 2001 From: Derran Date: Mon, 7 Apr 2025 16:57:57 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=B6=E8=A1=8C=E5=8D=A1=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/request/BankCardVerifyDto.java | 18 + .../user/response/BankCardVerifyVo.java | 12 + .../bankcard/BankCardApplicationService.java | 6 + .../infrastructure/utils/BankCardUtil.java | 62 ++++ .../dam/infrastructure/utils/HttpUtils.java | 311 ++++++++++++++++++ 5 files changed, 409 insertions(+) create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/request/BankCardVerifyDto.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/response/BankCardVerifyVo.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/BankCardUtil.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/HttpUtils.java diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/request/BankCardVerifyDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/request/BankCardVerifyDto.java new file mode 100644 index 0000000..ff05c55 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/request/BankCardVerifyDto.java @@ -0,0 +1,18 @@ +package com.qniao.dam.api.command.bankcard.user.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BankCardVerifyDto { + + @ApiModelProperty("持卡人姓名") + private String ownerName; + + @ApiModelProperty("卡号") + private String cardNum; +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/response/BankCardVerifyVo.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/response/BankCardVerifyVo.java new file mode 100644 index 0000000..d5ea604 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/bankcard/user/response/BankCardVerifyVo.java @@ -0,0 +1,12 @@ +package com.qniao.dam.api.command.bankcard.user.response; + +import lombok.Data; + +@Data +public class BankCardVerifyVo { + + private Boolean status; + + private String msg; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/bankcard/BankCardApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/bankcard/BankCardApplicationService.java index c618e1c..f425647 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/bankcard/BankCardApplicationService.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/bankcard/BankCardApplicationService.java @@ -1,7 +1,9 @@ package com.qniao.dam.application.service.bankcard; +import com.qniao.dam.api.command.bankcard.user.request.BankCardVerifyDto; import com.qniao.dam.domain.aggregate.bankcard.BankCardAggregate; import com.qniao.dam.domain.aggregate.bankcard.entity.BankCard; +import com.qniao.dam.infrastructure.utils.BankCardUtil; import com.qniao.dam.query.bankcard.BankCardQueryService; import com.qniao.framework.exception.BizException; import org.springframework.stereotype.Service; @@ -22,6 +24,10 @@ public class BankCardApplicationService { if (Objects.nonNull(existBankCard)) { throw new BizException("银行卡已存在"); } else { + //二要素校验 + BankCardVerifyDto dto = new BankCardVerifyDto(bankCard.getOwnerName(), bankCard.getCardNum()); + BankCardUtil.getBankCardVerify(dto); + bankCardAggregate.create(bankCard); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/BankCardUtil.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/BankCardUtil.java new file mode 100644 index 0000000..87fd7f1 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/BankCardUtil.java @@ -0,0 +1,62 @@ +package com.qniao.dam.infrastructure.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.qniao.dam.api.command.bankcard.user.request.BankCardVerifyDto; +import com.qniao.framework.exception.BizException; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.apache.http.util.EntityUtils; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public class BankCardUtil { + + private static final String authorization = "APPCODE 6fd14ec3939c483a89192c1fcc871c4b"; + + public static void getBankCardVerify(BankCardVerifyDto dto) { + + String host = "https://kzbank3v1.market.alicloudapi.com"; + String path = "/api/bankcard2/check"; + String method = "POST"; + Map headers = new HashMap(); + //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 + headers.put("Authorization", authorization); + //根据API的要求,定义相对应的Content-Type + headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + Map querys = new HashMap(); + Map bodys = new HashMap(); + bodys.put("bankcard", dto.getCardNum()); + bodys.put("name", dto.getOwnerName()); + + + try { + /** + * 重要提示如下: + * HttpUtils请从 + * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java + * 下载 + * + * 相应的依赖请参照 + * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml + */ + HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); + + JSONObject json = JSON.parseObject(EntityUtils.toString(response.getEntity())); + if (json.getString("success").equals("true")) { + // 成功 + } else { + log.error("----------------银行卡二要素校验异常------------------"); + String msg = json.getString("msg"); + log.error(msg); + throw new BizException(msg); + } + } catch (Exception e) { + log.error("银行卡校验异常", e); + throw new BizException("银行卡校验异常"); + } + } + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/HttpUtils.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/HttpUtils.java new file mode 100644 index 0000000..67bb73f --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/utils/HttpUtils.java @@ -0,0 +1,311 @@ +package com.qniao.dam.infrastructure.utils; + +import org.apache.commons.lang.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.methods.HttpPut; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class HttpUtils { + + /** + * get + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doGet(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpGet request = new HttpGet(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + /** + * post form + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param bodys + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + Map bodys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (bodys != null) { + List nameValuePairList = new ArrayList(); + + for (String key : bodys.keySet()) { + nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key))); + } + UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8"); + formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8"); + request.setEntity(formEntity); + } + + return httpClient.execute(request); + } + + /** + * Post String + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Post stream + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPost(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPost request = new HttpPost(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Put String + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + String body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (StringUtils.isNotBlank(body)) { + request.setEntity(new StringEntity(body, "utf-8")); + } + + return httpClient.execute(request); + } + + /** + * Put stream + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @param body + * @return + * @throws Exception + */ + public static HttpResponse doPut(String host, String path, String method, + Map headers, + Map querys, + byte[] body) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpPut request = new HttpPut(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + if (body != null) { + request.setEntity(new ByteArrayEntity(body)); + } + + return httpClient.execute(request); + } + + /** + * Delete + * + * @param host + * @param path + * @param method + * @param headers + * @param querys + * @return + * @throws Exception + */ + public static HttpResponse doDelete(String host, String path, String method, + Map headers, + Map querys) + throws Exception { + HttpClient httpClient = wrapClient(host); + + HttpDelete request = new HttpDelete(buildUrl(host, path, querys)); + for (Map.Entry e : headers.entrySet()) { + request.addHeader(e.getKey(), e.getValue()); + } + + return httpClient.execute(request); + } + + private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException { + StringBuilder sbUrl = new StringBuilder(); + sbUrl.append(host); + if (!StringUtils.isBlank(path)) { + sbUrl.append(path); + } + if (null != querys) { + StringBuilder sbQuery = new StringBuilder(); + for (Map.Entry query : querys.entrySet()) { + if (0 < sbQuery.length()) { + sbQuery.append("&"); + } + if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) { + sbQuery.append(query.getValue()); + } + if (!StringUtils.isBlank(query.getKey())) { + sbQuery.append(query.getKey()); + if (!StringUtils.isBlank(query.getValue())) { + sbQuery.append("="); + sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8")); + } + } + } + if (0 < sbQuery.length()) { + sbUrl.append("?").append(sbQuery); + } + } + + return sbUrl.toString(); + } + + private static HttpClient wrapClient(String host) { + HttpClient httpClient = new DefaultHttpClient(); + if (host.startsWith("https://")) { + sslClient(httpClient); + } + + return httpClient; + } + + private static void sslClient(HttpClient httpClient) { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + public void checkClientTrusted(X509Certificate[] xcs, String str) { + + } + public void checkServerTrusted(X509Certificate[] xcs, String str) { + + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLSocketFactory ssf = new SSLSocketFactory(ctx); + ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + ClientConnectionManager ccm = httpClient.getConnectionManager(); + SchemeRegistry registry = ccm.getSchemeRegistry(); + registry.register(new Scheme("https", 443, ssf)); + } catch (KeyManagementException ex) { + throw new RuntimeException(ex); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException(ex); + } + } +}