แนวทางการใช้งาน Tracking API ของไปรษณีย์ไทย เบื้องต้น

06 November 2019 By Ninenik Narkdee
tracking api ไปรษณีย์ไทย thailand post web service

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ tracking api ไปรษณีย์ไทย thailand post web service



เนื้อหาต่อไปนี้ เราจะมาดูแนวทางการใช้งาน API Web service 
เกี่ยวกับการใช้งาน Tracking API ในการติดตามพัสดุ การจัดส่งสิ่งของ 
ของการไปรษณีย์ไทย
 
 

สมัครสมาชิก

    ก่อนที่เราจะใช้งาน API ของทางไปรษณีย์ได้ ก่อนอื่น ก็ให้ทำการสร้างบัญชีผู้ใช้ ก่อน โดยไปที่ 
    สร้างบัญชีสมาชิก https://track.thailandpost.co.th/register ทำการสมัครสมาชิก
และล็อกอินเข้าใช้งานให้เรียบร้อย
 
 

ทำความเข้าใจ คู่มือ API Documentation

    หลังจากทำการสมัครสมาชิกและล็อกอินเข้าใช้งาน เรียบร้อยแล้ว ต่อไปเรามาทำความเข้าใจเกี่ยวกับการใช้งาน API ผ่าน
API Documentation หรือคู่มือการใช้งานเบื้องต้น https://track.thailandpost.co.th/developerGuide
ในที่นี้เราจะสนใจเฉพาะหัวข้อ API Console, API REST และ WEB HOOK
    ในส่วนของ API Console จะเป็นการทำความเข้าใจเกี่ยวกับรหัส และสถานะ ประกอบด้วย Status item และ Status Code
เป็นส่วนที่ใช้งานร่วมกับ API Rest และ WEB Hook
 
 
 
 

การใช้งาน RESTful API

    เป็นรูปแบบการเรียกดูข้อมูลการติดตามพัสดุ ผ่านการเรียกใช้งาน Web service โดยเราต้องทำการ ส่ง Request ไปยัง Endpoint URL
ที่ทางไปรษณีย์กำหนด โดยจะมี Token key ที่จะส่งไปใน Headers และ มี Parameter 3 ค่า [status, language, barcode] ที่ส่งไปใน
ส่วนของ Body  จากนั้น เราจะได้รับ Response หรือข้อมูลตอบกลับมาในรูปแบบ JSON String Data  ซึ่งในที่นี้เราจะใช้ PHP ในการจัด
การ โดยจะแปลงเป็น Array เพื่อนำไปใช้งานต่อ
 

    ส่วนของการ Request

 URL
Endpoint: https://trackapi.thailandpost.co.th/post/api/v1/track
Method: POST
 Headers
Authorization: Token (Your-Token-Key)
Content-Type: application/json
 Parameters



 
Body
{
   "status": "all",
   "language": "TH",
   "barcode": [
       "EY145587896TH",
       "RC338848854TH"
  ]
}
   

    การตอบกลับ Response

Parameters


 
Body
{
    "response": {
        "items": {
            "ED852942182TH": [
                {
                    "barcode": "ED852942182TH",
                    "status": "103",
                    "status_description": "รับฝาก",
                    "status_date": "19/07/2562 18:12:26+07:00",
                    "location": "คต.กาดสวนแก้ว",
                    "postcode": "00131",
                    "delivery_status": null,
                    "delivery_description": null,
                    "delivery_datetime": null,
                    "receiver_name": null,
                    "signature": null
                },
                {
                    "barcode": "ED852942182TH",
                    "status": "201",
                    "status_description": "ส่งออกจากที่ทำการกลางทาง",
                    "status_date": "20/07/2562 15:12:15+07:00",
                    "location": "คต.กาดสวนแก้ว",
                    "postcode": "00131",
                    "delivery_status": null,
                    "delivery_description": null,
                    "delivery_datetime": null,
                    "receiver_name": null,
                    "signature": null
                },...
            ]
        },
        "track_count": {
            "track_date": "27/08/2562",
            "count_number": 48,
            "track_count_limit": 1500
        }
    },
    "message": "successful",
    "status": true
}
 
    ลำดับของการทำงานในรูปแบบ RESTful API ในขั้นตอนแรก เราทำการขอรับ Token โดยส่ง Request ไป โดย Token ที่ได้รับจะหมด
