포트원 인증 결제
인증 결제란
인증결제는 신용카드 결제시 PG사로 부터 결제에 대한 인증 결과 수신 이후 해당 인증키로 결제를 요청하는 결제 방식을 지칭합니다. 국내에서 제일 많이 볼수 있는 결제방식으로 결제 주문페이지에서 결제가 요청되면 각 PG사의 결제창이 활성화되고 그후 고객이 선택한 카드사에 따른 카드사 전용 결제모듈에서 인증이 완료되면 해당 인증값을 바탕으로 결제를 요청하는 흐름으로 결제가 진행됩니다.
인증 결제 필요성에 대해
본인이 이해한 바로는
"악성 유저가 가격(금액)을 바꿔서 결제할 수 있기 때문에
인증 결제가 필요함"
처음엔 잘 이해가 되지 않음
"이걸 어떻게 바꿔서 결제한다는 말이지?" 라고 생각했지만
테스트 중에 발견한 버그가 있음
이런 이유때문에 인증결제가 필요함
포트원 사전 등록 시
토큰이 필요
"API 토큰은 특정 사용자를 식별하는 포괄적인 데이터를 포함하는 일련의 코드"
참고
https://developers.portone.io/api/rest-v1/auth?v=v1#post%20%2Fusers%2FgetToken
API-포트원
api.iamport.kr
PortOne REST API - V1
imp_key, imp_secret 인증에 실패한 경우
developers.portone.io
토큰 발급 받기
// 토큰 발급 요청 메서드
public static PaymentInfo portOne_token(PaymentInfo paymentInfo) {
// PaymentInfo 객체를 생성하여 결과를 저장할 준비
paymentInfo = new PaymentInfo();
// HTTP 요청 빌더를 사용하여 API 요청 생성
HttpRequest request = HttpRequest.newBuilder()
// IAMPORT API의 토큰 요청 URI 설정
.uri(URI.create("https://api.iamport.kr/users/getToken"))
// 요청 헤더에 JSON 형식으로 전송할 것임을 명시
.header("Content-Type", "application/json")
// POST 방식으로 요청하며, 본문에 인증키와 비밀키를 JSON 형태로 포함
.method("POST", HttpRequest.BodyPublishers.ofString("{\"imp_key\":\"" + IMP_KEY + "\",\"imp_secret\":\"" + IMP_SECRET + "\"}"))
.build(); // 요청 객체 완성
HttpResponse<String> response = null; // 서버로부터의 응답을 저장할 변수 초기화
// 요청을 보내고, 응답을 문자열 형식으로 받음
response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
imp_key : API키
imp_secret : API 비밀키
httpbuilder를 사용
참고 자료를 보면 템플릿화 되어있음(JAVA가 아닌 언어도 확인할 수 있음)
사전 등록 및 사전 등록 조회
사전 등록
// 사전 검증 등록 메서드
public static boolean prepare(PaymentInfo paymentInfo) {
// HTTP 요청을 생성하기 위한 빌더 사용
HttpRequest request = HttpRequest.newBuilder()
// 사전 검증 등록을 위한 API URL 설정
.uri(URI.create("https://api.iamport.kr/payments/prepare"))
// 요청 헤더에 JSON 형식으로 전송할 것임을 명시
.header("Content-Type", "application/json")
// Bearer 토큰을 포함한 인증 헤더 설정
.header("Authorization", "Bearer " + paymentInfo.getToken())
// POST 방식으로 요청하며, 본문에 merchant_uid와 amount를 JSON 형태로 포함
.method("POST", HttpRequest.BodyPublishers.ofString("{\"merchant_uid\":\"" + paymentInfo.getMerchant_uid() + "\",\"amount\":" + paymentInfo.getAmount() + "}"))
.build(); // 요청 객체 완성
HttpResponse<String> response = null; // 서버로부터의 응답을 저장할 변수 초기화
// HTTP 요청을 보내고 응답을 받는 과정
try {
// 요청을 보내고, 응답을 문자열 형식으로 받음
response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
사전 등록 조회
// 사전 검증 조회 메서드
public static PaymentInfo prepareReult(PaymentInfo paymentInfo) {
// HTTP 요청을 생성하기 위한 빌더 사용
HttpRequest request = HttpRequest.newBuilder()
// merchant_uid와 token을 포함한 URL 설정
.uri(URI.create("https://api.iamport.kr/payments/prepare/"+paymentInfo.getMerchant_uid()+"?_token="+paymentInfo.getToken()))
.header("Content-Type", "application/json") // 요청 헤더 설정
.method("GET", HttpRequest.BodyPublishers.ofString("{}")) // GET 요청
.build(); // 요청 객체 완성
HttpResponse<String> response = null; // 서버로부터의 응답을 저장할 변수 초기화
// HTTP 요청을 보내고 응답을 받는 과정
try {
// 요청을 보내고, 응답을 문자열 형식으로 받음
response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
사전 등록 후
사전 등록 조회를 통해
등록된 금액으로 결제를 진행함 == 결제 안전성을 높일 수 있음
놀이터를 이용하면
먼저 API 요청을 보내보고
응답을 확인할 수 있음
위 링크들을 참고하면 비교적 쉽게 결제 API를 완성할 수 있음
'javaboiii의 Web' 카테고리의 다른 글
API - OpenAi Assistant API (feat.JAVA) - 사용하기 (0) | 2024.11.06 |
---|---|
API - OpenAi Assistant API (feat.JAVA) - 사전 준비 (2) | 2024.11.05 |
포트원 결제 API - 1 (1) | 2024.09.06 |
Web - 구글 이메일 API (0) | 2024.09.05 |
Web - 필터(Filter) (0) | 2024.09.05 |