การเขียนโปรแกรมเรียกเว็บเซอร์วิสของกรมสรรพากรเพื่อตรวจสอบหมายเลขประจำตัวประชาชน

tags:

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

ข้างล่างนี้โค้ดที่ใช้ในการเรียกใช้เว็บเซอร์วิสและโอเปอเรชันดังกล่าว และใช้โปรแกรม XTrustProvider.java ที่ SSL Trust Provider for Java เพื่อใช้ในการเรียกเว็บเซอร์วิสที่เข้าถึงโดย HTTPS

package callsoapws;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Source;
import javax.xml.soap.MessageFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPBodyElement;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPElement;
import javax.xml.soap.MimeHeaders;
import com.sun.net.ssl.internal.ssl.*;
import java.security.Security; 

/**
 * @author Kanda Runapongsa Saikaew and Pongsakorn Poosankam
 * Computer Engineering Department
 * Khon Kaen University
 * 
 */
public class CheckPinRDWS {
    public void msgEnvelope(String[] args) throws Exception {
               
        SOAPConnectionFactory soapConnectionFactory =
                SOAPConnectionFactory.newInstance();
        SOAPConnection connection =
                soapConnectionFactory.createConnection();
        MessageFactory messageFactory =
                MessageFactory.newInstance();
        
        // Create a message
        SOAPMessage message =
                messageFactory.createMessage();
        
        // Get the SOAP header and body from the message
        // and remove the header
        SOAPHeader header = message.getSOAPHeader();
        SOAPBody body = message.getSOAPBody();
        header.detachNode();
        
        // Create a SOAP factory
        // Create a UDDI v2 checkPin body element
        SOAPFactory soapFactory =
                SOAPFactory.newInstance();
        SOAPBodyElement checkPin =
                body.addBodyElement(soapFactory.createName("ServicePIN",
"ns", "https://rdws.rd.go.th/ServiceRD/CheckTINPINService"));
        
        SOAPElement username =
                checkPin.addChildElement(
                soapFactory.createName("username","ns",
"https://rdws.rd.go.th/ServiceRD/CheckTINPINService"));
        username.addTextNode("anonymous");
        
        SOAPElement password =
                checkPin.addChildElement(
                soapFactory.createName("password","ns",
"https://rdws.rd.go.th/ServiceRD/CheckTINPINService"));
        password.addTextNode("anonymous");
        
        SOAPElement pin =
                checkPin.addChildElement(
                soapFactory.createName("PIN","ns",
"https://rdws.rd.go.th/ServiceRD/CheckTINPINService"));
        pin.addTextNode("xxx TEST PIN NUMBER xxx");
        
        MimeHeaders hd = message.getMimeHeaders();
        hd.addHeader("SOAPAction", 
"https://rdws.rd.go.th/ServiceRD/CheckTINPINService/ServicePIN");
        
        message.saveChanges();
        System.out.println("REQUEST:");
        //Display Request Message
        displayMessage(message);
        
        System.out.println("\n\n");
        //add code below for trust x.509 ceritficate
            XTrustProvider.install(); 
        SOAPConnection conn = 
SOAPConnectionFactory.newInstance().createConnection();
        SOAPMessage response = conn.call(message, 
"https://rdws.rd.go.th/ServiceRD/CheckTINPINService.asmx");
        
        System.out.println("RESPONSE:");
        //Display Response Message
        displayMessage(response);
    }
    
    public void displayMessage(SOAPMessage message) throws Exception {
        TransformerFactory tFact = TransformerFactory.newInstance();
        Transformer transformer = tFact.newTransformer();
        Source src = message.getSOAPPart().getContent();
        StreamResult result = new StreamResult( System.out );
        transformer.setOutputProperty(OutputKeys.ENCODING, "tis-620");
        transformer.transform(src, result);
    }
    public static void main(String[] args) throws Exception {
        CheckPinRDWS clientApp = new CheckPinRDWS();
        clientApp.msgEnvelope(args);
    }
}

ผลลัพธ์ีที่ได้เมื่อหมายเลขบัตรประจำตัวประชาชนถูกต้อง

ผลลัพธที่ได้เมื่อหมายเลขบัตรประจำตัวประชาชนไม่ถูกต้อง

tr's picture

อันนี้เอาไปไว้ Codenode ดีกว่ารึเปล่าครับ?

mk's picture

ผมเข้าใจว่าชื่อ “กรมสรรพากร” มากกว่ารึเปล่าครับ

krunapon's picture

ขอบคุณค่ะ แก้ไขแล้วค่ะ คุณ mk

krunapon's picture

คุณ tr ค่ะ ถ้าเอาไปไว้ที่ codenone เอาไปไว้ในส่วนไหนดีคะ ที่เอาไว้ blognone เพราะคิดว่าจะเป็นประโยชน์กับคนไอทีโดยทั่วไปด้วยค่ะ

lew's picture