อายุภายใน 1 เดือนหลังจากเราทำการส่งคำร้องขอไป และได้รับข้อมูลมา ซึ่งค่า Token นี้เราต้องทำการร้องขอใหม่ทุกๆ 1 เดือน แต่ในที่นี้
เราจะประยุกต์ให้ทำการดึงข้อมูลใหม่อัตโนมัติเมื่อค่าเดิมหมดอายุ จะอธิบายเพิ่มเติมในโค้ด  หลังจากเรา Token มาก็ทำการส่ง Request 
เพื่อเรียกดูข้อมูลการติดตามพัสดุ อีกครั้งโดยส่งค่า Token ที่ได้ไปพร้อมกับ Parameter เพิ่มเติมตามที่กำหนด หากไม่มีอะไรผิดพลาด เราก็
จะได้รับข้อมูลตอบกลับในรูปแบบข้อมูล JSON หรือ JSON String Data ซึ่งเราจะใช้ PHP จัดการแปลงเป็น Array เพื่อนำไปอ้างอิงใช้งานต่อ
หรือกรณีเรานำไปใช้กับ JavaScript ก็สามารถแปลงกลับได้ด้วยฟังก์ชั่น json_encode() 
    ในขั้นตอนการ Request เพื่อร้องขอดูข้อมูลสถานะพัสดุ จะมีรูปแบบอยู่ 2 กรณีคือ 
        1. กรณีที่เราส่งจำนวนของรหัสพัสดุไม่เกิน 100 รายการ จะมีการยิง URL ไปที่ 
        https://trackapi.thailandpost.co.th/post/api/v1/track
        และมีการตอบกลับข้อมูลมาใน HTTPResponse ทั้งหมด เราสามารถนำค่าไปใช้งานได้ทันที
        2. กรณีที่เราส่งจำนวนของรหัสพัสดุไปมากกว่า 100 รายการ จะมีการยิง URL ไปที่ 
        https://trackapi.thailandpost.co.th/post/api/v1/track/batch
        และมีการตอบกลับข้อมูลมาใน HTTPResponse บางค่ากลับมา เพื่อใช้ตรวจสอบ ส่วนข้อมูลจะถูกส่งไปยัง Email 
        ในรูปแบบ Link File Download สำหรับให้กดเข้าไปดาวน์โหลดอีกที
 

    การตอบกลับ Response กรณีส่งแบบ Batch หรือมากกว่า 100 รายการ

Parameters

Body
{
    "response": {
        "items": [],
        "track_count": {
            "track_date": "27/08/2562",
            "count_number": 49,
            "track_count_limit": 1500
        }
    },
    "message": "successful",
    "status": true
}
 
 

การใช้งาน Webhook

    การรับข้อมูลพัสดุด้วยรูปแบบ Webhook เป็นการรอรับข้อมูลการติดตามพัสดุ ที่เราได้ทำการส่งรหัสพัสดุที่ต้องการรับข้อมูลไปยังไปรษณีย์
และเมื่อรายการพัสดุนั้นๆ มีการอัพเดทสถานะ ทางไปรษณีย์ก็จะทำการ hook หรือส่งข้อมูลกลับมายัง URL ที่เรากำหนดในหน้าจัดการ ทำให้เรา
ไม่จำเป็นต้องทำการ Request ข้อมูลหลายๆ รอบเพื่อตรวจสอบสถานะของพัสดุ เหมาะสำหรับนำไปประยุกต์ใช้กรณีต้องการส่งต่อข้อมูลที่อัพเดท
ให้กับผู้ใช้งาน เช่น การประยุกต๋์ใช้งานกับ Line Notify เป็นต้น  หรือเราจะนำมาใช้งามร่วมกับฐานข้อมูล เช่น เมื่อมีการส่งข้อมูลอัพเดทสถานะกลับ
มา เราก็สามารถทำการให้ไปอัพเดทสถานะพัสดุในระบบฐานข้อมูลของเรา เวลาแสดงให้ผู้ใช้ทั่วไป ก็ใช้ข้อมูลจากฐานข้อมูลของเราแทน เป็นต้น
    สำหรับการใช้งาน webhook สิ่งแรกคือเราต้องมีไฟล์ สำหรับรับข้อมูล และมี URL ที่อ้างอิงตำแหน่งไฟล์นั้นใน server ของเรา ในที่นี้ จะให้แนว
