옹실이의 개발이야기

API

API 아임포트 결제 API : ②결제 정보 가져오기

옹실 2021. 1. 5. 21:29

결제 기능을 구현하다보면, 주문 내역을 보여주기 위해 결제 정보를 가져와야할 때가 있다.
이전에도 아임포트 API를 이용한 결제창 연결을 포스팅했었는데
전에는 정말 날 것 그대로(?) 노가다를 통해 결제 정보를 넘겨주는 방식을 포스팅했었다면,
이번에는 API에서 토큰을 받아온 후, 받아온 토큰을 이용해 결제 정보를 가져오는 기능을 포스팅해보려 한다.
이 방법은 아임포트 API에서 결제 정보를 가져오는 것이기 때문에 정보가 더 정확하다는 장점이 있다.

결제 정보를 가져오려면 토큰과 주문 번호(merchant_uid)가 필요하다.
(나는 주문 번호(merchant_uid)를 jsp > form에서 input 태그를 통해 넘겨주었다.)
구현 순서는 대략 이렇다.


1. 아임포트에서 결제 토큰 가져오기
2. 주문 번호와 결제 토큰을 이용해 결제정보 가져오기


1. 아임포트에서 결제 토큰 가져오기

토큰을 가져오려면 토큰 url과 REST API 키값, REST API secret 값이 필요하다.
REST API 키값, REST API secret 값은 이전에 결제창 연결에서 포스팅했었던 것처럼
아임포트 > 대시보드 > 로그인 > 시스템설정에서 확인할 수 있다.
개인 정보를 위해 빨간색으로 가려놓았다.

 

 

