팀 프로젝트의 주제가 간식 구독 서비스이기 때문에 정기결제 기능을 구현하는 것은 필수이다. 프로젝트 시작 전 구글 서치를 통해 테스트 모드를 지원하는 결제 관련 API들을 쉽게 찾을 수 있었기 때문에 정기결제를 구현하는데 크게 어려움은 없을 것이라고 생각했다. 아임포트에서 제공하는 관련 API들을 사용하기로 결정했다. 그러나 아임포트 서버로 요청을 보내는 과정에서 여러 문제에 직면했고 약간의 시행착오 끝에 현재는 아임포트 서버로 요청을 보내고 응답을 받는 것까지 성공하였다. 스프링부트에서 아임포트 API를 사용하는데 기초적인 어려움을 겪는 분들께 조금이나마 도움이 되었으면 좋겠다.
1. 빌링 키 요청
사실 정기결제가 아닌 일반결제 구현은 정말 너무나도 간단하다. 아임포트 서버로 따로 요청을 보낼 필요도 없기 때문이다. 그러나 정기결제를 구현하려면 약간 복잡해진다. 우선 정기결제에 필요한 빌링 키 발급 단계가 있다. 이 단계는 일반결제와 거의 다를게 없기 때문에 큰 문제는 없다. 다만 정기결제의 경우 해당 customer에게 여러 번 결제 요청을 해야한다. 이때, customer_uid와 빌링키가 1대1로 대응하며 사용자가 요청한 정기결제 내역을 찾는다. 그러나 merchant_uid는 각 결제 건에 대한 주문번호이기 때문에 결제 요청을 보낼 때마다 다른 값이어야 한다.
// IMP.request_pay(param, callback) 호출
IMP.request_pay({ // param
pg: "html5_inicis",
pay_method: "card", // "card"만 지원됩니다
merchant_uid: "issue_billingkey_monthly_0001", // 빌링키 발급용 주문번호
customer_uid: "gildong_0001_1234", // 카드(빌링키)와 1:1로 대응하는 값
name: "최초인증결제",
amount: 0, // 0 으로 설정하여 빌링키 발급만 진행합니다.
buyer_email: "gildong@gmail.com",
buyer_name: "홍길동",
buyer_tel: "010-4242-4242",
buyer_addr: "서울특별시 강남구 신사동",
buyer_postcode: "01181"
}, function (rsp) { // callback
if (rsp.success) {
// 빌링키 발급 성공
} else {
// 빌링키 발급 실패
}
});
2. 토큰 발급받기
빌링키 발급에 성공하면 아임포트 관리자 페이지에서 해당 건이 등록된 것을 확인할 수 있다.
정기결제를 구현하고자 하기 때문에 궁극적인 목표는 시스템이 알아서, 정해놓은 기간이 지나면 재결제 요청을 보내는 것이다. 그러나 아직 갈 길이 멀다. 아임포트 홈페이지나 깃허브, 문서 등을 차근차근 따라가 보자.
빌링키를 발급받은 후 해당 customer_uid에게 정기결제 요청을 보내기 위해서는 아임포트의
POST /subscribe/payments/again API를 사용해야 한다.
https://api.iamport.kr/#!/subscribe/again
API-아임포트
api.iamport.kr
아임포트에서 제공하는 REST API를 사용하기 위해서는 인증에 필요한 access_token을 발급받아야 한다.
위의 링크에서 토큰을 발급받은 후 API를 테스트해볼 수 있지만 결국 필요한 것은 우리가 구현하는 서비스 내에서 토큰을 요청하고 받아오는 것이다. 어려운 과정이었다.
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.google.gson.Gson;
@Service
public class ImportPay {
public String getToken() {
RestTemplate restTemplate = new RestTemplate();
//서버로 요청할 Header
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
Map<String, Object> map = new HashMap<>();
map.put("imp_key", "imp_key");
map.put("imp_secret", "imp_secret");
Gson var = new Gson();
String json=var.toJson(map);
//서버로 요청할 Body
HttpEntity<String> entity = new HttpEntity<>(json,headers);
return restTemplate.postForObject("https://api.iamport.kr/users/getToken", entity, String.class);
}
}
자바스크립트에서 json 데이터를 ajax를 통해 로컬 환경에서 주고받는 연습은 몇 번 해본 적 있지만 외부 서버로 요청을 보내본 적은 없어서 유독 애를 먹었던 것 같다. 위에서도 언급했듯이 브라우저에서 직접 외부 도메인으로 요청을 보내고자 시도하면 CORS 정책 위반이기 때문에 자바에서 요청을 보내야 한다. 간단하게 Rest 방식 API를 호출할 수 있는 RestTemplate를 사용하였다. 아임포트의 getToken API를 요청하기 위해서는 우선 요청의 헤더에 content-type을 지정해주어야 한다. 이를 위해 HttpHeaders 타입의 headers를 선언한 후 setContentType을 사용하여 아임포트 서버에서 원하는 형식의 content-type을 지정해준다.
다음으로 요청의 body 부분이다. 요청의 body부분은 JSON 형태여야 한다. 따라서 보내야 할 데이터들을 우선 맵을 사용하여 키와 값의 형태로 저장한다. 그 후 Gson을 사용하여 json 형식의 문자열로 변환해주면 아임포트 서버로 요청을 보낼 준비가 끝났다.
Http통신의 Header와 Body 부분을 저장할 수 있는 HttpEntity를 선언한 후 위에서 만든 headers와 json을 담아준다. getToken API는 post 방식으로 요청해야 하기 때문에 postForObject 메소드를 사용하여 url, 보낼 데이터, 그리고 응답받을 데이터의 형식을 지정하여 준다.
토큰이 정상적으로 발급되었는지는 postmapping 된 html 페이지를 컨트롤러가 요청할 때 getToken 메소드를 호출하여 log.info()를 통해 확인할 수 있다.
나머지는 이어서 작성할 예정이다.
https://tjdqlscjswp.tistory.com/78
아임포트 스프링 연동 코드 링크
예제 코드를 리뷰도 하고 공부하며 나눠서 올려보려 했는데 시간과 의지 부족으로 인해 일단 코드 링크를 올려둡니다. https://github.com/tjdqlscjswp/IMPORT_EXAMPLE GitHub - tjdqlscjswp/IMPORT_EXAMPLEContribute to
tjdqlscjswp.tistory.com
'웹 프로그래밍 > 아임포트 연동' 카테고리의 다른 글
아임포트 카카오 정기결제 스프링 연동 예제 코드 링크 (0) | 2024.08.26 |
---|---|
아임포트- 카카오 정기결제 예제코드 (14) | 2021.07.19 |
Spring boot- 아임포트 카카오 정기결제 스케줄 예약(1) (4) | 2021.07.02 |