저희는 구장 예약시에 결제 시스템을 추가해 사용자의 결제를 통해 구장을 예약할 수 있도록 하였습니다.

아임포트 설정은 다음과 같습니다.

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_keyrest_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을 발생시킵니다.