ทางไฟล์เพียงการรับค่าเท่านั้น ไม่ได้แนะนำถึงข้อมูลการประยุกต์เพิ่มเติม 
    สมมติเราใช้ไฟล์ชื่อว่า track_webhook.php แล้วอัพโหลดไปใน root ของ server และได้ URL สำหรับนำไปกำหนด เป็น
    https://www.mywebsite.com/track_webhook.php 
 
    เราก็สามารถไปกำหนดในหน้าจัดการเป็นดังนี้ ได้
 

 
 
    สำหรับการกำหนด Authorization: Bearer ในบาง server หรือบางรูปแบบการใช้งาน จะมีค่านี้ส่งมาด้วย เพื่อใช้ในการตรวจสอบ
ความถูกต้องของข้อมูล เช่น ในการใช้งาน NodeJS เป็นต้น แต่ใน PHP อาจจะไม่มีค่านี้มาใน header โดยเราอาจจะใช้เป็นค่าอื่นในการาตรวจสอบ
เช่นใช้ Host เป็นต้น ตามต้วอย่างด้านล่าง
 
    ตัวอย่างโค้ดไฟล์ track_webhook.php เบื้องต้นสำหรับทดสอบดูค่าที่ถูกส่งมา โดยใช้การเก็บเป็นไฟล์ text
 
<?php
$headers = getallheaders(); // ได้ค่า array ของส่วน Headers ที่ถูกส่งมา
// ทดสอบเก็บส่วนของข้อมูลลงในไฟล์ เพื่อดูว่า มีการส่งค่ากลับมาหรือไม่ และส่งค่าอะไรกลับมา
file_put_contents('headers.txt',json_encode($headers, JSON_PRETTY_PRINT)); // ส่วนสำหรับใช้ตรวจสอบเพิ่มเติม
file_put_contents('body.txt',file_get_contents('php://input')); // ส่วนของ body เป็นส่วนที่จะใช้งานถ้ามีข้อมูล
?>
 
    ตัวอย่างการประยุกต์อย่างง่าย เช่นการตรวจสอบ header ที่ส่งมาเป็น host ของเราหรือไม่ 
    ข้อมูล Header ที่ถูกส่งมา
 
{
    "Accept-Charset": "UTF-8",
    "Content-Type": "application\/json",
    "Charset": "UTF-8",
    "Accept": "*\/*",
    "User-Agent": "*",
    "Host": "www.mywebsite.com",
    "Connection": "keep-alive",
    "Content-Length": "376",
    "X-Https": "1"
}
 
    ตัวอย่างการตรวจสอบ headers และแนวทางการใช้งานข้อมูลที่ส่งมา ไฟล์ track_webhook.php
 
<?php
// โค้ดไฟล์ dbconnect.php ดูได้ที่ http://niik.in/que_2398_5642
// require_once("dbconnect.php"); // กรณีเชื่อมหรือประยุกต์กับฐานข้อมูล

$headers = getallheaders(); // ได้ค่า array ของส่วน Headers ที่ถูกส่งมา
if(isset($headers) && isset($headers["Host"]) && $headers["Host"]=="www.mywebsite.com"){
	if(isset($_POST)){ // เมื่้อมีการส่งข้อมูลกลับมา
		$result = json_decode(file_get_contents('php://input'),TRUE); // แปลงข้อมูลเป็น array
		// จะได้ array ของข้อมูล
		 if(!is_null($result) && array_key_exists('items',$result)){
			 foreach($result['items'] as $key=>$data){ // วนลูปนำข้อมูลไปใช้งาน 
				 echo $data['barcode']."\r\n"; // ทดสอบแสดงข้อมูล
			 }
		 }
	}
}
?>
 
    ลำดับการทำงานในการใช้งานในรุปแบบ Webhook หลังจากที่เราได้กำหนด URL webhook ในหน้าจัดการเรียบร้อยแล้ว เราจะต้องทำการ