URL은 개인별로 정해진 것 없이 아래 적혀있는 url을 복사해서 쓰면 된다.
log.info로 result 값을 찍어보면 데이터가 제대로 찍히는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public static final String IMPORT_TOKEN_URL = "https://api.iamport.kr/users/getToken"
    
    public static final String KEY = "REST API 키";
    public static final String SECRET = "REST API secret";     
    // 아임포트 인증(토큰)을 받아주는 함수 
    public String getImportToken() { 
        String result = ""
        HttpClient client = HttpClientBuilder.create().build();
        HttpPost post = new HttpPost(IMPORT_TOKEN_URL); 
        Map<String,String> m =new HashMap<String,String>(); 
        m.put("imp_key", KEY); 
        m.put("imp_secret", SECRET); 
        try { post.setEntity(new UrlEncodedFormEntity(convertParameter(m))); 
            HttpResponse res = client.execute(post); 
            ObjectMapper mapper = new ObjectMapper(); 
            String body = EntityUtils.toString(res.getEntity()); 
            JsonNode rootNode = mapper.readTree(body); 
            JsonNode resNode = rootNode.get("response"); 
            result = resNode.get("access_token").asText(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        
        log.info("#################################################### TOKEN :"+result);
        return result;
    } 
cs

 

 

2. 주문 번호와 결제 토큰을 이용해 결제정보 가져오기

① 토큰, 주문 정보 가져오기

1번 메소드를 호출해 토큰을 String 타입으로 가져온 후,
주문 번호(merchant_id)도 가져와서 결제 정보를 가져오는 메소드 안에 넣어준다.

나는 여기서 Order_Info라는 vo 형태로 받았지만 메소드만 호출해도 된다.

1
2
3
4
5
6
        // 토큰 가져오기
        String token = getImportToken(); 
                
        // 결제 내역 
        String mId = order_info2.getBuyer_merid();
        Order_Info real_order_info = getPayInfo(token, mId);
cs



② 결제정보 가져오기

아래 메소드를 활용하면 resNode라는 JsonNode 안에 통으로 결제 정보가 담기는데,
나는 이걸 하나씩 분리해주기 위해
구매자, 연락처, 이메일, 주소, 상품명, 주문 번호, 가격 등 가져올 정보들을 변수에 담아 선언초기화한 후
텍스트로 변수에 하나씩 담아주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// 결제정보
    public Order_Info getPayInfo(String token, String mId) { 
        String buyer_name = "";
        String buyer_phone = "";
        String member_email = "";
        String buyer_addrStr = "";
        String buyer_postcode = "";
        String buyer_addr = "";
        String paid_at = "";
        String buy_product_name = "";
        String buyer_buyid = "";
        String buyer_merid = "";
        String amount = "";
        String buyer_card_num = "";
        String buyer_pay_ok = "";
        long buyer_pay_price = 0L;
        long paid_atLong = 0L;
        long unixTime = 0L;
        Date date = null;
        
        HttpClient client = HttpClientBuilder.create().build(); 
        HttpGet get = new HttpGet(IMPORT_PAYMENTINFO_URL + mId + "/paid"); 
        get.setHeader("Authorization", token); 
        try { 
            HttpResponse res = client.execute(get);
            ObjectMapper mapper = new ObjectMapper(); 
            String body = EntityUtils.toString(res.getEntity()); 
            JsonNode rootNode = mapper.readTree(body); 
            JsonNode resNode = rootNode.get("response"); 
            log.info("wowwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww resNode: "+resNode);
            //amount = resNode.get("amount").asText(); 
            buyer_name = resNode.get("buyer_name").asText(); 
            buyer_phone = resNode.get("buyer_tel").asText(); 
            member_email = resNode.get("buyer_email").asText(); 
            
            buyer_addrStr = resNode.get("buyer_addr").asText(); 
            buyer_postcode = resNode.get("buyer_postcode").asText(); 
            buyer_addr = buyer_addrStr+" "+buyer_postcode; //주소에 우편번호 합치기
            
            paid_at = resNode.get("paid_at").asText(); //결제시간
            buy_product_name = resNode.get("name").asText(); 
            buyer_buyid = resNode.get("imp_uid").asText(); 
            buyer_merid = resNode.get("merchant_uid").asText(); 
            amount = resNode.get("amount").asText(); 
            buyer_card_num = resNode.get("apply_num").asText(); 
            buyer_pay_ok = resNode.get("status").asText(); 
            
 
            
            log.info("++++++++++++++++++++++++++++++++++++import buyer_name: "+buyer_name);
            log.info("++++++++++++++++++++++++++++++++++++import paid_at: "+paid_at);
            
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        
        buyer_pay_price = Long.parseLong(amount);
        
        // 카드 결제 시간 - 형식 바꾸기
        paid_atLong = Long.parseLong(paid_at);
        unixTime = paid_atLong * 1000;
        date = new Date(unixTime);
        
        // 형식 바꾸기
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sdf.setTimeZone(TimeZone.getTimeZone("GMT+9")); // GMT(그리니치 표준시 +9 시가 한국의 표준시
        String buy_date = sdf.format(date);
        log.info("++++++++++++++++++++++++++++++++++++import date: "+buy_date);
        
        Order_Info order_info = new Order_Info(-1L, buyer_name, buyer_phone, member_email, 
                buyer_addr, buy_date, buy_product_name, buyer_buyid, buyer_merid, 
                buyer_pay_price, buyer_card_num, buyer_pay_ok, -1);
        
        return order_info;
    }
cs

나는 결제 정보에 카드 결제 시간까지 표기하기 위해
try~catch구문 밖에서 받아온 결제 시간의 형태를 바꿔서
Order_Info vo에 넣어준 후 order_info를 return시켰다.

 

결과 ▼

결제 후 위의 과정을 통해 결제정보를 가져와서 jsp에 쏴줬더니
결제 정보가 잘 나온 것을 확인할 수 있었다.

'API' 카테고리의 다른 글

API 아임포트 결제 API : ③환불하기  (0) 2021.01.22
API 아임포트 결제 API : ①결제창 연결하기  (0) 2020.12.29