韩国实名认证 (手机号+身份证实名认证)niceApi

2024-03-26 07:10

本文主要是介绍韩国实名认证 (手机号+身份证实名认证)niceApi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是一个实名认证的对接api,是nice提供的,因为国内社区并不多,把自己对接国外实名认证的实现分享给社区,简单记录一下。
韩国大概是这样子的一个认证方式

然后我这里给一下官网的文档(我有翻译好的)https://www.niceapi.co.kr/#/apis/guide?ctgrCd=0100&prdId=31&prdNm=%EB%B3%B8%EC%9D%B8%ED%99%95%EC%9D%B8%28%ED%86%B5%ED%95%A9%ED%98%95%29

直接上代码吧,以上的秘钥都是处理了的,实际根据自己申请的为准

@RestController
@RequestMapping("/niceApi")
@Api(tags = "NICE API实名认证相关api")
@Slf4j
public class NiceAPIController extends BaseController {@Autowiredprivate RedisCache    redisCache;private static final Logger logger = LoggerFactory.getLogger(FaceBookLoginController.class);private static final String clientId = "1b9dd185-f0cb-212133-b6f22283d2269ff6";private static final String clientSecret = "d4d1012646242121e7a1bd515e7e71ea6f12";private static final String accessToken = "6f90befd-2aa9-41212-1c837740c41";//获取全局token的urlprivate static final String niceApiGetAccessTokenUrl = "https://svc.niceapi.co.kr:22001/digital/niceid/oauth/oauth/token";private static final String requestCryptoUrl = "https://svc.niceapi.co.kr:22001/digital/niceid/api/v1.0/common/crypto/token"; // API请求URLprivate static final Integer productId = 2101979031;/*** nice获取全局token** @return*/@PostMapping("/accessToken")public static AjaxResult accessTokenTwo(){// 构建请求URL和连接对象HttpURLConnection connection = null;try {URL url = new URL(niceApiGetAccessTokenUrl);connection = (HttpURLConnection) url.openConnection();// 设置请求方法为POSTconnection.setRequestMethod("POST");// 设置请求头信息connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");// 构建授权信息String credentials = clientId + ":" + clientSecret;String encodedCredentials = Base64.getEncoder().encodeToString(credentials.getBytes(StandardCharsets.UTF_8));connection.setRequestProperty("Authorization", "Basic " + encodedCredentials);// 构建POST数据String postData = "grant_type=client_credentials&scope=default";// 发送请求connection.setDoOutput(true);try (OutputStream outputStream = connection.getOutputStream()) {byte[] postDataBytes = postData.getBytes(StandardCharsets.UTF_8);outputStream.write(postDataBytes);outputStream.flush();}// 获取响应int responseCode = connection.getResponseCode();String responseData;if (responseCode >= 200 && responseCode < 300) {// 读取响应数据BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuilder response = new StringBuilder();String line;while ((line = reader.readLine()) != null) {response.append(line);}reader.close();// 处理响应数据responseData = response.toString();} else {// 读取错误响应数据BufferedReader errorReader = new BufferedReader(new InputStreamReader(connection.getErrorStream()));StringBuilder errorResponse = new StringBuilder();String errorLine;while ((errorLine = errorReader.readLine()) != null) {errorResponse.append(errorLine);}errorReader.close();// 处理错误响应数据responseData = errorResponse.toString();}return new AjaxResult(responseCode, responseData);} catch (IOException e) {e.printStackTrace();} finally {if (connection != null) {connection.disconnect();}}return new AjaxResult(500, "操作失败");}/*** 获取token加密请求** @param* @return*/public static String getTokenCrypto(String req_dtim, String req_no) {String token = generateToken();String requestPayload = "{\n" +"  \"dataHeader\": {\n" +"    \"CNTY_CD\": \"ko\"\n" +"  },\n" +"  \"dataBody\": {\n" +"    \"req_dtim\": \"" + req_dtim + "\",\n" +"    \"req_no\": \"" + req_no + "\",\n" +"    \"enc_mode\": \"1\"\n" +"  }\n" +"}";try {URL url = new URL(requestCryptoUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "application/json");conn.setRequestProperty("Authorization", "bearer " + token);conn.setRequestProperty("ProductID", productId.toString());conn.setDoOutput(true);OutputStream os = conn.getOutputStream();os.write(requestPayload.getBytes(StandardCharsets.UTF_8));os.flush();if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String responseLine;StringBuilder responseBuilder = new StringBuilder();while ((responseLine = br.readLine()) != null) {responseBuilder.append(responseLine.trim());}br.close();String response = responseBuilder.toString();conn.disconnect();return response;} else {System.out.println("API请求失败,响应码:" + conn.getResponseCode());conn.disconnect();return null;}} catch (Exception e) {e.printStackTrace();}return null;}/*** token加密请求  "bearer " +  Base64Encoding(access_token:current_timestamp:client_id")** @return*/private static String generateToken() {// 计算当前时间戳Date currentDate = new Date();long current_timestamp = currentDate.getTime() / 1000;// 构造token字符串String tokenString = accessToken + ":" + current_timestamp + ":" + clientId;// 对token进行Base64编码byte[] tokenBytes = tokenString.getBytes(StandardCharsets.UTF_8);String encodedToken = Base64.getEncoder().encodeToString(tokenBytes);return encodedToken;}/*** 创建密钥对 key  vi  hmac_key resultVal** @param* @throws NoSuchAlgorithmException*/public static KeyViEntity creatKeyAndVi(String req_dtim, String req_no, String token_val) throws NoSuchAlgorithmException {KeyViEntity keyViEntity = new KeyViEntity();// 获取"token加密请求"API请求和响应值,此处仅作示例,实际情况应根据API的实际返回值来获取req_dtim、req_no和token_val的值// 生成对称密钥String resultVal = generateHmacKey(req_dtim, req_no, token_val);System.out.println("resultVal:" + resultVal);//获取密钥对key  vi// 截取前16位String key = resultVal.substring(0, 16);System.out.println("前16位:" + key);keyViEntity.setKey(key);// 截取前32位String hmac_key = resultVal.substring(0, 32);System.out.println("前32位:" + hmac_key);keyViEntity.setHmacKey(hmac_key);// 截取后六位String vi = resultVal.substring(resultVal.length() - 16);System.out.println("后16位:" + vi);keyViEntity.setVi(vi);return keyViEntity;}/*** 实名认证跳转接口**/@GetMapping(value = "/getNiceApiUrl")public String   getNiceApiUrl(NiceApiDTO niceApiDTO) throws NoSuchAlgorithmException {// 获取当前时间的LocalDateTime对象LocalDateTime now = LocalDateTime.now();// 创建DateTimeFormatter对象,使用指定的格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss");// 使用DateTimeFormatter对象对LocalDateTime对象进行格式化String formattedDateTime = now.format(formatter);// 去除格式化后字符串中的非数字字符,得到"20230725162601"格式String reqDtim   = formattedDateTime.replaceAll("\\D", "");System.out.println(reqDtim);String reqNo = String.valueOf(System.currentTimeMillis());System.out.println(reqNo);//2.token加密请求String tokenCrypto = getTokenCrypto(reqDtim, reqNo);//解析token加密请求的返回结果// 使用Gson库解析JSON字符串为MapGson gson = new Gson();Map<String, Object> jsonDataMap = gson.fromJson(tokenCrypto, Map.class);Map<String, Object> dataBodyMap =null;// 检查GW_RSLT_CD是否等于"1200"Map<String, Object> dataHeaderMap = (Map<String, Object>) jsonDataMap.get("dataHeader");String gwRsltCd = (String) dataHeaderMap.get("GW_RSLT_CD");if ("1200".equals(gwRsltCd)) {// 如果GW_RSLT_CD等于"1200",则获取dataBody部分并转换为MapdataBodyMap = (Map<String, Object>) jsonDataMap.get("dataBody");System.out.println("dataBody转换为Map:" + dataBodyMap);} else {System.out.println("GW_RSLT_CD不等于1200,无法转换dataBody为Map。");}//3.获取token加密请求得到的token_version_id   site_code  token_valString tokenVersionId = dataBodyMap.get("token_version_id").toString();String siteCode = dataBodyMap.get("site_code").toString();String tokenVal = dataBodyMap.get("token_val").toString();//4.创建对称密钥  得到密钥对KeyViEntity keyViEntity = creatKeyAndVi(reqDtim, reqNo, tokenVal);String key=keyViEntity.getKey();String hmacKey = keyViEntity.getHmacKey();String iv = keyViEntity.getVi();//5.加密数据请求String requestNo = niceApiDTO.getSuperUserId();NiceKeyAndVI niceKeyAndVI = new NiceKeyAndVI();niceKeyAndVI.setKey(key);niceKeyAndVI.setVi(iv);redisCache.setCacheObject("niceAPI:"+niceApiDTO.getGameId()+":"+niceApiDTO.getSuperUserId(),niceKeyAndVI);/*  String s = MD5Utils.MD5(userId);*/String returnUrl = "https://q33.com/isCardReal?superUserId="+niceApiDTO.getSuperUserId()+"&gameId="+niceApiDTO.getGameId()+"&userId="+niceApiDTO.getUserId();logger.info("[returnUrl]<result> ======> " + returnUrl);String authType = "M";String mobileEco = "S";String businessNo = "xxxxdddeee";String methodType = "get";String popupYn = "Y";String receiveData = "xxxxdddeee";String jsonData = createRequestData(requestNo, returnUrl, siteCode, authType, mobileEco, businessNo, methodType, popupYn, receiveData);System.out.println("请求数据(reqData)的JSON构成:\n" + jsonData);String encryptedData = encryptRequestData(jsonData, key, iv);System.out.println("JSON形态的请求数据加密:\n" + encryptedData);String integrityValue = generateHmacIntegrityValue(encryptedData, hmacKey);System.out.println("生成Hmac完整校验值(integrity_value):\n" + integrityValue);//转义integrityValue=integrityValue.replace("+","%2B");String  niceApi ="https://nice.checkplus.co.kr/CheckPlusSafeModel/service.cb";String lastUrl =niceApi+"?"+"m=service"+"&token_version_id="+tokenVersionId+"&enc_data="+encryptedData+"&integrity_value="+integrityValue;logger.info("[access_token]<result> ======> " + lastUrl);return  lastUrl;}public static void main(String[] args) throws NoSuchAlgorithmException {// 获取当前时间的LocalDateTime对象LocalDateTime now = LocalDateTime.now();// 创建DateTimeFormatter对象,使用指定的格式DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMddHHmmss");// 使用DateTimeFormatter对象对LocalDateTime对象进行格式化String formattedDateTime = now.format(formatter);// 去除格式化后字符串中的非数字字符,得到"20230725162601"格式String reqDtim   = formattedDateTime.replaceAll("\\D", "");System.out.println(reqDtim);String reqNo = String.valueOf(System.currentTimeMillis());System.out.println(reqNo);//2.token加密请求String tokenCrypto = getTokenCrypto(reqDtim, reqNo);//解析token加密请求的返回结果// 使用Gson库解析JSON字符串为MapGson gson = new Gson();Map<String, Object> jsonDataMap = gson.fromJson(tokenCrypto, Map.class);Map<String, Object> dataBodyMap =null;// 检查GW_RSLT_CD是否等于"1200"Map<String, Object> dataHeaderMap = (Map<String, Object>) jsonDataMap.get("dataHeader");String gwRsltCd = (String) dataHeaderMap.get("GW_RSLT_CD");if ("1200".equals(gwRsltCd)) {// 如果GW_RSLT_CD等于"1200",则获取dataBody部分并转换为MapdataBodyMap = (Map<String, Object>) jsonDataMap.get("dataBody");System.out.println("dataBody转换为Map:" + dataBodyMap);} else {System.out.println("GW_RSLT_CD不等于1200,无法转换dataBody为Map。");}//3.获取token加密请求得到的token_version_id   site_code  token_valString tokenVersionId = dataBodyMap.get("token_version_id").toString();String siteCode = dataBodyMap.get("site_code").toString();String tokenVal = dataBodyMap.get("token_val").toString();//4.创建对称密钥  得到密钥对KeyViEntity keyViEntity = creatKeyAndVi(reqDtim, reqNo, tokenVal);String key=keyViEntity.getKey();String hmacKey = keyViEntity.getHmacKey();String iv = keyViEntity.getVi();/*        String tokenVersionId="20230727130110GF-NC49CB567-2B1HD-219H5H84A8";String  siteCode="Q0I1Njc=";String key="euAKqLokm8nOajen";String  hmacKey="euAKqLokm8nOajenHqhlvKxQVmo9Q8W5";String  iv="Q8W55Mj7LrJjW6M=";*///5.加密数据请求String requestNo = "REQ2021123199";String returnUrl = "https://papasg-korea.g-m-store.com/";String authType = "M";String mobileEco = "S";String businessNo = "xxxxdddeee";String methodType = "get";String popupYn = "Y";String receiveData = "xxxxdddeee";String jsonData = createRequestData(requestNo, returnUrl, siteCode, authType, mobileEco, businessNo, methodType, popupYn, receiveData);System.out.println("请求数据(reqData)的JSON构成:\n" + jsonData);String encryptedData = encryptRequestData(jsonData, key, iv);System.out.println("JSON形态的请求数据加密:\n" + encryptedData);String integrityValue = generateHmacIntegrityValue(encryptedData, hmacKey);System.out.println("生成Hmac完整校验值(integrity_value):\n" + integrityValue);String  niceApi ="https://nice.checkplus.co.kr/CheckPlusSafeModel/service.cb";String lastUrl =niceApi+"?"+"m=service"+"&token_version_id="+tokenVersionId+"&enc_data="+encryptedData+"&integrity_value="+integrityValue;System.out.println(lastUrl);}// 请求数据加密public static String encryptRequestData(String reqData, String key, String iv) {try {SecretKeySpec secureKey = new SecretKeySpec(key.getBytes(), "AES");Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");c.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(iv.getBytes()));byte[] encrypted = c.doFinal(reqData.trim().getBytes());return Base64.getEncoder().encodeToString(encrypted);} catch (Exception e) {e.printStackTrace();return null;}}// 生成Hmac完整校验值public static String generateHmacIntegrityValue(String encData, String hmacKey) {try {Mac mac = Mac.getInstance("HmacSHA256");SecretKeySpec sks = new SecretKeySpec(hmacKey.getBytes(), "HmacSHA256");mac.init(sks);byte[] hmacSha256 = mac.doFinal(encData.getBytes());return Base64.getEncoder().encodeToString(hmacSha256);} catch (Exception e) {e.printStackTrace();return null;}}// 封装请求数据为JSON格式public static String createRequestData(String requestNo, String returnUrl, String siteCode, String authType,String mobileEco, String businessNo, String methodType, String popupYn,String receiveData) {StringBuilder jsonBuilder = new StringBuilder();jsonBuilder.append("{").append("\"requestno\":\"").append(requestNo).append("\",").append("\"returnurl\":\"").append(returnUrl).append("\",").append("\"sitecode\":\"").append(siteCode).append("\",").append("\"authtype\":\"").append("M").append("\"").append("}");return jsonBuilder.toString();}private static String generateHmacKey(String req_dtim, String req_no, String token_val) throws NoSuchAlgorithmException {String value = req_dtim.trim() + req_no.trim() + token_val.trim();MessageDigest md = MessageDigest.getInstance("SHA-256");md.update(value.getBytes());byte[] arrHashValue = md.digest();return Base64.getEncoder().encodeToString(arrHashValue);}
}