ร้องขอ Token สำหรับใช้ในการส่งรหัสพัสดุ ไปให้กับทางไปรษณีย์ เพื่อบอกว่า เราต้องการรับข้อมูลของรหัสพัสดุอะไรบ้างที่มีการอัพเดท
โดยค่า Token ในส่วนนี้ จะเป็นคนละค่ากับกรณีที่ใช้ใน RESTful API อย่างไรก็ตามในส่วนนี้ เราได้ทำการจัดการไว้ในโค้ดสำหรับร้องขอ Token
ไว้เรียบร้อยแล้ว จะมีอธิบายในโค้ดในลำดับต่อไป  Token ในส่วนนี้จะมีอายุ 1 เดือนและต้องร้องขอใหม่ทุกๆ ครบ 1 เดือน (มีการจัดการการ
ขอรับ token ใหม่ให้ในโค้ดแล้ว)  หลังจากได้ Token เราก็ทำการส่ง HookTrack Request เพื่อส่งรหัสพัสดุที่ต้องการรับข้อมูลอัพเดท หาก
ประยุกต์ใช้งานร่วมกับฐานข้อมูล เราสามารถใช้รหัสพัสดุเป็น Key อ้างอิงในการอัพเดทข้อมูลในฐานข้อมูลได้
 

    ส่วนของการ Request สำหรับ HookTrack

จะเหมือนกับ การใช้งาน RESTful API กรณี getItems ทุกอย่าง แตกต่างแค่ Endpont URL
ที่จะเปลี่ยนจาก 
         https://trackapi.thailandpost.co.th/post/api/v1/track 
        เป็น https://trackwebhook.thailandpost.co.th/post/api/v1/hook
 

    การตอบกลับ Response สำหรับ HookTrack 

Parameter
 

 
Body
{
    "response": {
        "items": [
            {
                "barcode": "EW836495818TH",
                "status": true
            },
            {
                "barcode": "EW296489328TH",
                "status": true
            },
            {
                "barcode": "EW689772000TH",
                "status": true
            }
        ],
        "track_count": {
            "track_date": "04/09/2562",
            "count_number": 0,
            "track_count_limit": 1000
        }
    },
    "message": "successful",
    "status": true
}
 
    ส่วนของ Response จะเป็นข้อมูลรหัสพัสดุที่เราทำการส่งไปยัง ไปรษณีย์ เพื่อขอให้ส่งข้อมูลของรหัสพัสดุเหล่านี้ ถ้ามีการอัพเดทกลับมา
ในขั้นตอนนี้ เราสามารถ วนลูปเอารหัสพัสดุที่เราส่งไป ทำการบันทึกลงฐานข้อมูล เพื่อรอรับค่าเพิ่มเติม ที่จะมีการส่ง Hook กลับมา แล้วเราก็
นำค่านั้นมาทำการอัพเดท โดยอ้างอิงฟิลด์รหัสพัสดุ เป็น key ในการอัพเดทข้อมูลได้ ตัวอย่างบางส่วน
 
<?php
$tokenKey = "Token ในหน้าจัดการ ของ สมาชิก";
$tokenPath = "savetoken/mytoken_hook.log"; // path ที่เราจะเก็บข้อมูล token ที่ gen
$tracking = new TrackingAPI($tokenKey, $tokenPath, true);
$barcode = array(
	"EW836495818TH",
	"EW296489328TH",
	"EW689772000TH"
);
$result = $tracking->hookTrack($barcode);
// จะได้ array ของข้อมูล
 if(!is_null($result) && array_key_exists('response',$result)){
     $response = $result['response'];
     if(!is_null($response) && array_key_exists('items',$response)){
    	 foreach($response['items'] as $key=>$data){
    		 echo $data['barcode']."\r\n";
			 // อาจจะประยุกต็์วันลูป รายการ เพื่อบันทึกลงฐานข้อมูล ว่ามีรหัสใดบ้าง ที่เราขอรับข้อมูล จาก hook data
    	 }
     }
 }
?>
 
    เรามาดูตัวอย่างโครงสร้างของ HookData ที่จะถูกส่งมายังไฟล์ track_webhook.php เมื่อมีการอัพเดทหรือเปลี่ยนแปลงสถานะของรหัสพัสดุ
 
