저희는 구장 예약시에 결제 시스템을 추가해 사용자의 결제를 통해 구장을 예약할 수 있도록 하였습니다.
아임포트 설정은 다음과 같습니다.
let IMP = window.IMP;
IMP.init({가맹점 식별코드});
먼저 가맹점 식별코드를 등록해주고
해당 IMP를 이용해 **request_pay()**로 결제 정보를 전달합니다.
IMP.request_pay({
pg: "pg코드",
pay_method: "card",
merchant_uid: "결제 번호(unique로 설정해야한다)",
name: fieldName,
amount: reservationFree,
buyer_email: userInfo.email,
buyer_name: userInfo.name,
buyer_tel: userInfo.phoneNumber, //필수 파라미터
}
위 정보로 결제를 진행하고 콜백함수를 통해 결제를 검증합니다.
먼저 해당 사용자가 결제 금액을 위/변조해 설정되어있는 결제 금액보다 낮게 결제를 진행할 수 있기 때문에 결제 금액에 대해 검증해야합니다.
해당 검증은 백엔드에서 처리하게 되는데 이를 위해서는 아임포트의 의존성을 추가해줘야하는데
공식 깃허브에는 Maven 설정 밖에 기술되어 있지 않아 gradle 설정을 찾아 설정하는데 시간이 좀 걸렸습니다.
repositories {
...
maven { url '<https://jitpack.io>' }
}
dependencies {
implementation 'com.github.iamport:iamport-rest-client-java:0.2.21'
}
의존성 주입이 끝나게 되면 IamportClient를 사용해 아임포트서버로 부터 정보를 받아 올 수 있게 됩니다.
@Override
public IamportResponse<Payment> paymentLookup(String impUid) throws IamportResponseException, IOException {
iamportClient = new IamportClient(paymentProperties.getRestApiKey(), paymentProperties.getRestApiSecret());
return iamportClient.paymentByImpUid(impUid);
}
위와 같이 IamportClient에 rest_api_key와 rest_api_secret을 넣어 주면 설정이 완료됩니다.
이제 아임포트 서버의 가격 정보와 REST를 통해 받아온 가격정보가 일치여부와 DB와의 일치여부를 확인합니다.
//실제로 결제된 금액과 아임포트 서버쪽 결제내역 금액과 같은지 확인
//이때 가격은 **BigDecimal** 데이터 타입으로 주로 금융쪽에서 정확한 값표현을 위해 사용
//int형으로 비교해주기 위해 형변환 필요하다.
if(irsp.getResponse().getAmount().intValue()!=amount){
throw new VerifyIamPortException("결제 금액 위/변조: 서버");
}
//DB에서 물건가격과 실제 결제금액이 일치하는지 확인, 만약 다르면 예외 발생
if(amount != soccerFieldRepository.findById(fieldId).get().getReservationFree()){
throw new VerifyIamPortException("결제 금액 위/변조: 디비");
}
만약 가격정보가 일치하지 않다면 정의해 놓은 Exception을 발생시킵니다.