这篇关于韩国实名认证 (手机号+身份证实名认证)niceApi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/847668

相关文章

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

【Shiro】Shiro 的学习教程(二)之认证、授权源码分析

目录 1、背景2、相关类图3、解析3.1、加载、解析阶段3.2、认证阶段3.3、授权阶段 1、背景 继上节代码,通过 debug 进行 shiro 源码分析。 2、相关类图 debug 之前,先了解下一些类的结构图: ①:SecurityManager:安全管理器 DefaultSecurityManager: RememberMeManager:实现【记住我】功能

Python批量读取身份证信息录入系统和重命名

前言 大家好, 如果你对自动化处理身份证图片感兴趣,可以尝试以下操作:从身份证图片中快速提取信息,填入表格并提交到网页系统。如果你无法完成这个任务,我们将在“Python自动化办公2.0”课程中详细讲解实现整个过程。 实现过程概述: 模块与功能: re 模块:用于从 OCR 识别出的文本中提取所需的信息。 日期模块:计算年龄。 pandas:处理和操作表格数据。 PaddleOCR:百度的

OpenStack离线Train版安装系列—3控制节点-Keystone认证服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

OpenStack Victoria版——3.控制节点-Keystone认证服务组件

3.控制节点-Keystone认证服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 创建key

贷款利率高低跟什么有关?仅凭身份证就能贷到款?额度是多少?