ผมว่าไว้ตรงนี้ก็ได้ล่ะครับ เรามีเซ็คชั่น In-Depth ไว้คุยเรื่องพวกนี้กันอยู่แล้ว

ส่วนถ้าจะเอาไปโพส Codenone อีกครั้งก็ตามสะดวกครับ


LewCPE

smilelovehappiness's picture

codenone ดีกว่า นี่มันเขียนโปรแกรมเลยนา…. ถ้าจะลง blognone น่าจะเขียนแค่ว่ากรมสรรพากรให้บริการ web service สำหรับเชค ID แล้ว อะไรประมาณนี้อะค่ะ

ps. เพิ่งรุ้ว่าเขาเปิดบริการนี้แล้ววันนี้นะเนี่ยะ ขอบคุณนะคะ

audy's picture

ถามเพิ่มนิดนึงนะครับ

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

sugree's picture

กรมสรรพากรมีเอกสาร API มั๊ยครับ

ผมอยากได้ REST หรืออย่างน้อยก็ XML-RPC มากกว่า SOAP นะเนี่ย

wiennat's picture

มีเอกสารสำหรับ SOAP นะครับ ถ้าจำไม่ผิด

mk's picture

เห็น import แล้วปาดเหงื่อ

Luzif3r's picture

รู้สึกว่า จะ check แค่ digit นะครับ มั่วๆไป มันก็ยังได้

ส่วน API ลองเข้าไปดูได้ที่ Web เลยอะครับ WebService มันจะมีหลายอย่างเหมือนกัน

moniguna's picture

ถ้า check แค่ digit ล่ะก็… เมื่อก่อนผมก็เคยทำครับ มีสูตรตายตัวเลยครับ

pphetra's picture

ไม่ชอบ response ที่ส่งกลับมาเลย มันมี element ที่ไม่เกี่ยวกับผลลัพท์ที่ต้องการรู้เยอะไปหน่อย (เช่น diffgram, newDataSet)

krunapon's picture

ไม่ได้ตรวจสอบแค่ digit ค่ะ อาจจะบังเอิญว่ามีคนที่มีบัตรประจำตัวประชาชนหมายเลข3000000000005 แต่ถ้าทดสอบด้วยการเปลี่ยนแค่ digit หลังเป็น 1-4 เป็น PIN 3000000000001 -3000000000004 สิ่งที่เว็บเซอร์วิสให้ผลกลับมาคือ

“เลข PIN ไม่ถูกต้อง เนื่องจาก หมายเลขPINเป็นตัวอักษรหรือเลขPINเป็นตัวอักษรหรือจำนวนหลักเท่ากับ13หลักหรือรูปแบบ PINไม่ถูกต้อง”

ในเรื่องของ response ที่ส่งกลับมา เห็นด้วยค่ะว่าชื่ออิลิเมนต์เยอะไป และไม่สื่อความหมาย

smilelovehappiness's picture

ขอโทษนะคะ แต่บ.เรามี algo สำหรับตรวจสอบว่าเลขบัตรประชาชนเป็นเลขที่ถูกต้อง “ตามหลัก” ของเลขบัตรประชาชนมั้ย (ขอกรมสรรพากรมา) ซึ่งพอใช้ตัวนี้ 3000000000005 ก็ถูกต้องตามหลักค่ะ และ 3000000000001 - 4 ก็ไม่ถูกต้องค่ะ ซึ่งสามารถตรวจสอบได้โดยไม่ต้องเชคกับ DB เลยว่ามีจริงหรือไม่นะคะ แค่คำนวนตัวเลขเอา ดังนั้นการทดสอบตรงนี้บอกไม่ได้ค่ะว่าเชคกับ db ของกรมแล้ว มีใช้จริงหรือเปล่า

audy's picture

อยากทราบอัลกอริทึมที่ว่าจังเลยครับ พอจะเปิดเผยได้มั๊ย

lew's picture
def f(S):return 11 - (sum([int(s)*(len(S)-i+1) for (s,i) in zip(S,range(len(S)))]) % 11)

จัดให้ครับ ใส่ string ของ 12 ตัวแรกแล้วมันจะ return ตัวที่ 13 ออกมาให้ครับ

ที่มา - Choopong


LewCPE

b39ppr's picture

ผมเข้าใจว่ามันเป็นความลับอยู่เหมือนกันนะครับ

audy's picture

ลองค้นดูครับ มีออกเยอะพอสมควร

krunapon's picture

โอเปอเรชันต่าง ๆ สามารถดูได้ที่ http://www.rd.go.th/webservice

เอกสารการเรียกใช้เว็บเซอร์วิสของกรมสรรพากร สามารถดาวน์โหลดได้จาก

http://www.rd.go.th/webservice/new/manual_php.pdf

และคิดว่าไม่มีการให้บริการแบบ REST Web Service มีแต่แบบ SOAP Web Service

krunapon's picture

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