Parameters
 
 
Body
{
  "items": [
    {
      "barcode": "EF023395845TH",
      "status": "103",
      "status_description": "รับฝาก",
      "status_date": "04/06/2562 15:53:22+07:00",
      "location": "ศูนย์ศิลปาชีพบางไทร",
      "postcode": "13290",
      "delivery_status": null,
      "delivery_description": null,
      "delivery_datetime": null,
      "receiver_name": null,
      "signature": null
    },
    {
      "barcode": "ET180232600TH",
      "status": "201",
      "status_description": "อยู่ระหว่างการขนส่ง",
      "status_date": "05/06/2562 14:42:03+07:00",
      "location": "ศูนย์ศิลปาชีพบางไทร",
      "postcode": "13290",
      "delivery_status": null,
      "delivery_description": null,
      "delivery_datetime": null,
      "receiver_name": null,
      "signature": null
    }
  ],
  "track_datetime": "10/09/2562 10:17+07:00"
}
 
    ทั้งหมดข้างต้น เป็นแนวทางหรือรูปแบบการทำงานของ RESTful API และ Webhook ที่เราจะได้นำมาปรับใช้งาน
 
 

สร้าง TrackingAPI Class

    เพื่อให้การจัดการเกี่ยวกับ การใช้งาน Tracking API ของไปรษณีย์ไทย เป็นไปอย่างสะดวก จึงได้ทำการสร้าง class สำหรับใช้งานอย่าง
ง่าย สามารถนำไปปรับปรุง ดัดแปลง ใช้งานได้ตามต้องการ โดย class ต่อไปนี้ จะรองรับการใช้งาน API การ Request ที่สำคัญเกือบทั้งหมด
ไม่ว่าจะเป็นการขอรับ Token การขอรับข้อมูลการติดตามสถานะพัสดุแบบ Realtime แบบ getItems สำหรับรายการไม่เกิน 100 รายการ และการ
ใช้งาน RequestItems สำหรับรายการที่มากกว่า 100 รายการขึ้นไป รองรับทั้ง RESTful API แลพ Webhook
    ในส่วนของ Token ให้เราทำความเข้าใจอย่างง่ายดังนี้คือ จะมี Token อยู่สองส่วน ส่วนแรก เป็น Token ที่เป็น static หรือค่าคงที่ ที่เราสามารถ
ทำการสร้าง เปลี่ยนแปลงได้ในหน้าจัดการของสมาชิก เป็นค่า ที่เราต้องไปทำการสร้าง และบันทึก ในตอนเริ่มต้นการใช้งาน API 
ส่วน Token ส่วนที่สอง ที่เราต้องไปทำการ Request มา ทั้งใน RESTful API และ Webhook เป็น generate Token ที่มีอายุการใช้งาน 1 เดือนหลัง
จากทำการ generate ค่ามา ซึ่งใน TrackingAP Class เราได้ทำการใช้งานการสร้างไฟล์ขึ้นสำหรับเก็บค่านี้ โดยใข้วิธีเขียนไฟล์เก็บวันที่หมดอายุ
กับข้อมูล Token ไว้ในไฟล์ และเมื่อมีการร้องขอ Token เราก็จะตรวจสอบก่อนว่า มีข้อมูลเดิมอยู่แล้วหรือไม่ และเป็นข้อมูลที่ยังไม่หมดอายุหรือไม่
ถ้าเข้าเงื่อนไข ก็นำ Token นั้นมาใช้งานทันทีโดยไม่ต้อง Request ไปที่ไปรษณีย์  แต่ถ้าเป็นข้อมูลหมดอายุแล้ว เราก็จะทำการให้ไปเรียก method
หรือฟังก์ชั่นไปดึงค่าใหม่มา จากนั้นก็เขียนข้อมูลทับลงไปแทนข้อมูลเดิม เพื่อให้ใช้งานต่อไปเรื่อยๆ ได้
    
    ไฟล์ trackingAPI.php
 
<?php
//  trackingAPI class
class TrackingAPI
{
    private $_TOKEN_KEY; // static token ในหน้าจัดการของสมาชิก
	private $_TOKEN_PATH; // path ไฟล์สำหรับเก็บ Token
	private $_WEBHOOK; // ใช้งาน webhook หรือไม่
     
	 // constructor
    public function __construct($_TOKEN_KEY, $_TOKEN_PATH, $_WEBHOOK = NULL)
    {
        $this->_TOKEN_KEY = $_TOKEN_KEY;
		$this->_TOKEN_PATH = $_TOKEN_PATH;
		$this->_WEBHOOK = $_WEBHOOK;
    }   
	
