네이버페이는 테스트 결제 X
카카오페이 테스트 결제 O
카카오페이 테스트 연결 및 구현
1. 카카오페이 개발자 센터가서 애플리케이션 생성 및 사이트 도메인 local 생성
2. 기본 정보 Secrey key(dev)를 발급 후 테스트로 사용
3. 서비스와 컨트롤러 구현 후 postman으로 결과값 확인
카카오페이 API에 요청을 보낼때 통신 도구가 필요한데 그것을 RestTemplate을 이용해서 보낼 것.
AppConfig를 만들어서 Spring 설정 필요한 도구 만들어줌.
RestTemplate은 여러 곳에서 쓸 수 있어서 AppConfig에서 사용하면 편함
더 자세하게 설명하면
@Configuration은 설정 클래스로 이 클래스안에 있는 메서드들이 Bean으로 등록되도록 도와줌
@Bean으로 등록되어 있는 객체를 생성 후 관리
Spring은 애플리케이션 실행할 때 ApplicationContext라는 객체를 만듦(빈을 생성하고 관리하는 대부분의 작업)
감지해서 @Configuration을 이용하여 중앙에서 관리하는 객체로 등록하여 코드의 재사용성과 유연성이 크게 증가
하나 더 알고 가야 할 것
HttpEntity는 HTTP 요청이나 응답의 본문(body)와 헤더(headers)를 함께 관리하는 객체,이 객체는 요청을 보낼 때나 응답을 받을 때 사용
header만 이용하면 본문이 없는 요청이 됨 (body)까지 포함하기 위해 HttpEntity 필요.
package com.trans.translateapp.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
@Service
public class KakaoPayService {
@Autowired
private RestTemplate restTemplate; //RestTemplate객체를 자동으로 주입 , REST API 호출을 수행하기 위한 객체를 사용
// static : 이 필드는 클래스 레벨에서 존재하며 , 클래스의 모든 인스턴스에 공유 -> 모든 인스턴스 공유 메모리 절약
// final : 상수 한번 할당 , 이후 변경 X -> 명확 코드 가독성
private static final String KAKAO_PAY_READY_URL = "https://open-api.kakaopay.com/online/v1/payment/ready"; // 결제 준비 요청을 보내는 URL 상수로
@Value("${kakao.api.secret.key}") // application.properties에 키에 해당하는 값 주입
private String SECRET_KEY; // 테스트 SECRET_KEY 실제 API는 DOMAIN필요 발급
public Map<String, Object> kakaoPayReady() {
HttpHeaders headers = new HttpHeaders(); // HTTP 요청 헤더를 설정하기 위해 객체 생성
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "SECRET_KEY " + SECRET_KEY); // Authorization 헤더 설정
// 요청 본문 작성 (예제 데이터)
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("cid", "TC0ONETIME"); // 가맹점 코드 (테스트용)
requestBody.put("partner_order_id", "order_id_1234");
requestBody.put("partner_user_id", "user_id_1234");
requestBody.put("item_name", "Test Item");
requestBody.put("quantity", 1);
requestBody.put("total_amount", 1000);
requestBody.put("vat_amount", 0);
requestBody.put("tax_free_amount", 0);
requestBody.put("approval_url", "https://localhost:8080/kakaoPaySuccess");
requestBody.put("cancel_url", "https://localhost:8080/kakaoPayCancel");
requestBody.put("fail_url", "https://localhost:8080/kakaoPayFail");
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers); // 요청 본문과 헤더를 포함하는 HttpEntity 객체를 생성
try {
ResponseEntity<Map> response = restTemplate.exchange( // restTemplate
KAKAO_PAY_READY_URL, // 카카오 API HTTP 요청을 보내는 것
HttpMethod.POST, // POST 메서드를 사용해서
requestEntity,
Map.class // 응답본문을 MAP으로 하라는 것
);
if (response.getStatusCode() == HttpStatus.OK) { // 응답 상태코드가 OK면 본문을 반환 시키고 그 외는 예외처리
return response.getBody();
} else {
throw new RuntimeException("Failed to call KakaoPay API: HTTP status " + response.getStatusCode());
}
} catch (HttpClientErrorException e) {
// 에러 처리
throw new RuntimeException("Failed to call KakaoPay API: " + e.getMessage(), e);
}
}
}
'SpringBoot' 카테고리의 다른 글
SpringBoot : OCR 화면 번역 프로그램 만들기 ( API 사용 ) (0) | 2024.07.11 |
---|---|
[스프링부트] Hiberante 설정 , db연결 , 열거형 패키지 생성 (0) | 2022.04.18 |
[스프링 부트] MYSQL 테이블 CREATE , SHOW , JPA 사용 이유 (0) | 2022.04.13 |
[스프링 부트] @RestController , application.properties , mapping , target 파일 (0) | 2022.04.12 |