วิธีอ่านบัตรประชาชนเข้าแบบฟอร์มในเว็บผ่านเครื่องสแกนบัตร

โปรแกรมอ่านบัตรพิมพ์ข้อมูลจากบัตรประชาชนเป็นข้อความยาวบรรทัดเดียว คั่นแต่ละท่อนด้วย Tab ระบบดักข้อความนั้นในช่องเดียว แล้วแยกเป็นเลขบัตร ชื่อ ที่อยู่ และวันเกิด โพสต์นี้ไล่ตัวอย่างหนึ่งใบตั้งแต่ข้อความดิบจนลงช่องในฟอร์ม และเทียบสองระบบที่ตั้งชุดคำสั่งต่างกัน

เผยแพร่
เวลาอ่าน
6 นาที
ในโพสต์นี้ 8 หัวข้อ
  1. เครื่องอ่านบัตรส่งข้อมูลเข้าเว็บด้วยการพิมพ์แทนพนักงาน
  2. ตัวอย่างข้อความที่โปรแกรมพิมพ์เข้ามาหนึ่งใบ
  3. แต่ละท่อนไปลงช่องไหน
  4. ขั้นตอนที่ช่องสแกนดักข้อมูลในเบราว์เซอร์
  5. แยกท่อนและแปลงค่าบน server
  6. อีกระบบตั้งชุดคำสั่งสั้นกว่าและจบด้วยรูปถ่าย
  7. เก็บ log ดิบไว้ตามแก้ แล้วลบเมื่อครบ 90 วัน
  8. กรณีที่อาจเจอในงานจริง

งานที่รับลูกค้าหน้าร้าน เช่นสินเชื่อ จำนำ ขายทอง หรือเปิดบัญชีสมาชิก ต้องกรอกข้อมูลจากบัตรประชาชนแทบทุกครั้ง พิมพ์เองทั้งช้าและผิดง่าย ร้านส่วนใหญ่มีเครื่องอ่านบัตรแบบเสียบอยู่แล้ว โพสต์นี้ไล่ดูว่าเครื่องอ่านบัตรส่งอะไรมาให้ระบบ แต่ละท่อนไปลงช่องไหน และระบบดักข้อมูลชุดนั้นยังไง โดยใช้บัตรสมมติใบเดียวเป็นตัวอย่างตลอดทั้งโพสต์ และเทียบกับอีกระบบที่ตั้งค่าต่างกัน

เครื่องอ่านบัตรส่งข้อมูลเข้าเว็บด้วยการพิมพ์แทนพนักงาน

ข้อมูลในบัตรประชาชนอยู่ในชิป หน้าเว็บที่เปิดในเบราว์เซอร์เข้าถึงเครื่องอ่านบัตรตรง ๆ ไม่ได้ จึงต้องมีโปรแกรมบนคอมพิวเตอร์ของร้านเป็นตัวกลาง ทางที่ง่ายที่สุดคือโปรแกรมอ่านบัตรแบบที่ทำตัวเหมือนคีย์บอร์ด เสียบบัตรแล้วโปรแกรมพิมพ์ข้อมูลลงช่องที่ cursor อยู่ ระบบไม่ต้องติดตั้งอะไรเพิ่มในเครื่องของร้าน

โปรแกรมแบบนี้มีชุดคำสั่ง (template) ให้ตั้งในแต่ละเครื่อง ว่าจะส่งข้อมูลอะไร เรียงยังไง ชุดคำสั่งเป็นรายการสั้น ๆ เช่น "รูปถ่าย, Tab, Tab, เลขบัตร, Tab, คำนำหน้า, Tab, ชื่อ, …" ข้อความแต่ละท่อนมาเป็นการวางจาก clipboard รูปถ่ายมาเป็นการวางรูป และคำสั่ง Tab มาเป็นการกดปุ่ม Tab

สิ่งที่ร้านควรรู้ก่อนเริ่มคือ ระบบได้ข้อมูลเท่าที่ชุดคำสั่งส่งมาเท่านั้น ชิปในบัตรมีข้อมูลมากกว่าที่ร้านทั่วไปใช้ เช่นชื่อภาษาอังกฤษ เพศ วันออกบัตร และวันบัตรหมดอายุ สองระบบในโพสต์นี้ไม่ได้ส่งวันหมดอายุมาเลย ระบบจึงเช็กไม่ได้ว่าบัตรยังใช้ได้ไหม ถ้างานของร้านต้องเช็ก ต้องเพิ่มคำสั่งนั้นในชุดคำสั่งของทุกเครื่อง แล้วให้ระบบรับท่อนที่เพิ่มขึ้นด้วย

