기술 포스트
EMV 개발 가이드, 3부
이전 이 시리즈의 1부에서는 칩 카드 거래가 MagStripe 방식과 어떻게 다른지 살펴보았습니다. 리더기와 카드 사이에 상당한 양의 상호 통신이 이루어진다는 점도 확인했습니다. 하지만 (다행스럽게도!) 그러한 통신의 상당 부분은 결제 앱 개발자의 제어 범위를 벗어나, 리더기의 EMV 커널에 의해 자동으로 처리된다는 사실도 알게 되었습니다.
이전 2부에서는 EMV 거래 중에 반환되는 다양한 태그(또는 TLV 데이터)와 그 의미에 대해 간략히 살펴보았습니다. 또한 EMV 거래가 시작(Start), 인증(Authenticate), 완료(Complete)와 같은 이름의 단계(phase)로 진행된다는 점도 언급했습니다. 그리고 각각의 단계마다 서로 다른 TLV가 반환된다는 점도 확인했습니다.
또한 (실제로 여러 차례) 언급했듯이, USB 또는 RS-232를 통해 카드 리더기에 펌웨어 명령을 직접 전송하는 방식으로도 EMV 거래를 수행할 수 있지만, 일반적으로는 ID TECH의 Universal SDK를 사용하는 것이 훨씬 편리합니다. (다운로드는 여기 에서 받으실 수 있습니다. Windows, Linux, MacOS, iOS, Android 중 사용할 플랫폼을 지정해야 합니다.)
SDK가 왜 더 편리할까요? 우선, SDK는 리더기와의 시리얼 통신(USB, RS-232 또는 Bluetooth) 설정을 자동으로 처리해 줍니다. 또한 개발자가 직접 알아야 하는 사항들을 추상화하여
디바이스 수준의 펌웨어 명령어 및 관련 저수준 프로토콜을 활용할 수 있습니다. 또한 오류 코드 해석과 데이터 파싱을 지원하는 완성된 코드 라이브러리도 제공됩니다.
Universal SDK의 또 다른 장점은 샘플 코드 가 함께 제공된다는 점입니다. 이를 통해 다양한 라이브러리를 활용하는 방법을 확인할 수 있습니다. (계속 읽어보세요.)
SDK를 시작하는 방법은 무엇일까요? 주요 단계를 살펴보겠습니다.
1단계: SDK 설치
개발 대상 운영 체제를 알고 있다면, Development — Home (지식 베이스)으로 이동하여 해당 다운로드 항목을 찾으세요. Windows, Linux, MacOS, iOS, Android 각각에 대한 별도 빌드가 제공됩니다.
압축 파일을 해제한 후, 원하는 IDE에서 샘플 프로젝트(Source Code 폴더 참조)를 불러와 보세요. ID TECH 리더기를 연결한 상태에서 샘플 앱을 컴파일하고 실행하여 앱이 리더기와 정상적으로 통신하는지 확인하세요.
2단계: 리더기 설정
EMV 거래를 즉시 실행할 수 있을 것이라 기대하지 마세요! 리더기를 사전에 구성하지 않으면 첫 번째 거래는 실패합니다. 최소한 다음 항목을 리더기에 로드해야 합니다:
- 단말기 설정
- AID
- CAPK(인증 기관 공개 키)
ID TECH는 이에 대한 샘플 값을 제공하지만(테스트 목적으로만 사용), 샘플 값을 로드하는 명령을 직접 실행해야 합니다. 명령을 실행하기 전까지는 값이 로드되지 않습니다! (다행히 리더기에 이 항목들이 로드되면 매번 시작할 때마다 다시 로드할 필요는 없습니다. 설정 값은 영구적으로 저장되며, 구성은 한 번만 수행하면 됩니다.) SDK의 샘플 코드를 참조하여 이 과정을 확인하시기 바랍니다.
EMV 구성은 상당히 방대한 주제입니다. 이 포스트에서 모든 내용을 다루기는 어렵습니다. 주제에 대한 개요를 파악하려면 단말기 설정에 관한 이전 포스트를 반드시 참조하시고, 아울러 EMV 백서 (PDF: 무료 다운로드)
3단계: 거래 실행
샘플 앱에는 이를 수행하는 코드가 포함되어 있습니다. 앱을 단계별로 실행하여 작동 방식을 확인하십시오. 그렇지 않을 경우, 최소한 사용자 정의 콜백(SDK가 적절한 시점에 자동으로 호출하는 함수)을 설정한 후 emv_startTransaction() 을 직접 호출해야 합니다.
카드 리더기와의 통신은 비동기 방식으로 이루어집니다. 즉, emv_startTransaction()와 같은 메서드를 호출하면 SDK가 리더기에 접속하여 일련의 이벤트를 시작하지만, 이벤트가 진행되는 동안 프로그램은 대기 상태로 멈추지 않습니다. 대신 제어권이 즉시 앱으로 반환되며(성공/오류 코드와 함께), SDK 코드가 리더기의 업데이트를 지속적으로 모니터링합니다. 예를 들어 리더기가 EMV 거래의 시작(Start) 단계를 완료하면 TLV 데이터를 호스트 컴퓨터로 전송합니다(일반적으로 USB를 통해). SDK는 해당 데이터를 수신하여 사용자 정의 콜백을 호출하고, 데이터를 콜백에 전달합니다.
결론적으로, 리더기로부터 응답을 받으려면 반드시 사용자 정의 콜백을 설정해야 합니다!
콜백의 형태는 어떻게 생겼나요?
Universal SDK의 Windows 버전에서 사용자 정의 콜백은 다음과 같은 형태의 C# 시그니처를 가져야 합니다:
콜백이 실제로 사용됨, 런타임 시 다음과 같이 SDK에 등록해야 합니다:
이 예시에서는 VP3300을 카드 리더기로 사용한다고 가정하지만, SDK는 사용 중인 ID TECH 결제 리더기라면 어떤 제품이든 지원합니다. 결국 이 SDK는 범용 SDK이기 때문입니다.
트랜잭션 코드는 어떤 모습인가요?
트랜잭션을 시작하려면 다음과 유사한 코드를 실행해야 합니다:
해당 호출은 emv_startTransaction() 리더기에 (USB 또는 시리얼을 통해) 요청을 전송하게 됩니다. 리더기는 ATR(즉, 카드의 칩과 접촉)을 수행하고 EMV 커널을 구동시킵니다.
트랜잭션 시작이 성공하고(타임아웃이나 오류가 발생하지 않은 경우), 앞서 설명한 대로 콜백을 등록했다면, 1~2초 후 해당 콜백이 실행됩니다. 콜백 코드에는 다양한 결과 유형을 처리하기 위한 상당히 많은 케이스를 포함한 "switch" 구문이 있어야 합니다. 물론 기대하는 결과는 TLV 데이터가 포함된 성공적인 EMV 트랜잭션일 것입니다. 따라서 Start 단계 종료 시 콜백에서 실행될 코드는 대략 다음과 같은 형태가 될 것입니다:
이 코드는 Authenticate Transaction 단계를 자동으로 실행하도록 환경설정을 지정하여 Start에서 Complete로 바로 진행할 수 있다고 가정합니다. (물론 반드시 이 방식을 따를 필요는 없으며, 요구사항에 따라 달라집니다.) 실제 결제 앱에서는 이 'case' 구간에서 게이트웨이 또는 어콰이어러에 온라인으로 접속하는 동안 앱이 일시 중지됩니다. 이후 태그 8A(및 기타 태그)를 emv_completeTransaction().
각 거래 단계 이후 반환되는 거래 데이터(TLV)의 파싱 방법을 확인하려면, 샘플 코드에서 "displayCardData(IDTTransactionData cardData)"를 검색하세요. 데이터 파싱에 관한 다양한 예시를 확인할 수 있습니다.
문의 사항이 있으신가요?
SDK를 사용하기 시작하면서 궁금한 점이 생길 수 있습니다. SDK에는 HTML 및 PDF 형식의 풍부한 문서가 포함되어 있다는 점을 참고하세요. 그래도 추가적인 답변이 필요하시다면, 언제든지 저희 전문가에게 문의해 주십시오.