在金融的广阔舞台上,借款人的“信用基石”——即其综合资质,是决定贷款利率高低的决定性因素。这并非偶然,而是银行基于详尽的风险评估与收益预期所做出的精准判断。 需明确的是,贷款的易得性并不意味着无门槛的放任。它更像是设置了一个更为宽泛的准入标准,让多样化的借款人能够有机会尝试,但能否真正获得贷款,还需依据个人的经济实力、职业稳定性及信用历史的纯净度来综合评判。银行的核心考量始终在于确保资金的安

win10系统下openssl证书生成和单向认证

文章目录 前言一、安装openssl二、创建证书目录和必要文件1、创建sslcertTest文件夹2、创建openssl.cnf文件3、创建必要文件 三、创建密钥和证书1、创建根证书私钥ca.key2、创建根证书请求文件ca.csr3、创建自签根证书ca.crt4、创建服务端私钥server.key5、创建服务端证书请求文件server.csr6、创建自签服务端证书server.crt 四、

亚信安慧AntDB数据库与华为DPA数据保护一体机完成兼容性互认证,共筑数据安全与效率新高地

近日,湖南亚信安慧科技有限公司(简称“亚信安慧”)与华为技术有限公司(简称“华为”)完成了亚信安慧AntDB数据库与华为DPA数据保护一体机兼容性互认证。 图1:华为DPA数据保护一体机兼容性互认证 亚信安慧AntDB数据库作为领先的数据库解决方案提供商,专注于数据库产品的研发与创新,以其卓越的性能和稳定性,服务于超数亿用户,连续十年无故障运行。亚信安慧AntDB数据库的云原生分布式架