tosspay구현하기 3 (springboot)

2024. 7. 24. 15:01Springboot-React

PaymentController

package tosspay.controller;

import java.util.Base64;
import java.util.Map;

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.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController // html 파일 url 주소값으로 연동
@RequestMapping("/confirm")
public class PaymentController {

	//application.properties에 적은 키 이름을 가져오기 위한 value
	@Value("${apiSecretKey}") //특정 키 이름을 외부나 다른 곳에서 가져와 사용할 때는 ${키이름}
	private String widgetSecretKey;
	
	@Value("${apiSecretKey}")
	private String apiSecretKey;
	
	private final RestTemplate restTemplate = new RestTemplate();
	
	private String encodeSecretKey(String secretKey) {
		return "Basic" + new String(Base64.getEncoder().encode((secretKey + ":").getBytes()));
	}
	
	//widget이라는 주소로 결제 정보가 들어오면 결제 확인 창구로 넘겨줌. 결제정보와 사용자의 비밀번호가 담겨있음
	// 위젯 -> 페이먼트, 브랜드페이 결제랑 방식이 약간 다름
	@PostMapping("/widget")
	public ResponseEntity<?> confirmWidget(@RequestBody Map<String, String> requestBody){
		return confirmPayment(requestBody, encodeSecretKey(widgetSecretKey));
	}
	
	//payment라는 주소로 결제 정보가 들어오면 결제 확인 창구로 넘겨주는 것. 결제정보와 사용자의 비밀번호가 담겨있음
	@PostMapping("/payment")
	public ResponseEntity<?> confirmPayment(@RequestBody Map<String, String> requestBody){
		return confirmPayment(requestBody, encodeSecretKey(apiSecretKey));
	}
	
	@PostMapping("/brandpay")
	public ResponseEntity<?> confirmBrandpay(@RequestBody Map<String, String> requestBody){
		return confirmBrandPayment(requestBody, encodeSecretKey(apiSecretKey));
	}
	
	private ResponseEntity<?> confirmPayment(Map<String, String> requestBody, String encodedKey){
		
		//fetch("https://api.tosspayments.com/v1/payments/confirm"
		String url = "https://api.tosspayments.com/v1/payments/confirm";
		HttpHeaders headers = new HttpHeaders();
		
		//Authorization: encryptedApiSecretKey,
		headers.set("Authorization", encodedKey);
		//"Content-Type": "application/json"
		headers.set("Content-Type", "application/json");
		
		HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
		
		ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, entity, Map.class);
		return new ResponseEntity<>(response.getBody(), response.getStatusCode());
	}
	
	private ResponseEntity<?> confirmBrandPayment(Map<String, String> requestBody, String encodedKey){
		
		//fetch("https://api.tosspayments.com/v1/brandpay/payments/confirm"
		String url = "https://api.tosspayments.com/v1/brandpay/payments/confirm";
		HttpHeaders headers = new HttpHeaders();
		
		//Authorization: encryptedApiSecretKey,
		headers.set("Authorization", encodedKey);
		//"Content-Type": "application/json"
		headers.set("Content-Type", "application/json");
		
		HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
		
		//성공 했을 때, 실패 했을 때		
		try {
			ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, entity, Map.class);
			return new ResponseEntity<>(response.getBody(), response.getStatusCode());
			
		}
		catch (Exception e) {
			//getMessage : 사용자에게 보내는 응답. 실패 메시지
			//HttpStatus.BAD_REQUEST : 잘못된 요청이라는 상태 코드 보낸 것
			return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
		}
		
	}

 

 

ResponseEntity : Http를 상속받아 Http 기능의 응답에 대한 기능을 추가로 설정한 Entity
    - 사용자가 요청한 응답을 개발자가 다시 사용자에게 전달할 때 사용
    - HttpEntity를 상속해 Http 응답에 대한 추가적인 정보를 제공.
    - 상태코드를 포함하고 있어 사용자에게 답을 보낼 때 사용
    - ResponseEntity<문자열 or 숫자 or 여러값이면 ? or 모르면 비워두기> abc = new ResponseEntity<>("응답 본문", headers);

RequestEntity : Http를 상속받아 Http 기능의 요청에 대한 기능을 추가로 설정한 Entity
    - HttpEntity를 상속해 Http 요청에 대한 추가적인 정보를 제공
    - url과 http메서드(get, post, put, delete)를 포함하고 있어 서버로 요청을 보낼 때 사용
    - RequestEntity<문자열 or 숫자 or 여러값이면 ? or 모르면 비워두기> abc = new RequestEntity<>("요청 본문", headers);
    - RequestEntity<String> abc = new RequestEntity<>("요청 본문", headers, HttpMethod.POST, url);

HttpEntity : http 요청 또는 응답의 본문(body)와 헤더(headers)를 포함하는 객체
    - http 요청을 보낼 때 본문과 헤더를 설정하고자 할 때 사용
    - 본문(body) : 실제 전송될 데이터. ex) 아이디, 비밀번호 등
    - 헤더(headers) : http 헤더 정보를 포함. ex) 어떤 파일이 들어오는가. 누가 보내는 것인가
    - HttpEntity<문자열 or 숫자 or 여러값이면 ? or 모르면 비워두기> abc = new HttpEntity<>("요청 본문", headers);

** 차이점
클래스명			상속 관계		주요 사용 목적				추가 정보
HttpEntity		기본 클래스		Http요청/응답의 본문, 헤더 포함		상태코드(성공여부) 없음
ResponseEntity		HttpEntity 상속		Http 응답 반환				상태코드(성공여부)포함
RequestEntity		HttpEntity 상속		Http 요청 전송				URI와 Http메서드 포함




** HTTP : 웹에서 데이터를 전송하기 위한 전송 수단

** URI / URL
    * URI : 주소값, 식별값이 들어 있음. URL을 포함
    * URL : URI의 한 종류. 주소이름(도메인명)

    ※ URN : 고유 식별 번호

'Springboot-React' 카테고리의 다른 글

mysql-react-springboot 연결하기 2  (0) 2024.07.26
mysql-react-springboot 연결하기 1  (0) 2024.07.26
tosspay구현하기 2 (springboot)  (0) 2024.07.24
tosspay 구현하기 1 (react)  (0) 2024.07.24
TodoList 만들기 3  (0) 2024.07.18