ตัวอย่างข้อความที่โปรแกรมพิมพ์เข้ามาหนึ่งใบ

ระบบแรกในโพสต์นี้เป็นระบบสินเชื่อ ชุดคำสั่งของร้านเรียงแบบนี้

รูปถ่าย  Tab Tab  เลขบัตร Tab คำนำหน้า Tab ชื่อ Tab นามสกุล Tab บ้านเลขที่ Tab หมู่ Tab ตำบล Tab อำเภอ Tab จังหวัด  Tab Tab Tab Tab  วันเกิด

ช่องสแกนเปลี่ยนทุก Tab เป็น -- เพื่อให้เห็นเป็นข้อความเดียว เสียบบัตรสมมติหนึ่งใบ ช่องสแกนจะได้ข้อความนี้ ส่วนรูปถ่ายเก็บแยกไว้ เพราะมาเป็นรูป ไม่ใช่ตัวอักษร

----1 2345 67890 12 1--นาย--สมชาย--ตัวอย่าง--99/1--หมู่ที่ 5--ตำบลบ้านตัวอย่าง--อำเภอเมืองตัวอย่าง--จังหวัดตัวอย่าง--------24-06-2542

-- สองตัวแรกคือ Tab สองครั้งหลังรูปถ่าย และ -- สี่ตัวท้ายคือ Tab สี่ครั้งก่อนวันเกิด ท่อนว่างพวกนี้ไม่มีข้อมูล แต่ทำให้นับตำแหน่งได้ ข้อความนี้แยกได้ 15 ท่อนพอดี

แต่ละท่อนไปลงช่องไหน

ท่อน ได้มาว่า ช่องในระบบ ระบบทำอะไรต่อ
0–1 (ว่าง) ข้าม รูปถ่ายมาทางการวางรูป
2 1 2345 67890 12 1 เลขบัตร ตัดช่องว่างออก เช็กหลักตรวจสอบตัวสุดท้าย
3 นาย คำนำหน้า ใช้ตามนั้น
4–5 สมชาย ตัวอย่าง ชื่อ-นามสกุล รวมเป็น สมชาย ตัวอย่าง
6 99/1 บ้านเลขที่ ใช้ตามนั้น
7 หมู่ที่ 5 หมู่ เก็บแค่ตัวเลข 5
8 ตำบลบ้านตัวอย่าง ตำบล ตัดคำว่า ตำบล หรือ แขวง ข้างหน้าออก
9 อำเภอเมืองตัวอย่าง อำเภอ ตัดคำว่า อำเภอ หรือ เขต ออก
10 จังหวัดตัวอย่าง จังหวัด ตัดคำว่า จังหวัด ออก
11–13 (ว่าง) ข้าม
14 24-06-2542 วันเกิด ลบ 543 จากปี พ.ศ. แล้วเก็บเป็น 1999-06-24
รูปที่วาง รูปถ่าย รูปลูกค้า แปลงเป็นไฟล์ PNG

ที่ต้องตัดคำนำหน้าของตำบล อำเภอ และจังหวัด เพราะบัตรเขียนที่อยู่เต็ม ส่วนฟอร์มของระบบมีช่องแยก และช่องจังหวัดของระบบควรเก็บแค่ชื่อจังหวัด จะได้ค้นหรือสรุปตามจังหวัดได้ ที่อยู่ในบัตรคือที่อยู่ตามทะเบียนบ้าน ถ้าร้านต้องใช้ที่อยู่ปัจจุบันสำหรับส่งเอกสาร ควรมีอีกช่องให้พนักงานถามลูกค้า

ขั้นตอนที่ช่องสแกนดักข้อมูลในเบราว์เซอร์

จากบัตรประชาชนถึงช่องในแบบฟอร์ม

ข้อมูลจากบัตรไหลเข้าช่องเดียว ระบบแยกลงช่องจริง และเก็บ log ดิบของทุกครั้งไว้ดูย้อนหลัง