	// ฟังก์ชั่นสำหรับเรียกดูข้อมูล Token ล่าสุด
	public function  getLastToken(){
		if(@file_exists($this->_TOKEN_PATH)){
			list($expire,$token) = explode("\n",file_get_contents($this->_TOKEN_PATH));
			if(time()>strtotime($expire)){ // ถ้าหมดอายถ ให้ไป request ใหม่ 
				$dataToken = $this->getToken();
				if(isset($dataToken)){
					$accToken = $dataToken['token'];
					$token = implode("\r\n",$dataToken);
					$this->saveToken($token);
					return $accToken;
				}else{
					return NULL;	
				}				
			}else{
				return trim($token);
			}
		}else{
			$dataToken = $this->getToken();
			if(isset($dataToken)){
				$accToken = $dataToken['token'];
				$token = implode("\r\n",$dataToken);
				$this->saveToken($token);
				return $accToken;
			}else{
				return NULL;	
			}
		}
	}
	
	// ฟังก์ชั่นสำหรับ save Token ไปใน path ไฟล์ที่กำหนด
	public function saveToken($dataToken){
		return file_put_contents($this->_TOKEN_PATH,$dataToken);
	}
	 
	 // ฟังกด์ชั่นสำหรับ Request Token .ใหม่
    public function getToken($ssl = NULL)
    {
        $_SSL_VERIFYHOST = (isset($ssl))?2:0;
        $_SSL_VERIFYPEER = (isset($ssl))?1:0;

		if(isset($this->_WEBHOOK)){
			$tokenURL = "https://trackwebhook.thailandpost.co.th/post/api/v1/authenticate/token";
		}else{
        	$tokenURL = "https://trackapi.thailandpost.co.th/post/api/v1/authenticate/token";
		}
          
        $headers = array(
			'Authorization: Token '. $this->_TOKEN_KEY,
			'Content-Type: application/json'
        );
		$data = array();
         
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $tokenURL);
        curl_setopt( $ch, CURLOPT_POST, 1);
        curl_setopt( $ch, CURLOPT_POSTFIELDS,json_encode($data));
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $_SSL_VERIFYHOST);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $_SSL_VERIFYPEER);
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec( $ch );
        curl_close( $ch ); 
        $result = json_decode($result,TRUE);
        if(!is_null($result) && array_key_exists('token',$result)){
			return $result;
        }else{
            return NULL;    
        }       
    }
     
	 // getItems และ RequestItems
 	public function getItems($barcode = array(), $lang = "TH",$ststus = "all", $batch = NULL, $ssl = NULL)
    {
        $_SSL_VERIFYHOST = (isset($ssl))?2:0;
        $_SSL_VERIFYPEER = (isset($ssl))?1:0;
        $accToken = $this->getLastToken();
		if(isset($batch)){
        	$trackURL = "https://trackapi.thailandpost.co.th/post/api/v1/track/batch";
		}else{
        	$trackURL = "https://trackapi.thailandpost.co.th/post/api/v1/track";			
		}
         
        $headers = array(
			'Authorization: Token '. $accToken,
			'Content-Type: application/json'
        );

		$data = array(
			"status"=>$ststus,
			"language"=>$lang,
			"barcode"=>$barcode
		);
             
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $trackURL);
        curl_setopt( $ch, CURLOPT_POST, 1);
        curl_setopt( $ch, CURLOPT_POSTFIELDS,json_encode($data));
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $_SSL_VERIFYHOST);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $_SSL_VERIFYPEER);
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec( $ch );
        curl_close( $ch ); 
        $result = json_decode($result,TRUE);
        if(!is_null($result) && array_key_exists('status',$result)){
			return $result;
        }else{
            return NULL;    
        }     
    }
	
	// HookTrack Function
 	public function hookTrack($barcode = array(), $lang = "TH",$ststus = "all", $ssl = NULL)
    {
        $_SSL_VERIFYHOST = (isset($ssl))?2:0;
        $_SSL_VERIFYPEER = (isset($ssl))?1:0;
		
        $accToken = $this->getLastToken();
		$hookURL = "https://trackwebhook.thailandpost.co.th/post/api/v1/hook";			
         
        $headers = array(
			'Authorization: Token '. $accToken,
			'Content-Type: application/json'
        );

		$data = array(
			"status"=>$ststus,
			"language"=>$lang,
			"barcode"=>$barcode
		);
             
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $hookURL);
        curl_setopt( $ch, CURLOPT_POST, 1);
        curl_setopt( $ch, CURLOPT_POSTFIELDS,json_encode($data));
        curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, $_SSL_VERIFYHOST);
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, $_SSL_VERIFYPEER);
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1);
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec( $ch );
        curl_close( $ch ); 
        $result = json_decode($result,TRUE);
        if(!is_null($result) && array_key_exists('status',$result)){
			return $result;
        }else{
            return NULL;    
        }     
    }
	
}
?>
   ตัวอย่างการเรียกใช้งาน test_restfulapi.php
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