หากท่านใดที่ต้องการจะทราบว่าข้อมูลที่ส่งค่ามาจากการตรวจสอบนั้น เอามาจากไหน ควรจะติดต่อถามที่ กรมสรรพากร The Revenue Department โทร. 0-2272-8000 อีเมล์ : webmaster@rd.go.th

audy's picture

ก่อนอื่นต้องขอบคุณสำหรับการแบ่งปันและแลกเปลี่ยน

บริการนี้น่าสนใจมาก สำหรับผู้ที่ต้องการตรวจสอบความถูกต้อง ของข้อมูลสมาชิก ในกรณีที่เก็บข้อมูลบัตรประชาชน (เก็บข้อมูลสมาชิกเยอะ ๆ ตามพรบ.คอมพิวเตอร์ฉบับใหม่)

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

มันยังไม่เพียงพอครับ

อยากได้แบบนี้ครับ

http://www.khonthai.com/Election/lles/detail.php

ไม่รู้ว่าหน่อยงานไหน จะให้บริการหรือเปล่า

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

rdwebmaster's picture

ขอบคุณทุกๆ ความคิดเห็นที่มีต่อ Web Services กรมสรรพากรค่ะ ต้องขอบอกว่าเป็นการตรวจสอบแค่ Digit ทั้งเลขประจำตัวประชาชน (PIN) และเลขประจำตัวผู้เสียภาษีอากร (TIN) ไม่สามารถให้บริการแบบเป็นการทั่วไปได้มากกว่านี้ถึงแม้เราจะมีข้อมูลอยู่ก็ตาม มีปัญหาเรื่องข้อบังคับของกฏหมายค่ะ ในส่วนของการตรวจสอบเลขประจำตัวประชาชน พวกคุณอาจจะคิดว่าไม่มีประโยชน์ถ้าให้บริการเท่านี้เพราะสามารถหาจากที่อื่นๆ ก็ได้ แต่การตรวจสอบเลขประจำตัวผู้เสียภาษีมีประโยชน์มากสำหรับผู้ประกอบธุรกิจ เพราะสามารถตรวจสอบได้ว่าผู้ที่ตนเองติดต่ออยู่ด้วยใช้เลขประจำตัวผู้เสียภาษีที่ถูกต้อง และมีอยู่จริงในฐานข้อมูลกรมสรรพากร เอาใว้ตรวจสอบพวกออกใบกำกับภาษีปลอมได้ ส่วน response ที่มี element ส่วนเกิน จะรับไว้พิจารณาแก้ไขค่ะ

lew's picture

โอ้ มีคนทำงานจริงมาอธิบายด้วย ขอบคุณครับ :)


LewCPE

audy's picture

โอ้! แจ๋ว

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

และสิ่งที่ผมอยากได้ ก็ไม่ได้คาดหวังว่าจะได้จากกรมสรรพากรหรอกครับ

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

krunapon's picture

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

ขอบคุณทุกท่านที่เข้ามาแลกเปลี่ยนข้อคิดเห็นค่ะ

rdwebmaster's picture

ขอแนะนำอีก 1 บริการของกรมสรรพากรค่ะ เผื่อจะนำไปใช้ประโยชน์กันได้บ้าง คือ Vat Refund for Tourist Info ซึ่งให้บริการข้อมูลผู้ประกอบการ ที่ได้รับสิทธิเมื่อนักท่องเที่ยวต่างประเทศ ซื้อสินค้าแล้วสามารถเรียกคืนภาษีมูลค่าเพิ่มได้ในภายหลัง โดยให้บริการสำหรับผู้ที่ต้องการนำข้อมูลดังกล่าวไปให้บริการนักท่องเที่ยวเพื่อตรวจสอบร้านค้าที่นักท่องเที่ยวสามารถเรียกคืนภาษีมูลค่าเพิ่มได้ถูกต้องตามกฎหมายซึ่งป้องกันการแอบอ้างจากร้านค้าซึ่งจะเป็นปัญหาต่อนักท่องเที่ยวในภายหลัง และให้นักท่องเที่ยวมีความมั่นใจในการซื้อสินค้าจากร้านดังกล่าว คิดดูว่าจะดีแค่ไหนถ้าเราเป็นบริษัทนำเที่ยวแล้วสามารถเรียกใช้ Web Services กรมสรรพากรไปเชื่อมโยงกับภาพแผนที่คล้ายๆ Google Earth นักท่องเที่ยวต่างชาติเข้ามาดูในเว็บ คลิกดูได้ว่ารายการนำเที่ยวที่เราจัดให้ในจังหวัดนี้ ถนนนี้ มีร้านค้าชื่ออะไรบ้าง ตั้งอยู่ตรงส่วนไหนของถนน ที่สามารถซื้อสินค้าแล้วได้รับภาษีมูลค่าเพิ่มคืน

Site Search

 
Web blognone.com

Poll