기술 포스트
EMV 개발 가이드, 3부
이전 이 시리즈의 1부에서는 칩 카드 거래가 MagStripe 방식과 어떻게 다른지 살펴보았습니다. 리더기와 카드 사이에 상당한 양의 통신이 오고 간다는 것을 확인했습니다. 하지만 (다행히도!) 그러한 통신의 상당 부분은 결제 앱 개발자의 제어 밖에서, 즉 리더기의 EMV 커널에 의해 자동으로 처리된다는 것도 확인했습니다.
이전 2부에서는 EMV 거래 중에 반환되는 다양한 태그(또는 TLV 데이터)와 그 의미에 대해 설명했습니다. 또한 EMV 거래가 시작(Start), 인증(Authenticate), 완료(Complete)와 같은 이름의 단계별로 진행된다는 점도 언급했습니다. 그리고 서로 다른 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 (Knowledge Base)으로 이동하여 해당하는 다운로드 항목을 찾으세요. Windows, Linux, MacOS, iOS, Android용 빌드가 각각 별도로 제공됩니다.
압축 파일을 풀고 Source Code 폴더에서 샘플 프로젝트를 찾아 원하는 IDE에서 불러오세요. ID TECH 리더기를 연결한 상태에서 샘플 앱을 컴파일하고 실행한 후, 앱이 리더기와 정상적으로 통신하는지 확인하세요.
2단계: 리더기 설정
EMV 거래를 바로 사용할 수 있을 것이라고 기대하지 마세요! 리더기를 설정하지 않은 상태에서는 첫 번째 거래가 실패합니다. 최소한 다음 항목들을 리더기에 로드해야 합니다:
- 터미널 설정
- AID
- CAPK(인증 기관 공개 키)
ID TECH는 테스트 목적으로만 사용할 수 있는 샘플 값을 제공하지만, 샘플 값을 로드하는 명령어는 직접 실행해야 합니다. 명령어를 실행하기 전까지는 값이 로드되지 않습니다! (다행히 한 번 로드된 항목들은 매번 시작 시마다 다시 로드할 필요가 없습니다. 값은 영구적으로 저장되며, 설정은 최초 한 번만 수행하면 됩니다.) SDK의 샘플 코드를 참조하여 이 과정을 확인하시기 바랍니다.
EMV 설정은 상당히 방대한 주제입니다. 이 게시물에서 모든 내용을 다루기는 어렵습니다. 해당 주제에 대한 소개는 당사의 터미널 설정에 관한 이전 게시물, 그리고 당사의 EMV White Paper (PDF: 무료 다운로드)의 구성 섹션도 참조하시기 바랍니다.
3단계: 트랜잭션 실행
샘플 앱에는 이를 수행하기 위한 코드가 포함되어 있습니다. 앱을 단계별로 실행하여 동작 방식을 확인하시기 바랍니다. 그렇지 않을 경우, 최소한 커스텀 콜백(적절한 시점에 SDK가 자동으로 호출하는 함수)을 설정한 후 직접 emv_startTransaction() 를 호출해야 합니다.
카드 리더기와의 통신은 비동기 방식으로 이루어집니다. 즉, emv_startTransaction()와 같은 메서드를 호출하면 SDK가 리더기에 접속하여 일련의 이벤트를 시작하지만, 해당 이벤트가 진행되는 동안 프로그램이 대기 상태로 중단되지는 않습니다. 대신, 제어권이 즉시 앱으로 반환되며(성공/오류 코드와 함께), SDK 코드가 리더기의 업데이트를 모니터링합니다. 예를 들어, 리더기가 EMV 트랜잭션의 시작 단계를 완료하면 TLV 데이터를 호스트 컴퓨터로 전송합니다(일반적으로 USB를 통해). SDK는 해당 데이터를 가로채어 커스텀 콜백을 호출하고, 데이터를 콜백에 전달합니다.
결론적으로, 리더기로부터 응답을 받으려면 반드시 커스텀 콜백을 설정해야 합니다!
콜백의 형태는 어떻게 생겼나요?
Universal SDK의 Windows 버전에서 커스텀 콜백은 다음과 같은 형태의 C# 시그니처를 가져야 합니다:
콜백이 실제로 사용되려면, 다음과 같이 런타임에 SDK에 콜백을 등록해야 합니다:
이 예제에서는 VP3300을 카드 리더기로 사용한다고 가정하지만, SDK는 사용 중인 ID TECH 결제 리더기라면 어떤 것이든 지원합니다. 결국 이것은 범용(Universal) 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 형식의 풍부한 문서가 포함되어 있으니 참고하시기 바랍니다. 그래도 추가적인 답변이 필요하시다면 언제든지 저희 전문가에게 문의해 주십시오.