require_once("trackingAPI.php"); // TrackingAPI class

$tokenKey = "static token ในหน้าจัดการสมาชิก";
$tokenPath = "tokenFoler/mytoken.log"; // กำหนด path สำหรับสร้างไฟล์เก็บ token อย่าลืม permission 777 หรือ 755
$tracking = new TrackingAPI($tokenKey, $tokenPath);

// var_dump($tracking); // ทดสอบดูค่า

// รหัสพัสดุที่ต้องการตรวจสอบ
$barcode = array(
	"EW296489328TH",
	"EW689772000TH",
	"RE585D12409TH"
);
// echo $tracking->getLastToken(); // ค่า Token ที่ generate
$result = $tracking->getItems($barcode);

// จะได้ array ของข้อมูล
 if(!is_null($result) && array_key_exists('response',$result)){
     $response = $result['response'];
     if(!is_null($response) && array_key_exists('items',$response)){
    	 foreach($response['items'] as $barcode=>$datas){
			 echo "<hr>";
			 echo $barcode."<br>"; // รหัสพัสดุ
			 echo "<pre>";
			 if(is_array($datas)){
				 foreach($response['items'][$barcode] as $data){ // ข้อมูลของรหัสพัสดุ
					 echo $data['barcode']."<br>";
					 echo $data['status_description']."<br>";
				 }
			 }
			 echo "</pre>";
    	 }
     }
 }
?>
 
    กรณีเราต้องการแค่ค่า token สามารถใช้คำสั่งนี้ได้
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

require_once("trackingAPI.php"); // TrackingAPI class
$tokenKey = "static token ในหน้าจัดการสมาชิก";
$tokenPath = "tokenFoler/mytoken.log"; // กำหนด path สำหรับสร้างไฟล์เก็บ token อย่าลืม permission 777 หรือ 755
$tracking = new TrackingAPI($tokenKey, $tokenPath);
echo $tracking->getLastToken(); // ค่า Token ที่ generate
?>
 
    กรณีต้องการแสดง ภาษาอังกฤษ สามารถใช้เป็น
 
$result = $tracking->getItems($barcode, "EN");
 
    กรณีต้องการแสดงเฉพาะสถานะ "อยู่ระหว่างการขนส่ง" สามารถระบุรหัส 201 ดังนี้ได้
 
$result = $tracking->getItems($barcode, "EN", "201");
 
    กรณีต้องการรับเป็นไฟลฺ์ สำหรับตรวจสอบรหัสพัสดุมากกว่า 100 รายการ สามารถใช้แบบ batch ดังนี้
 
$result = $tracking->getItems($barcode, "TH", "all", TRUE);
 
    สำหรับการใช้งานการตรวจสอบมากกว่า 100 รายการ ค่า Response กลับมา จะไม่มีข้อมูลสถานะของรหัสพัสดุ
เราสามารถใช้สถานะการทำงาน มาเป็นเงื่อนไขแสดง เช่น ทำการส่งข้อมูลสำเร็จ ในรูปแบบดังนี้
 
    ไฟล์ test_restfulapi_batch.php
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

require_once("trackingAPI.php"); // TrackingAPI class

$tokenKey = "static token ในหน้าจัดการสมาชิก";
$tokenPath = "tokenFoler/mytoken.log"; // กำหนด path สำหรับสร้างไฟล์เก็บ token อย่าลืม permission 777 หรือ 755
$tracking = new TrackingAPI($tokenKey, $tokenPath);

