비트코인 결제 시스템을 만드는 튜토리얼입니다. 예전부터 이 글을 써야지 써야지 하다가 이제서야 글을 쓰게 됐네요^^
최대한 접근하기 쉽게 설명해보겠습니다.
1. 설계
일단 어떻게 만들지 큰 그림을 한번 생각해봐야겠네요. 이 튜토리얼에서는 쇼핑몰에 비트코인 결제를 붙인다는 가정을 하겠습니다.
(blockchain.info 사이트)
(코인스노티파이 사이트)
전 blockchain.info사이트의 지갑과 코인스노티파이(https://www.coinsnotify.com)라는 두 개의 서비스를 이용할겁니다. blockchain.info 지갑을 사용하면 편리한점이 있는데요. blockchain.info의 API(https://blockchain.info/ko/api)를 사용할 수 있게 된다는 점입니다. 비트코인 주소 생성은 당연히 사용해야하는 기능입니다. blockchain api 를 보시면 친절하게도 결제처리라는 좋은 API가 있습니다.
어? 이거만 쓰면 되겠네 하고 글을 더 읽다보면 뭔가 이상한 점을 알 수 있게 됩니다. 결제처리용 비트코인 주소를 생성하면 생성한 주소중 20개까지만 유효하고 나머지는 비트코인 입금을 받더라도 callback을 안해준다는 겁니다. -_-; 만약 여러분이 만드는 사이트에 유저가 소수라면 20개로 충분히 커버가 되겠지만 만약 동시에 20개를 넘는 결제 요청이 발생할 경우 그 쇼핑몰은 많은 고객을 잃게 될겁니다.
1) 비트코인 주소 발행 -> 2) 비트코인이 입금되기까지 기다림 -> 3) 비트코인 입금되면 해당 주소 회수 -> 4) 다시 새로운 비트코인 주소 생성
이걸 보시면 2)에서 시간이 얼마나 걸릴지 예측할 수가 없습니다. 비트코인 전송 속도까지 고려한다면 20개로 결제시스템을 유지한다는건 불가능합니다;;
물론 20개로 충분하다고 생각하는 분도 계시겠지만 또 다른 경우도 생각해볼 수 있습니다.
비트코인 결제 주소를 쇼핑몰에 회원가입한 모든 유저에게 할당하는 경우입니다. 이 경우에는 비트코인 주소가 회원수만큼 필요하게 됩니다. 만약 비트코인 거래소 같은걸 만든다면 이런식으로 해야겠죠? 회원수만큼 비트코인 주소를 할당해서 비트코인 주소에 입금되면 그 입금수량만큼 DB에 기록하면 되겠죠.
또 다른 방법은 좀 무식한 방법이지만 회원들의 모든 비트코인 주소를 주기적으로 balance 를 체크해서 변동된 내역이 있는지 확인하는 겁니다. 이런 방법을 쓰는 곳도 어딘가 있지 않을까 생각이 듭니다...
아무튼 그래서 저희는 비트코인 입금알림 서비스도 같이 쓸 예정입니다.
blockchain.info 를 쓰게 되면 여러분이 앞으로 맞이할 골치아픈 문제를 또 하나 해결할 수 있습니다. 예를 들어 카메라 쇼핑몰인데 이번달에 300명이 카메라를 구매해서 입금받은 비트코인 주소가 300개가 있다고 생각해보겠습니다. 300개 주소에 각각 0.3 BTC 씩 들어있는데 이걸 한 군데 모으려고 해보니 한번의 전송에 네트워크 수수료 0.0005 BTC 정도가 들겠죠? 300 x 0.0005 BTC = 0.15 BTC 네트워크 수수료로 0.15 BTC를 날려버리게 되는 엄청난 손해가 발생합니다. 다행인건 blockchain.info 에서 생성한 비트코인 주소에 0.3 BTC 씩 있다면 이건 통합하여 지갑에서 총 수량을 보여주게 되고 다른 비트코인 주소로 전송하게 되면 자동으로 합쳐서 전송하게 됩니다. 이건 비트코인 거래소에서도 많이 사용하는 방법인데요. 비트코인을 한번 전송하는데 네트워크 수수료가 꽤 비싸니 여러 건의 거래를 한번에 합쳐서 하나의 트랜잭션으로 처리합니다. 이런 기술이 있어야 최대한 수수료를 아낄 수 있게 됩니다. 트랜잭션을 직접 작성하는 건 난이도가 좀 있어서 어려우니 간편하게 blockchain.info 지갑을 써서 이 문제를 해결하는게 좋겠죠?
2. 주소 생성
비트코인 주소를 생성해봅시다. blockchain.info API를 사용할줄 안다면 지갑의 주소를 생성해도 되고 결제용 주소를 생성해도 됩니다. 둘다 관계없습니다만 여기서는 결제 처리용 주소 생성(https://blockchain.info/api/api_receive)을 이용해보겠습니다.
blockchain.info 의 지갑 서비스를 서버에 설치하고 $ blockchain-wallet-service start --port 3000 명령어로 프로그램 실행하는것까지 할 수 있는 분이라면 api를 사용해서 주소 생성하시면 됩니다. 만약 리눅스 서버를 다루는게 익숙하지 않다면 지갑에서 직접 생성하시면 됩니다. 스크린샷을 잠깐 보겠습니다.
blockchain.info 지갑에 로그인한 뒤 왼쪽의 [설정]에서 [주소들]을 눌러봅니다. 그리고 '내 비트코인 지갑 (디폴트)'라고 된 부분에서 제일 오른쪽에 [관리]를 누릅니다.
그러면 내 비트코인 주소를 확인할 수 있습니다.
여기서 [+ 새 주소 추가]를 누르시면 새로운 비트코인 주소를 계속 생성할 수 있습니다. 모든 회원에게 할당한다면 회원수만큼 새 주소를 추가하시면 되고 결제 시스템을 만든다면 한 200개 정도있으면 안정적일 것 같습니다. 새 주소 생성하고 그 주소 긁어서 복사하고 DB에 유저에게 붙여넣기... 수작업으로도 할 수 있습니다. (잠시 눈물 좀 닦겠습니다...)
이 주소는 나중에 고객에게 보여줄때 QR코드도 같이 보여주면 훨씬 보기 좋습니다. QR코드를 만들어볼까요? 구글 차트를 이용해봅시다.
<img src="https://chart.googleapis.com/chart?chs=130x130&cht=qr&chl=bitcoin:1N5XhCX7P6yoGmzH6A7uLSpn9Anpimfa59?amount=10000" />
이런식으로 비트코인 주소값과 amount(사토시 단위)를 변경해서 고객에게 보여주면 됩니다.
3. 입금 알림 등록
코인스노티파이에 입금 알림등록을 해야겠네요. 알림 등록은 main_group 하나만 이용할꺼면 사이트 메인에서 등록하면 됩니다.
등록할 주소를 입력했습니다. 그럼 아래에 Email 또는 HTTP 라고 적혀있는데 쇼핑몰에 결제시스템이니 HTTP Callback 주소를 입력하면 되겠죠?
여러분 쇼핑몰 이름이 www.shop.co.kr 이라면
http://www.shop.co.kr/callback.php
이런식으로 callback 받을 주소를 입력후 [등록] 버튼을 누르면 됩니다.
여기 callback.php 는 위 주소로 비트코인을 입금받으면 코인스노티파이에서 http://www.shop.co.kr/callback.php 로 GET 정보를 전달하게 됩니다. 어떤 값이 전달되는지 더 자세히 보겠습니다.
http://www.shop.co.kr/callback.php?txid=58402cd1367cb959c5f02a3d6c7cb1f43893d6b96101433bdb223f1b09363d79&address=1B2L3cfm1CFH8cUB9BRKUs8zFGYEJLtWev&value=10000&confirmed=1
이런식으로 callback을 전달받게 됩니다. 내용을 보기 편하게 줄바꿈을 해보겠습니다.
txid=
58402cd1367cb959c5f02a3d6c7cb1f43893d6b96101433bdb223f1b09363d79
&
address=
1N5XhCX7P6yoGmzH6A7uLSpn9Anpimfa59
&
value=
10000
&
confirmed=1
txid 는 비트코인 거래를 하고 생기는 트랜잭션 정보입니다. 이걸로 거래를 자세히 확인할 수 있습니다. 아마 이걸 blockchain.info 같은 곳에서 많이 검색해보셨을겁니다. 고객이 쇼핑몰에서 결제하면 이 txid를 고객에게 전달해줘야 고객입장에서 안심이 됩니다. 내 입금이 처리되고 있구나... 라고 말이죠. address 는 어떤 비트코인 주소에 입금된 건지 알 수 있는 것이고 value 는 비트코인 값입니다. 사토시 단위입니다. confirmed 는 컨펌이 몇번 이루어졌는지나타나는 숫자입니다. 코인스노티파이는 1컨펌부터 3컨펌까지 총 3번 callback 을 해줍니다.
if (confirmed == 1) {
// 고객에게 이메일로 입금처리중이라는 걸 알림
} else if (confirmed == 3) {
// 비트코인 입금확인 완료
if (value == 10000) {
// 금액 일치함
}
}
이런식으로 callback.php 코드를 작성해주시면 됩니다.
4. 입금 처리 과정
비트코인을 입금하라고 QR코드와 비트코인 결제 주소를 고객에게 보여주고 ... 원화를 결제하는 다른 쇼핑몰처럼 결제가 완료될때까지 결제 페이지에서 멈춰있으면 안됩니다. 무통장입금처럼 결제 계좌를 웹페이지나 이메일, 문자메시지로 안내해주고 입금확인되면 입금확인이 되었다고 알려주고 물건 배송을 하면 되겠습니다.
쉽게 쓰겠다고 생각했는데 쓰고 보니 뭔가 복잡해보이기도 하네요. 궁금한점 있으시거나 설명이 부족한 부분 있으면 알려주세요~