พนักงานคลิกที่ช่องสแกนแล้วเสียบบัตร จากนั้นช่องสแกนทำงานตามลำดับนี้

  1. เริ่มการสแกนเมื่อมีอะไรเข้ามาครั้งแรก จะเป็นการวาง การกด Tab หรือการพิมพ์ก็ได้ ช่องสแกนล้างข้อความเก่าทิ้งก่อน
  2. ดักปุ่ม Tab ไว้ ปกติ Tab จะย้าย cursor ไปช่องถัดไป ช่องสแกนจึงต้องกันไว้ แล้วต่อ -- ลงในข้อความแทน ปุ่ม Enter ก็กันไว้เหมือนกัน โปรแกรมบางเครื่องกด Enter ปิดท้าย ซึ่งจะส่งแบบฟอร์มทั้งที่พนักงานยังไม่ได้ตรวจ
  3. เก็บรูปที่วางเข้ามา แปลงรูปจาก clipboard เป็น PNG แล้วถือไว้
  4. รู้ว่าจบเมื่อเงียบไป 1 วินาที ทุกครั้งที่มีอะไรเข้ามา ช่องสแกนเริ่มนับเวลาใหม่ ถ้าครบ 1 วินาทีโดยไม่มีอะไรเข้ามาอีก และรูปแปลงเสร็จแล้ว ก็ถือว่าจบ
  5. ส่งข้อความกับรูปไปให้ server แยก
onKeydown(e) {
    if (e.key === 'Tab' || e.key === 'Enter') {
        e.preventDefault()                      // ไม่ย้ายช่อง ไม่ส่งฟอร์ม
        if (e.key === 'Tab') this.$el.value += '--'
    }

    clearTimeout(this.idleTimer)                // มีอะไรเข้ามา เริ่มนับใหม่
    this.idleTimer = setTimeout(() => this.finish(), 1000)
}

ที่ใช้เวลาเป็นเกณฑ์แทนการนับว่าได้ครบกี่ท่อน เพราะถ้าครั้งไหนมาไม่ครบ ตัวนับจะค้าง แล้วข้อมูลบัตรใบถัดไปจะไปต่อท้ายใบเก่า การจบด้วยเวลาทำให้ครั้งที่พังไม่ลามไปครั้งถัดไป

แยกท่อนและแปลงค่าบน server

server แยกข้อความด้วย -- ถ้าได้ไม่ครบ 15 ท่อน แปลว่าเครื่องนั้นตั้งชุดคำสั่งต่างไป ระบบไม่เดาว่าท่อนไหนคืออะไร จะขึ้นว่าอ่านข้อมูลบัตรไม่ครบ และทิ้งข้อความดิบไว้ให้เห็น ถ้าครบ ก็กรอกแต่ละช่องตามตาราง

$tokens = explode('--', str_replace("\t", '--', $raw));

if (count($tokens) !== 15) {
    return false; // ชุดคำสั่งของเครื่องนี้ไม่ตรง
}

$set('id_card_no', str_replace(' ', '', $tokens[2]));
$set('sub_district', preg_replace('/^(แขวง|ตำบล)/', '', $tokens[8]));
$set('birth_date', $this->parseBirthDate($tokens[14])); // พ.ศ. → ค.ศ.

บรรทัดแรกแปลง \t เป็น -- ด้วย สำหรับเครื่องที่ตั้งให้วางทั้งชุดเป็นก้อนเดียวแทนการกด Tab ทีละครั้ง

วันเกิดมีเรื่องให้ระวัง รูปแบบวันเกิดเป็นการตั้งค่าของโปรแกรมแต่ละเครื่อง ร้านหนึ่งได้ 24-06-2542 อีกร้านได้ 24 มิถุนายน 2542 ระบบจึงรับทั้งตัวเลข ชื่อเดือนเต็ม และชื่อเดือนแบบย่ออย่าง มิ.ย. แล้วลบ 543 ออกจากปี ถ้าอ่านไม่ออกหรือเป็นวันที่ไม่มีจริง ระบบเว้นช่องวันเกิดไว้ให้พนักงานกรอกเอง แต่ยังกรอกช่องอื่นตามปกติ วิธีจัดการปี พ.ศ. ใน Laravel อยู่ใน แปลงวันที่เป็นภาษาไทย ปี พ.ศ. ใน PHP และ Laravel ส่วนหลักตรวจสอบของเลขบัตรอยู่ใน ตรวจเลขบัตรประชาชน 13 หลักด้วย ThaiIdCardRule

อีกระบบตั้งชุดคำสั่งสั้นกว่าและจบด้วยรูปถ่าย

ระบบร้านทองที่เราทำใช้โปรแกรมแบบเดียวกัน แต่ตั้งต่างกันพอสมควร และความต่างนี้บอกว่าต้องตัดสินใจเรื่องอะไรบ้าง