// var_dump($tracking); // ทดสอบดูค่า

// รหัสพัสดุที่ต้องการตรวจสอบ มากกกว่า 100 รายการ
$barcode = array(
	"EV345151321TH",
	"EF589890162TH",
	"RE585512409TH",
	.......
	......
);
// echo $tracking->getLastToken(); // ค่า Token ที่ generate
$result = $tracking->getItems($barcode, "TH", "all", TRUE);

// จะได้ array ของข้อมูล
 if(!is_null($result) && array_key_exists('message',$result)){
    if($result['message']=="successful"){
		echo "Successful";
	}
 }
?>
    ตัวอย่างการใช้งาน webhook สำหรับส่ง HookTrack
    ไฟล์ test_hooktrack.php
 
<?php
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

require_once("trackingAPI.php"); // TrackingAPI class

$tokenKey = "Token ในหน้าจัดการ ของ สมาชิก";
$tokenPath = "savetoken/mytoken_hook.log"; // path ที่เราจะเก็บข้อมูล token ที่ gen
$tracking = new TrackingAPI($tokenKey, $tokenPath, true); // กำหนด true สำหรับใช้งาน webhook
$barcode = array(
	"EW836495818TH",
	"EW296489328TH",
	"EW689772000TH"
);
$result = $tracking->hookTrack($barcode);
// จะได้ array ของข้อมูล
 if(!is_null($result) && array_key_exists('response',$result)){
     $response = $result['response'];
     if(!is_null($response) && array_key_exists('items',$response)){
    	 foreach($response['items'] as $key=>$data){
    		 echo $data['barcode']."\r\n";
			 // อาจจะประยุกต็์วันลูป รายการ เพื่อบันทึกลงฐานข้อมูล ว่ามีรหัสใดบ้าง ที่เราขอรับข้อมูล จาก hook data
    	 }
     }
 }
?>
    ทั้งหมดเป็นแนวทางสำหรับนำไปประยุกต์ใช้งาน หากมีตัวอย่าง demo เพิ่มเติม จะได้นำมาอัพเดท อย่างไรก็ตาม จากที่ทดลองใช้งาน
พบว่า การ request ข้อมูลแต่ละครั้งในกรณี RESTful API จะนับทุก refresh หรือทุกๆ request เป้น 1 หาก request ครั้งละ 10 รายการ
ติดต่อกัน 10 ครั้ง ทั้งที่ได้ข้อมูลเดิมที่ยังไม่ได้อัพเดท จำนวน request ก็จะเพิ่มเป็น 10 * 10 หรือ 100 request  หากใช้งานสำหรับคนทั่วไป
ที่จำกัดที่ 1000 request อาจจะไม่เพียงพอ  ดังนั้น RESTful API อาจจะเหมาะสำหรับ backend ที่ใช้การ Request แล้วอัพเดทลงฐานข้อมูล
ส่วนผู้ใช้ทั่วไป ให้ใช้ค่าจากฐานข้อมูลแทน เพราะหากปล่อยให้ request แบบไม่จำกัด ก็อาจจะทำให้โควต้าสำหรับการใช้งานทั่วไปหมดเร็ว
ส่วนนี้เป็นความเข้าใจของผู้เขียน อาจจะผิดพลาดหรือเข้าใจผิด ก็ขอให้เป็นมูลเพิ่มเติมไว้พิจารณา
    ส่วนในกรณี webhook น่าจะเหมาะสำหรับ การ request วันละไม่เกิน 1000 รายการ โดยเราทำการส่ง hooktrack จำนวนของรหัสพัสดุ
ไปครั้งเดียว จากนั้นก็รอแค่ข้อมูล hook กลับมาอัพเดทค่าในฐานข้อมูลของเรา เพื่อนำไปใช้งานต่อไป  ส่วนนี้อาจจะช่วยได้ ในกรณีป้องกัน
ประมาณการ request ที่อาจจะเกินโควต้า
    หวังว่าจะเป็นประโยชน์ในการศึกษา ทำความเข้าใจ และประยุกต์ใช้งานต่อไป


อย่าลืมกด Like กด Share เป็นกำลังใจ ในการสร้างบทความใหม่ๆ น่ะครับ





Tags:: tracking api thailand post ไปรษณีย์ไทย web service







URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