최근 결제연동 서비스로 인기를 얻고 있는 아임포트는 결제연동 뿐만 아니라 계좌인증 api도 제공합니다.

현재 프로젝트에서는 수익 정산 기능을 위한 계좌의 진위여부를 파악하기 위해 아임포트의 계좌인증 api를 사용하고 있습니다.

구체적인 스펙은 아임포트 api 문서GET /vbanks/holder를 참고하시면 됩니다.

다음은 api 사용 시 주의사항 및 코드 샘플입니다.

계좌조회 api의 경우 요청 전에 먼저 access_token을 발급받아야하는데, POST /users/getToken에 api키와 api 시크릿을 전달하면 됩니다.

async function authenticate() {
  return axios.post(
    `${config.iamport.apiBaseUrl}/users/getToken`,
    {
      imp_key: config.iamport.impKey,
      imp_secret: config.iamport.impSecret,
    },
  );
}

위와 같이 요청을 보내면,

{
  "code": 0,
  "message": "string",
  "response": {
    "access_token": "string",
    "expired_at": 0,
    "now": 0
  }
}

와 같은 응답을 받을 수 있습니다. 우리는 access_token을 얻어서 GET /vbanks/holder요청을 할 때 넘겨주면 됩니다.

다음은 checkBankHolder 함수입니다.

async function checkBankHolder(
  accessToken,
  { bankCode, bankAccountNumber },
) {
  // get 요청이므로 querystring으로 넘겨준다.
  const query = querystring.stringify({
    bank_code: bankCode,
    bank_num: bankAccountNumber,
  });

  return axios.get(
    `${config.iamport.apiBaseUrl}/vbanks/holder?${query}`,
    {
      headers: {
        Authorization: `Bearer ${accessToken}`, // 인증 요청이므로 헤더에 토큰을 넘겨준다.
      },
    },
  ).catch((error) => {
    /**
     * handling iamport error
     */
    const clientErrors = [400, 404];

    // 400, 404 에러는 유저가 값을 누락한 경우이므로 다른 에러 클래스로 처리한다.
    if (clientErrors.includes(error.response.status)) {
      throw new ApiError(error.response.data.message, 400);
    }

    throw new ApiError('iamport api 에러');
  });
}

몇 가지 주의할 점은 axios를 통해 요청을 할 때 Authorization헤더를 사용해서 토큰을 넘겨줘야한다는 것과 인증 요청을 하기 전에 access_token을 발급받아야한다는 점입니다.

계좌 인증 혹은 가상 계좌의 진위 여부를 파악할 필요가 있다면 아임포트 서비스를 이용해보는 것도 좋을 것 같습니다.

서비스에 아임포트를 사용하면서 개인적으로 느낀 점은

  1. 문서가 상당히 자세하고 친절하다.
    (구글링/스택오버플로우를 통해 답을 찾기 힘든 국내 서비스의 특징 상 문서가 잘 정돈되어 있지 않으면 사용이 꺼려집니다.)
  2. 고객센터에 전화를 하면 응답률이 좋다.
    (네이버페이 관련 문제로 몇 번 문의를 했는데 응답지연이나 무응답하는 경우는 없었습니다.)
  3. Node.js나 기타 여러 유명한 언어로 된 api client가 존재한다.
  4. 쉽다. (가장 중요한 부분이죠 ㅋㅋ)

어쩌다보니 아임포트 찬양으로 끝나긴 했습니다만 협찬을 받지는 않았습니다. 😅