logo

포럼

카카오페이 api 관련 문의

package com.example.syFinal.global.controller;

import java.net.URI;
import java.net.URISyntaxException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

import com.example.syFinal.global.model.KakaoPayApprovalDTO;
import com.example.syFinal.global.model.KakaoPayReadyDTO;

import lombok.extern.java.Log;

@Service
@Log
public class KakaoPay {
private static final String HOST = “https://open-api.kakaopay.com”;

	KakaoPayReadyDTO KakaoPayReadydto;
	
	KakaoPayApprovalDTO KakaoPayApprovaldto;

	public String kakaoPayReady() {
		RestTemplate restTemplate = new RestTemplate();
			
		// 서버로 요청할 Header
	    HttpHeaders headers = new HttpHeaders();
	    headers.add("Authorization", "SECRET_KEY "+ "DEV8EE89A70B1064CFFE0AB3965B3982D09800D1");
	    headers.add("Content-Type", "APPLICATION/JSON;charset=UTF-8");
	    
	    // 서버로 요청할 Body
	    MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
	    params.add("cid", "TC0ONETIME");
	    params.add("partner_order_id", "1001");
	    params.add("partner_user_id", "testuser");
	    params.add("item_name", "test");
	    params.add("quantity", "1");
	    params.add("vat_amount", "1500");
	    params.add("total_amount", "2000");
	    params.add("tax_free_amount", "1500");
	    params.add("approval_url", "https://localhost:3000/kakaoSuccess");
	    params.add("cancel_url", "https://localhost:3000/kakaoCancel");
	    params.add("fail_url", "https://localhost:3000/kakaoFail");
	    
	    HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<MultiValueMap<String, String>>(params, headers);
	    
	    //System.out.println("body===="+body);
	    
	    try {
	    	KakaoPayReadydto = restTemplate.postForObject(new URI(HOST + "/online/v1/payment/ready"), body, KakaoPayReadyDTO.class);
	        
	        log.info("" + KakaoPayReadydto);
	        
	        return KakaoPayReadydto.getNext_redirect_pc_url();
	
	    } catch (RestClientException e) {
	        e.printStackTrace();
	    } catch (URISyntaxException e) {
	        e.printStackTrace();
	    }
	    
	    
	    return "kakaoPay";
	    
	}
	public KakaoPayApprovalDTO kakaoPayInfo(String pg_token) {
		 
        log.info("KakaoPayInfoVO............................................");
        log.info("-----------------------------");
        
        RestTemplate restTemplate = new RestTemplate();
 
        // 서버로 요청할 Header
        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "SECRET_KEY "+ "DEV8EE89A70B1064CFFE0AB3965B3982D09800D1");
	    headers.add("Content-Type", "APPLICATION/JSON;charset=UTF-8");
 
        // 서버로 요청할 Body
        MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
        params.add("cid", "TC0ONETIME");
        params.add("tid", KakaoPayReadydto.getTid());
        params.add("partner_order_id", "1001");
        params.add("partner_user_id", "testuser");
        params.add("pg_token", pg_token);
        params.add("total_amount", "2000");
        
        HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<MultiValueMap<String, String>>(params, headers);
        
        try {
        	KakaoPayApprovaldto = restTemplate.postForObject(new URI(HOST + "/online/v1/payment/approve"), body, KakaoPayApprovalDTO.class);
            log.info("" + KakaoPayApprovaldto);
          
            return KakaoPayApprovaldto;
        
        } catch (RestClientException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        
        return null;
    }

}

/////에러창

org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: “{“extras”:null,“error_message”:“invalid param(cid has invalid value)”,“error_code”:-400}”


리액트 화면에서 카카오페이 버튼 클릭 후 결제창이 뜨는 코드를 구현했습니다.
(서버-스프링부트, 프론트단-리액트)

params와 headers를 넣은 body를 콘솔에 찍었을땐 데이터가 나옵니다.

그런데 계속 400 Bad Request: “{“extras”:null,“error_message”:“invalid param(cid has invalid value)”,“error_code”:-400}” 에러가 납니다. 어디가 문제인가요…

안녕하세요. 카카오페이 입니다.

거절발생되는 응답값은 카카오페이에서 CID값 인식이 안될때 발생하는 거절사유입니다.

정확한 확인을 위해 dev secret_key 정보 알려주시면 카카오페이 유입정보 확인후 안내드리도록 하겠습니다.

일반적으로 필드구조에 [] 대괄호가 포함될 경우 CID 인지가 안되는 경우가 생각보다 많았습니다.

참고부탁드립니다.

감사합니다.

DEV8EE89A70B1064CFFE0AB3965B3982D09800D1 입니다.

안녕하세요. 카카오페이입니다.

전달주신 정보로는 body 내의 필드의 값을 array[] 로 세팅해서 발생한 에러인것 같습니다.
다시한번 확인해주시기 바랍니다.

Can not deserialize instance of java.lang.String out of START_ARRAY token at [Source: {"cid":["TC0ONETIME"],"partner_order_id":["1"],"partner_user_id":["1"],"item_name":

감사합니다.