tosspay구현하기 2 (springboot)

2024. 7. 24. 14:54Springboot-React

application.properties

spring.application.name=spring-tosspay-backend

#서버 포트
server.port=4000

#toss server.js에서 위젯, api 시크릿 키 가져오기
widgetSecretKey = 위젯시크릿키
apiSecretKey = api시크릿키

#db 연결 코드 작성
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521/xe
spring.datasource.username=kh_workbook
spring.datasource.password=kh1234

 

AuthorizationController

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

//인증키 확인 후 전송하는 코드
@RestController
public class AuthorizationController {

	@Value("${apiSecretKey}")
	private String apiSecretKey; //가져온 값을 담을 변수 설정
	
	//http 요청을 보내기 위해 요청 보내는 것을 담을 공간 생성
	private final RestTemplate restTemplate = new RestTemplate();
	
	//주어진 비밀키를 Base64로 인코딩해서 http 헤더에 비밀키를 가져갈 수 있도록 설정
	private String encodeSecretKey(String secretKey) {
		return "Basic " + new String(Base64.getEncoder().encode(  (secretKey + ":").getBytes()  ));
	}
	
    
    //express-javascript의 app.get("/callback-auth", function (req, res) { ...
	@GetMapping("/callback-auth") 
	public ResponseEntity<?> callbackAuth(
			@RequestParam String customerKey,
			@RequestParam String code){
            
		//express-javascript의 fetch("https://api.tosspayments.com/v1/brandpay/authorizations/access-token"
		String url = "https://api.tosspayments.com/v1/brandpay/authorizations/access-token";
		
		//express-javascript의 headers
		HttpHeaders headers = new HttpHeaders();
		headers.set("Authorization", encodeSecretKey(apiSecretKey));
		headers.set("Content-Type", "application/json");
		
		//express-javascript의 body: JSON.stringfy
		Map<String, String> requestBody = Map.of(
	        	"grantType", "AuthorizationCode",
	        	"customerKey", customerKey,
	        	"code", code
		);
		/*
		Map<String, String> map = Map.of(
	        	"key 1", "val 1",
	        	"key 2", val 2,
	        	"key 3", val 3
				);
		*/
        
		HttpEntity<Map<String, String>> entity = new HttpEntity<>(requestBody, headers);
		// = .then(async function (response) 
		//HttpEntity : http 요청의 본문과 요청사항이 담긴 headers를 가져와서 한 번에 전달
		
		ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, entity, Map.class);
		// = const result = await response.json();
		
		//응답에 대한 실패 / 성공 결과가 담긴 내용을 전달
		return new ResponseEntity<>(response.getBody(), response.getStatusCode());
		// = res.status(response.status).json(result);
	}

 

** 스프링부트에서 application.properties에서 작성한 값을 가져오기 위해 @Value 어노테이션 사용
@Value("${application.properties에 작성한 변수명}")

 

** Base64 : 사람이 작성한 데이터를 컴퓨터가 읽을 수 있는 텍스트 형식으로 변환하는 객체
ex) Hello라고 작성한 내용을 Base64를 이용해 인코딩하면
사람언어 : Hello / 컴퓨터언어 : SGVsbG8=

 

** Map.of() : Map 객체 안에 있는 of라는 기능
  -  of : 가져온 값을 추가하거나 제거할 수 없도록 설정. -> 가져온 값이 손상되지 않도록 보호

 

** ResponseEntity<Map> response = restTemplate.exchange(url, HttpMethod.POST, entity, Map.class);
    - url : 요청을 보낼 주소값 가져옴
    - HttpMethod.POST : 값을 어떻게 쓸지 http메서드로 전달(get, post, put, delete)
    - entity : 코드를 작성한 목적이 담긴 내용물과 제목 -> 요청사항이 담긴 내용
    - Map.class : 응답받을 데이터 타입을 지정 -> 응답을 key-value로 받아서 가짐

 

 

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

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