아임포트 사용하기

2 minute read

아임포트란?

아임포트 개발자를 위한 무료 결제연동 서비스

라고 이름 붙인 것처럼 결제 기능을 구축할 때 사용하기에 아주 좋은 서비스이다.
구현하다가 모르는게 생기면 메일이나 전화로 물어보는데, 하루정도 기다릴 여유가 있다면 메일을 추천한다.
왜냐하면 이미지 등을 첨부해서 아주 상세하게 보내주시기 때문이다.

아임포트 공식홈페이지

공식 홈페이지에서 여러 설명을 볼 수 있겠지만, 기본적으로 하나의 pg사를 연결하는 것은 무료다. 2개 이상 이용할 때 서비스 이용요금을 내면된다.
언어별 클라이언트 모듈을 제공하기 때문에 백엔드 언어가 무엇이든간에 쉽게 구현할 수 있다.

아임포트 연결하기

공식 문서확인
연결할 때 참고할 Docs가 아주 잘 되어있어서 계속 읽다 보면 결제 기능을 넣을 수 있다.
또한 읽다가 이해가 안되는 부분이나 막히는 부분에서 고객센터에 도움을 받으면 된다.

  1. 제이쿼리 && 아임포트 라이브러리 추가하기
  2. 가맹점 번호 전달
  3. 버튼 만들고, 클릭시 주문번호 만들고 결제창 띄우기

    주문번호는 고유해야 한다. 그러니 랜덤문자 및 오늘의 날짜 등으로 조합해서 만들면된다.

  4. 결제하기 버튼 누르고 결제하기를 누르면 정보를 보낸다.
  5. 아임포트를 통해서 결제가 된 후 결과가 “/payments/complete” 등 우리가 설정한 url로 온다.
  6. “/payments/complete”로 결제 정보가 올 때 토큰 인증을 하고, 결제 되어야 하는 금액과 실제 결제 금액을 확인한다.
  7. 결제 성공이나 결제 실패시에 따른 로직을 처리한다.

위의 순서로 진행한다고 생각하면 된다.
Node.js의 express를 주로 활용하다 보니 Docs가 아주 맘에 들었다.

연결시 헷갈렸던 부분 정리

진행 시에 헷갈렸던 부분들이 있는데 다음에도 계속 연결해야할 일이 있을 것 같아서 정리해두려고 한다.


금액이 틀릴경우(금액변조가 일어났을 때) 처리 방법

결제해야할 금액과 결제되는 금액이 다르면 실제로 결제가 안되는 것이 맞다고 생각하는데,
아임포트쪽에서 결제를 하고 결과를 보내주는 것이기 때문에 결제가 된 결과가 온다.

if (amount === amountToBePaid) {
  // 결제 금액 일치. 결제 된 금액 === 결제 되어야 하는 금액
  // 결제 성공시에 진행해야할 로직 그대로 진행
} else {
  // 결제 금액 불일치. 위/변조 된 결제
  throw { status: "forgery", message: "위조된 결제시도" };
  //에러를 띄우지만 현재 상태는 결제가 되어있는 상태다.
  //즉 10,000을 1,000으로 수정해서 결제했다면 일단 1,000이 결제되어 있는 상태인 것이다.
}

해당 상황에서 아임포트 측에 문의를 했고, 답변은 우리 상황에 따라 다르다는 답변을 받았다.
상대가 일부러 금액을 바꿔서 우리에게 피해를 입히려고 한 것이기 때문에 물건을 보내지 않고, 환불처리도 안해준다면
당연히 환불 때문에 우리 고객 센터에 연락이 올 것이라는 것이다. 또 그게 아니라면 금액이 다를 경우 자동으로 환불처리 되도록 코드를 진행하면
된다고 한다.

여러 pg사를 이용할 경우

해외 결제(페이팔, 이니시스), 국내 결제(이니시스)를 진행하다 보니 문제가 생긴 부분이다.

IMP.request_pay(
  {
    // param
    pg: "inicis",
    pay_method: "card",
    merchant_uid: "ORD20180131-0000011",
    name: "노르웨이 회전 의자",
    amount: 64900,
    buyer_email: "gildong@gmail.com",
    buyer_name: "홍길동",
    buyer_tel: "010-4242-4242",
    buyer_addr: "서울특별시 강남구 신사동",
    buyer_postcode: "01181",
  },
  cb
);

아임포트의 예시이다. 해외결제든 국내 결제든 주소, 가격 등은 똑같아진다. 즉 pg사나 pg 사에 따른 약간의 추가적인 부분만 달라지는데
맨처음은 이부분을 미리 객체를 만들고 … 을 이용해 값을 넣으려고 했다.

let update = {
  //정보를 받아와서 update 객체를 만든다.
  pg: paypal,
};
IMP.request_pay(
  {
    // param
    ...update, // update에 있는 값을 여기에 넣으려고 했다.
    pay_method: "card",
    merchant_uid: "ORD20180131-0000011",
    name: "노르웨이 회전 의자",
    amount: 64900,
    buyer_email: "gildong@gmail.com",
    buyer_name: "홍길동",
    buyer_tel: "010-4242-4242",
    buyer_addr: "서울특별시 강남구 신사동",
    buyer_postcode: "01181",
  },
  cb
);

그런데 생각대로 잘 되지 않아서 문의해보니 직접 값을 줘야 한다고 해서, 각 버튼마다 이벤트 핸들러를 만들었다.

m_redirect_url

IMP.request_pay({
      /* ...중략... */,
      m_redirect_url: "https://www.myservice.com/payments/complete/mobile"
  },

위처럼 모바일 웹 환경일 경우 m_redirect_url값을 전달해줘야 한다. 페이팔은 필수적으로 전달이다.
해당 pg사로 리다이렉트 되어 결제가 진행되기 때문인데, 절대경로로 입력해야하는 것을 잊지말자.

Leave a comment