ระบบสินเชื่อ ระบบร้านทอง
ส่งอะไรมา 15 ท่อน รวมที่อยู่แยกส่วนและวันเกิด 4 ท่อน คือเลขบัตร ชื่อเต็ม ที่อยู่เต็ม และรูปถ่ายปิดท้าย
ตัวคั่น -- ++
ช่องสแกน ช่องแยกที่ไม่บันทึกลงฐานข้อมูล ช่องเลขบัตรของฟอร์มเอง
รู้ว่าจบเมื่อ เงียบไป 1 วินาที รูปถ่ายมาถึง
ที่อยู่ แยกลงบ้านเลขที่ หมู่ ตำบล อำเภอ จังหวัด ลงช่องที่อยู่ช่องเดียว
log ของการสแกน เก็บทุกครั้ง ไม่เก็บ

ระบบร้านทองเรียบง่ายกว่า เพราะร้านใช้ที่อยู่แค่พิมพ์ลงเอกสาร ไม่ต้องสรุปตามจังหวัด และใช้รูปถ่ายที่มาท้ายสุดเป็นสัญญาณว่าจบ ไม่ต้องจับเวลา ข้อแลกคือถ้าครั้งไหนรูปไม่มา ระบบจะไม่กรอกอะไรเลยและไม่มีร่องรอยให้ดูว่าเกิดอะไรขึ้น ส่วนระบบสินเชื่อต้องเก็บที่อยู่แยกส่วนและวันเกิดไว้ทำสัญญา จึงต้องรับข้อความที่ยาวกว่าและเผื่อเครื่องที่ตั้งค่าไม่เหมือนกันมากกว่า

เก็บ log ดิบไว้ตามแก้ แล้วลบเมื่อครบ 90 วัน

ปัญหาส่วนใหญ่ของวิธีนี้เกิดที่เครื่องของร้าน สาขาใหม่ตั้งชุดคำสั่งไม่เหมือนสาขาเดิม หรือตั้งให้พิมพ์ทีละตัวแทนการวาง ระบบสินเชื่อจึงเก็บ log ทุกครั้งที่สแกน มีข้อความดิบ จำนวนท่อน ขนาดของรูป และลำดับสิ่งที่ช่องสแกนได้รับ ว่าวางกี่ครั้ง กด Tab ตอนไหน ห่างกันกี่มิลลิวินาที อาการที่พนักงานเจอบ่อยอย่าง "ข้อมูลไปกองในช่องบนสุด" อ่านจาก log ก็รู้ได้ว่าชุดคำสั่งเกินหรือขาดไปหนึ่ง Tab

ข้อความดิบมีเลขบัตร ชื่อ ที่อยู่ และวันเกิด เป็นข้อมูลส่วนบุคคลตาม PDPA เต็มตัว log นี้จึงไม่เก็บรูปถ่าย เก็บแค่ขนาดของรูป ให้เฉพาะแอดมินเปิดดู และลบทิ้งเมื่อครบ 90 วันด้วย model:prune ที่รันทุกวัน ในขณะที่ log ของช่องทางอื่นเก็บหนึ่งปี ระยะเวลาที่เหมาะกับแต่ละร้านควรคุยกับคนที่ดูแลเรื่องข้อมูลส่วนบุคคลขององค์กร

กรณีที่อาจเจอในงานจริง

  • สาขาใหม่สแกนแล้วขึ้นว่าอ่านไม่ครบทุกใบ นับ Tab ใน log เทียบกับชุดคำสั่งของสาขาเดิม แล้วตั้งเครื่องนั้นให้ตรงกัน
  • ข้อมูลครบแต่ไม่มีรูป โปรแกรมอาจตั้งให้พิมพ์แทนการวาง หรือชุดคำสั่งไม่มีรูปถ่าย ถ้าระบบใช้รูปเป็นสัญญาณจบแบบระบบร้านทอง อาการนี้จะกลายเป็นไม่มีอะไรขึ้นเลย
  • พนักงานลืมคลิกช่องสแกนก่อนเสียบบัตร ข้อมูลจะไปลงช่องที่ cursor อยู่ แบบฟอร์มควรให้ cursor อยู่ที่ช่องสแกนตั้งแต่เปิดหน้า
  • ร้านอยากรู้ว่าบัตรหมดอายุหรือยัง เพิ่มวันหมดอายุในชุดคำสั่งของทุกเครื่อง แล้วให้ระบบรับท่อนเพิ่ม ถ้าเพิ่มแค่บางเครื่อง จำนวนท่อนจะไม่ตรงกันระหว่างสาขา

จบซีรีส์ ติดต่อและยืนยันตัวตนลูกค้า แล้ว

ดูทั้ง 4 ตอน →

อ่านต่อ

ล่าสุด

ดูทั้งหมด →