中華民國的健保IC卡必須使用相容於PC/SC介面的IC讀卡機來讀取。PC/SC的規範是由微軟與其它IC卡廠商共同訂定出來的,統一了IC卡的介面。因此如果要讀取IC卡,要在環境安裝好讀卡機的驅動程式,並且使用PC/SC的函式庫提供的功能來讀取。不過要使用PC/SC函式庫,並不是每個執行環境都能夠做到,像是網頁瀏覽器現階段應該還做不到,要等Web Smart Card API出來才行,但還是有其它方式可以讀卡。



TW NHI IC Card Service

「TW NHI IC Card Service」是筆者用Rust程式語言開發的中華民國健保卡讀取服務,支援Linux、macOS和Windows。啟動服務之後就可以透過HTTP連線來讀卡,支援WebSocket。有了這個服務在能夠進行HTTP連線的環境都可以讀卡了。

GitHub:

執行環境

在使用TW NHI IC Card Service前,要先設定好環境才能正確讀卡。

Windows / macOS

要先安裝好讀卡機的驅動程式。

Linux

需有pcscd。基於Debian的Linux發行版可用以下指令安裝並啟用:

sudo apt install pcscd
sudo systemctl enable pcscd

接著安裝好讀卡機的驅動程式。

使用方法

直接在終端機或是命令列中執行TW NHI IC Card Service的執行檔,就會啟動HTTP服務,監聽127.0.0.1:58113。在指令加上-i或是-p參數可以分別設定要監聽的網路介面和連接埠。

啟動HTTP服務後,可以存取以下的端點:

  • GET /:讀取所有讀卡機的健保卡中的基本資料。回應的 Content-Type 為 application/json。JSON 格式如下:
    [
        {
            "reader_name": "讀卡機名稱",
            "card_no": "卡號",
            "full_name": "全名",
            "id_no": "身份證字號",
            "birth_date": "0000-00-00",
            "birth_date_timestamp": 0,
            "sex": "M:男;F:女",
            "issue_date": "0000-00-00",
            "issue_date_timestamp": 0
        },
    
        ...
    ]

    時間戳記(timestamp)的單位是毫秒,會使用本地的時區,建議將時區設定為GMT+8

  • GET /version:回傳此服務的版本,可用來檢驗此服務是否正常在監聽。回應的Content-Type為application/json。JSON 格式如下:
    {
        "major": 0,
        "minor": 1,
        "patch": 5,
        "pre": "",
        "text": "0.1.5"
    }
  • GET /wsWebSocket 端點。URL查詢中可以代入interval欄位來設定伺服器回傳所有讀卡機的健保卡中的基本資料的時間間隔,單位為秒。回傳的資料格式請見GET /。客戶端也可以在連線時傳送要使用的時間間隔秒數來更改回傳設定。

在JavaScript/TypeScript上使用TW NHI IC Card Service

筆者也提供了JavaScript/TypeScript套件來與TW NHI IC Card Service搭配使用。

GitHub:

使用方法

使用npm安裝本套件
npm install "git+https://github.com/magiclen/tw-nhi-icc.git#semver:^0.1"
初始化
import { TWNHIICCService } from "tw-nhi-icc";

const service = new TWNHIICCService();
取得 TW NHI IC Card Service 的版本資訊
const version = service.getVersion();
取得健保卡清單
const cards = await service.getCardList();
連接WebSocket
await service.openWebSocket();

service.onWebSocketUpdate = (cards) => {
    // ...
};

service.closeWebSocket();

在網頁瀏覽器上使用TW NHI IC Card Service

網頁原始碼

展示頁面