이번에는 그래서 결제대행사를 거치기로 하였다. 정보과학회하고 얘기해보니 올앳페이라는 결제대행사와 계약이 되어있고 얘네들이 해외카드 결제를 지원한다고 하여 직접 온라인 등록페이지를 만들기로 하였다. 내가 개발에 조금 시간을 써야 하는 일이긴 하지만, 전체적으로 봤을 때 등록비 정산에 관한 업무량을 확 줄일 수 있을 것이라 예상했기 때문이고 나 또한 실제 온라인 결제가 어떤 방식으로 구현되는지 기술적인 호기심이 있기 때문이기도 했다.
올앳페이에서 제공한 매뉴얼을 읽어보니 인터넷 상에서의 온라인 쇼핑은 크게 다음과 같은 과정으로 이루어진다는 것을 알 수 있었다.
- 사용자가 물건을 구매하겠다는 의사를 표시함. 즉 "주문"이라는 형태로 쇼핑몰 서버의 DB 또는 사용자 session에 주문할 물품에 대한 정보가 생긴다.
- 구매하는 과정으로 들어가면, 쇼핑몰은 배송 등을 위한 주소 등의 추가 정보를 입력받는다.
- 결제 방법을 선택하면 각 결제수단에 따라 적절한 인증절차를 거친다. (client side)
예) ISP 안전결제 등 - 결제하기 버튼을 누르면 쇼핑몰 서버로 결제 내용이 암호화되어 전달된다. 쇼핑몰 서버는 주문 정보를 확인하여 금액이 맞게 들어왔는지 한번 더 검증하고, 이를 결제대행사 서버로 보내어 결과를 리턴받는다. (server side)
- 받은 결과를 보고 결제의 성공/실패 여부를 확인하고 적절한 후처리를 한다.
- 결제 인증 과정에서 신용카드 번호와 비밀번호 등 결제하는 데 필요한 정보가 쇼핑몰 서버로 노출되지 않아야 한다. 이는 결제대행사 측에서 제공한 client side 플러그인이 구현해준다.
- 쇼핑몰 서버에서 결제대행사 서버로 가는 정보는 암호화되어야 한다. 이는 결제대행사에서 SSL 연결을 제공함으로써 해결 가능하다.
그래서 이걸 PHP를 cli로 실행해서 인자를 넘겨 처리하고 결과값을 받아오는 식으로 짜야 하나 잠시 고민했는데, 막상 API 라이브러리 소스코드를 열어보니 괜히 함수별로 똑같은 내용을 복사붙여넣기 해놔서 길이만 길었지 막상 하는 일은 약간의 고유 오류코드 처리를 포함한 SSL HTTP 요청 날리는 게 전부였다. 그래서 1시간만에 뚝딱 포팅해버리고 그날 중으로 실제로 결제 되는 것까지 확인했다.
(프로그램 반복 테스트 과정에서 거의 백만원 정도를 내 개인카드로 긁었다가 식겁하고 얼른 올앳페이 관리자시스템 들어가서 승인취소를 넣었다...ㅋㅋㅋ 원래 디버깅용 test 플래그가 있어서 이걸 쓰면 실제 결제가 이루어지지 않는데 그걸 깜빡....;;)
국내를 대상으로 하는 보통의 온라인 쇼핑몰이라면 여기까지만 하면 땡인데, 내 경우에는 한 단계가 더 있었다. 국제 워크샵이다보니 해외 참가자들의 등록비도 결제할 수 있게 만들어야 하는 것. 사실 그것이 이 일을 한 주 목적이기도 했고.
여기서 문제는 실제로 해외에서 발급받은 신용카드가 아니면 테스트조차 해볼 수 없다는 것이다. -_-;;; 쇼핑몰에서 어찌할 수 없는 3단계(결제 인증)에서 인증이 안 되기 때문이다. 게다가 test 플래그를 켜도 일단 인증 과정을 진행한 다음 올앳페이 서버를 거칠 때 bypass하는 방식이라서 인증이 안 되면 진행이 불가능한 것은 마찬가지. 국내에서 발급받은 카드들은 카드사에서 발급한 것인지 은행에서 발급한 것인지에 따라 3단계에서 막히는지 4단계에서 막히는지 차이가 좀 있으나 어쨌든 결제가 불가능하다. (국내상점에 국내카드로 해외결제를 한다는 것을 못 받아들이는 듯. 올앳 쪽에 문의하니 국내에서의 해외결제는 모두 외환카드를 통해 처리되는데 여기 서버에서 막고 있는 것 같다.)
결국은 교수님이 해외에 계실 때 발급받았던 '진퉁' 해외카드를 써서야 최종 결제 테스트에 성공할 수 있었고, 그 와중에 있었던 자잘한 프로그래밍 실수나 버그들 때문에 며칠 동안은 수동으로 등록절차를 진행해야 했다.
어쨌든...
온라인 결제 연동도 생각보다 어려운 일은 아니라는 것.
다른 사람들을 위해 github에 올앳페이 결제 라이브러리와 Django 예제 코드들을 공개한다.