payment/iamport

5BRack·2022년 9월 29일

백엔드 로드맵

목록 보기
14/28

iamport

  • pg란 PaymentGateway의 약자이며, 온라인상으로 결제대행을 해주는 서비스
  • import는 그런 pg서비스를 제공하며 결제 기능 사용을 위한 api를 제공
  • import가 결제를 대행하기 때문에 직접 카드사와 소통할 필요가 없다.
  • 일반결제, 정기결제, 결제환불 기능을 제공하며, Rest API를 이용한다.

RRES API ACCESS TOKEN

  • 결제 정보와 같은 사적 리소스에 접근권한을 얻으려면, 가맹점은 accesstoken을 발급받아서 아임포트 REST API요청에 포함해야 하며 토큰 발급은 서버사이드에서 진행되어야 한다.

사용예시

  • 반드시 imp_key 와 imp_secret 는 환경변수 파일에 저장해야한다.(보안)
async getAccessToken() {
    try {
      const getToken = await axios({
        url: 'https://api.iamport.kr/users/getToken',
        method: 'post', // POST method
        headers: { 'Content-Type': 'application/json' }, // "Content-Type": "application/json"
        data: {
          imp_key: process.env.IAMPORT_APIKEY, // REST API키
          imp_secret: process.env.IAMPORT_APISECRET,
        },
      });
      const { access_token } = getToken.data.response;
      return access_token;
    } catch (error) {
      console.log(error);
    }
  }

  async inquiryPaymentDetails({ imp_uid, access_token }) {
    // imp_uid로 아임포트 서버에서 결제 정보 조회
    try {
      const getPaymentData = await axios({
        url: `https://api.iamport.kr/payments/${imp_uid}`, // imp_uid 전달
        method: 'get', // GET method
        headers: { Authorization: access_token }, // 인증 토큰 Authorization header에 추가
      });
      const paymentData = getPaymentData.data.response; // 조회한 결제 정보
      return paymentData;
    } catch (error) {
      console.log(error);
    }
  }

  async cancelPayment({ impUid, accessToken, reason, amount, checksum }) {
    try {
      // imp_uid로 아임포트 서버에서 결제 취소 요청
      const getCancelData = await axios({
        url: 'https://api.iamport.kr/payments/cancel',
        method: 'post',
        headers: {
          'Content-Type': 'application/json',
          Authorization: accessToken, // 아임포트 서버로부터 발급받은 엑세스 토큰
        },
        data: {
          reason, // 가맹점 클라이언트로부터 받은 환불사유
          imp_uid: impUid, // imp_uid를 환불 `unique key`로 입력
          amount: amount, // 가맹점 클라이언트로부터 받은 환불금액
          checksum: checksum, // [권장] 환불 가능 금액 입력
        },
      });
      console.log(getCancelData.data);
      return getCancelData.data; // 환불 결과
    } catch (error) {
      console.log(error);
    }
  }

Iamport 간단 결제 시스템 flow

  1. 클라이언트에서 직접 iamport 결제 시스템을 호출
  2. 호출된 결과를 클라이언트에서 im_Uid와 결제된 금액을 매개변수로 서버에 api요청
  3. 서버단에서 iamport 토큰 발급 후 해당 im_Uid와 토큰을 이용하여 결제 내역 검증
  4. 검증된 내용을 DB에 저장

0개의 댓글