본문 바로가기
회고

TIL_211203

코동이 2021. 12. 4.

1. Facts(사실, 객관)

 

- 일시불 및 환불 나이스페이 구동방식 분석

- 프로젝트 계정관련 서비스 테스트 개선 완료

 

2. Feelings(느낌, 주관)

 

나이스페이 일시불 결제와 환불 API 문서 및 코드를 분석했습니다. 나이스페이 일시불 결제와 환불 프로세스의 큰 차이점은 결제의 경우 인증요청과 승인요청까지 총 2번이 있다는 것입니다. 인증요청은 고객이 입력한 값과 상점정보에 관여하고, 이후에 실제로 결제승인을 위한 요청을 합니다. 중간에 오류로 인해 취소가 될 수 있는데, 각 경우에 취소되었다는 API를 전송해서 환불을 받을 수 있어야 합니다. 환불 요청은 승인요청 1개만 있으며, 이전에 결제시 가지고 있던 정보로 요청을 합니다. 따라서, 승인요청 시 각 과정 결과값을 로그테이블에 남겨두어야 환불시에나, 문제가 생겼을 때 확인이 가능합니다. jsp 샘플을 보면 친절하게 서버 통신 코드, Json -> HashMap 변환코드가 있어서 구현에는 크게 어려움이 없습니다.

 

3. Findings (배운 점)

 

나이스페이 결제 방법

 

출처 : https://developers.nicepay.co.kr/manual-auth.php

 

json을 HashMap으로 변환하는 코드는 다음과 같다. 

 

	//JSON String -> HashMap 변환
	public static HashMap jsonStringToHashMap(String str) {
		HashMap dataMap = new HashMap();
		JSONParser parser = new JSONParser();
		
		try{
			Object obj = parser.parse(str);
			JSONObject jsonObject = (JSONObject)obj;

			Iterator<String> keyStr = jsonObject.keySet().iterator();
			while(keyStr.hasNext()){
				String key = keyStr.next();
				Object value = jsonObject.get(key);
				
				dataMap.put(key, value);
			}
		}catch(Exception e){
			
		}
		return dataMap;
	}

 

JSONParser를 이용해 json문자열을 Object로 받고 다시 이 Object를 JSONObject로 형변환한다.

이름 그대로, json 문자열을 JSONObject라는 자바 Object 객체로 변환시키는 것이다.

JSONObject 객체가 되었으므로, interator로 순회하면서 key, value를 얻어내어 HashMap에 저장한다.

 

server 통신으로 API를 호출하는 코드는 다음과 같다.

 

public String connectToServer(String data, String reqUrl) throws Exception{
		HttpURLConnection conn 		= null;
		InputStreamReader isr		= null;
		BufferedReader resultReader = null;
		PrintWriter pw 				= null;
		URL url 					= null;
		
		int statusCode = 0;
		StringBuffer recvBuffer = new StringBuffer();
		try{
			url = new URL(reqUrl);
			
			conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			conn.setConnectTimeout(3000);
			conn.setReadTimeout(5000);
			conn.setDoOutput(true);
			
			pw = new PrintWriter(conn.getOutputStream());
			pw.write(data);
			pw.flush();
			
			statusCode = conn.getResponseCode();
			isr = new InputStreamReader(conn.getInputStream(), "euc-kr");
			resultReader = new BufferedReader(isr);
			
			for(String temp; (temp = resultReader.readLine()) != null;){
				recvBuffer.append(temp).append("\n");
			}
			
			if(!(statusCode == HttpURLConnection.HTTP_OK)){
				throw new Exception();
			}
			
			return recvBuffer.toString().trim();
		}catch (Exception e){
			e.printStackTrace();
			return "9999";
		}finally{
			CommonUtil.closeables(resultReader, isr, pw);
			try{
				if(conn != null) {
					conn.disconnect();
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}

 

HttpURLConnection을 사용하여 server에 data를 전송할 것이다. PrintWriter로 data를 보내고, InputStreamReader로 응답을 받아 다시 BufferedReader에 저장한다. 이 안에 있는 응답 정보들을 문자열로 리턴한다.

 

4. Affirmation (자기 선언)

나는 API 연동을 위해서 해당 코드와 구동방식을 분석하고 이해하는 사람이다.

반응형

'회고' 카테고리의 다른 글

TIL_211206  (0) 2021.12.07
TIL_211205  (0) 2021.12.06
TIL_211202  (0) 2021.12.03
TIL_211201  (0) 2021.12.01
TIL_211130  (0) 2021.12.01