tosspay구현하기 2 (springboot)
2024. 7. 24. 14:54ㆍSpringboot-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 |