ในเนื้อหาตอนที่แล้ว เราได้รู้จักวิธีการใช้งาน Line Notify ในการรับการแจ้งเตือน ผ่าน
Application Line App สำหรับนักพัฒนา หรือกรณีใช้งานคนเดียว ไปแล้ว ในเนื้อหาต่อไปนี้
เราจะมาใช้บริการสร้าง Service ของ Line Notify ที่ให้ผู้ใช้ Line สามารถเข้ามาใช้งาน
การแจ้งเตือนได้ด้วยตัวเอง ผ่านบริการของเรา ยกตัวอย่าง สมมติ เช่น เรามีเว็บไซต์จำหน่ายสินค้า
หรือบริการ และอยากให้ลูกค้าสามารถรับการแจ้งเตือน การจัดส่งสินค้าแล้วหรือไม่ผ่าน Line Notify
เป็นต้น
โดยลำดับการทำงาน จะเป็นลักษณะดังนี้ คือ เมื่อผู้ใช้ต้องการรับการแจ้งเตือนทาง Line ก็ ให้
ทำการ authorize ในการใช้งานครั้งแรก โดยส่งผู้ใช้ ไปยังหน้าล็อกอินผ่านระบบ ของ Line
เพื่อเชื่อมต่อกับ Service ที่เราสร้างขึ้น ในขั้นตอน authorize เมื่อผู้ใช้ล็อกอิน ก็จะขึ้นให้ผู้ใช้เลือกว่าจะรับ
การแจ้งเตือนผ่าน Line Notify โดยตรง หรือผ่านการแจ้งเตือนในกลุ่มหรือห้องที่ใช้งานอยู่ ก็ได้
อย่าลืมว่า ต้องแจ้งให้ผู้ใช้เพิ่ม Line Notify เป็นเพื่อนก่อน หรือกรณีรับข้อความผ่านกลุ่ม ก็ต้องทำการ invite
"Line Notify" เข้าไปในกลุ่มก่อน ถึงจะสามารถรับการแจ้งเตือนได้
เมื่อผู้ใช้เลือกรูปแบบการรับการแจ้งเตือน และทำการ Authorize ผ่านแล้ว "Line Notify" ก็จะออก
"Access Token" ให้ เราสามารถนำค่า Token ที่ได้ไปบันทึกลงฐานข้อมูล อาจจะอ้างอิงกับ id ของผู้ใช้ ก็ได้ขึ้นกับการประยุกต์ใช้งาน
เช่น เพิ่มฟิลด์ Token เข้าไปในตารางผู้ใช้ เป็นต้น
เช่น เพิ่มฟิลด์ Token เข้าไปในตารางผู้ใช้ เป็นต้น
เวลาใช้งาน ก็แค่นำ Token ที่ได้บันทึกไว้ไปใช้ในส่วนของโค้ด ส่งการแจ้งเตือน โดยวิธีการส่งข้อมูล ก็จะใช้
วิธีเดียวกันกับบทความตอนที่แล้ว
ใช้งาน Line Notify เป็น push notification แจ้งเตือนผ่านมือถือ อย่างง่าย http://niik.in/829
https://www.ninenik.com/content.php?arti_id=829 via @ninenik
สำหรับที่เพิ่มเติมเข้ามาในเนื้อหาคือ เราสามารถตรวจสอบได้ว่า token ที่บันทึกไว้แล้วนั้น สามารถใช้งานได้หรือ
ไม่ ในกรณีเช่น ผู้ใช้ไปลบการเชื่อมต่อออก หรือมีการออก Token ใหม่ และอีกส่วนที่เพิ่มเข้ามาคือ การยกเลิก
การรับการแจ้งเตือนโดยผู้ใช้เองได้
ในที่นี้ขอแยกแต่ละไฟล์ ให้ง่าย และไม่ให้เนื้อหาซับซ้อนเกินไป เราจะมีไฟล์ด้วยกัน 5 ไฟล์
หลักๆ แล้วการทำงานก็จะคล้ายๆ กัน คือการใช้ฟังก์ชั่น cURL ทำการเชื่อมต่อรับส่งข้อมูลกับ Line Notify Api
ไฟล์ทั้ง 5 ประกอบด้วย
- authorize.php
- web_callback.php
- notify_service.php
- check_status.php
- notify_revoke.php
เวลาใช้งาน สามารถนำไปประยุกต์ รวมเป็น class ไว้เรียกใช้ก็ได้ โดยไฟล์ authorize.php จะเป็นไฟล์สร้างลิ้งค์
ยิงหน้าล็อกอินของ line โดยตรง เมื่อล็อกอินผ่านและเลือการเชื่อมต่อแล้ว ก็จะส่งค่าตัวแปร code กลับมา
ยังไฟล์ web_callback.php ซึ่งไฟล์นี้ เราจะต้องไปกำหนดใน url callback ในขั้นตอนการสร้าง Service ด้วย
เมื่อไฟล์ web_callback.php ได้ตัวแปร code มาก็จะเอาค่าตัวแปรนี้ ไปข้อรับ access token เมื่อเราได้รับ
ลค่า token แล้ว ก็สามารถนำไป
ใช้งานกับไฟล์ notify_service.php สำหรับส่งข้อความ
ใช้กับไฟล์ check_status.php สำหรับเช็คสถานะของ token
ใช้กับไฟล์ notify_revoke.php สำหรับยกเลิกการรับข้อความ หรือยกเลิก token
อธิบายคร่าวๆ เบื้องต้นไปแล้วต่อไปมาดูในรายละเอียด
เริ่มต้นก็ไปที่ลิ้งค์เดิม
หากยังไม่ล็อกอิน ให้ทำการล็อกอินเข้าระบบด้วยบัญชี line ของเราก่อน
คลิกที่ชื่อ ผู้ใช้หลังจากล็ฮกอินแล้ว เลือก "การจัดการบริการที่ลงทะเบียน" ดังรูป
เลือก "ลงทะเบียนบริการ"
กรอกข้อมูลการลงทะเบียนให้เรียบร้อย เปลี่ยนข้อมูลเป็นข้อมูลของเรา
ในส่วนของ Callback URL จะเป็น url สำหรับรับค่าค่าหลังจาก authorize เรียบร้อยแล้ว
ตามที่กล่าวไปแล้วในตอนต้น เราใช้ไฟล์ชื่อ web_callback.php
ตรวจสอบข้อมูลให้เรียบร้อยในหน้าถัดไป แล้วกด "ลงทะเบียน"
ระบบจะส่งอีเมลยืนยันไปยังอีเมลที่เรากำหนด เราต้องไปคลิกลิ้งค์เพื่อยืนยัน
ในอีเมลที่ได้รับอีกที จึงจะสามารถใช้บริการเว็บเซอร์วิสที่ลงทะเบียนได้
เมื่อทำตามขั้นตอนจนเสร็จแล้ว เราจะได้รายชื่อบริการที่ลงทะเบียนแสดงตามรูป
เราสามารถคลิกเข้าไปใน บริการที่เราสร้าง เพื่อแก้ไขหรืออัพเดทข้อมูล รวมถึงดูข้อมูล
ที่จำเป็นในการใช้งาน ซึ่ง มี
- Client ID
- Client Secret
- Callback URL
ค่า 3 ค่านี้เราจะเอาไปใช้งานในโค้ด
ไฟล์โต้ดตัวอย่างทั้งหมด
ไฟล์ dbconnect.php กรณีเชื่อมต่อกับฐานข้อมูล mysql
<?php $mysqli = new mysqli("localhost", "root","","test"); /* check connection */ if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } if(!$mysqli->set_charset("utf8")) { printf("Error loading character set utf8: %s\n", $mysqli->error); exit(); }
ไฟล์ authorize.php
<?php // ถ้ามีการใช้งาน session อย่าลืมเปิดใช้งาน session_start() // session_start(); // กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // กรณีมีการเชื่อมต่อกับฐานข้อมูล //require_once("dbconnect.php"); // http://php.net/manual/en/function.random-bytes.php function RandomToken($length = 32){ if(!isset($length) || intval($length) <= 8 ){ $length = 32; } if(function_exists('random_bytes')) { return bin2hex(random_bytes($length)); } if(function_exists('mcrypt_create_iv')) { return bin2hex(mcrypt_create_iv($length, MCRYPT_DEV_URANDOM)); } if(function_exists('openssl_random_pseudo_bytes')) { return bin2hex(openssl_random_pseudo_bytes($length)); } } // สร้างตัวแปร session ใช้สำหรับป้องกันการยิงข้อมูลแบบ CSRF $_SESSION['my_service_state_key'] = RandomToken(); // สร้าง Link ไปหน้าล็อกอินของ Line เพื่อขอ authorize อนุญาตการเข้าถึงข้อมูล เพื่อรับ access token $url = "https://notify-bot.line.me/oauth/authorize?". http_build_query(array( 'response_type' => 'code', // ไม่แก้ไขส่วนนี้ 'client_id' => 'กรอก client id ของ service ที่เราสร้าง', 'redirect_uri' => 'https://www.mywebsite.com/web_callback.php', 'scope' => 'notify', // ไม่แก้ไขส่วนนี้ 'state' => $_SESSION['my_service_state_key'] ) ); header("Location: {$url}"); // ยิงไปหน้าการเชื่อมต่อบริการ exit; ?>
ไฟล์ web_callback.php
<?php // ถ้ามีการใช้งาน session อย่าลืมเปิดใช้งาน session_start() // session_start(); // กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // กรณีมีการเชื่อมต่อกับฐานข้อมูล //require_once("dbconnect.php"); if(!isset($_SESSION['my_service_state_key']) || $_GET['state'] !== $_SESSION['my_service_state_key']){ if(isset($_SESSION['my_service_state_key'])){ unset($_SESSION['my_service_state_key']); } echo 'State Validation fail <br>'; echo '<a href="authorize.php"></a>'; exit; } // ทดสอบค่าที่ได้รับหลังจากทำการ authorize echo "<pre>"; print_r($_GET); if(!isset($_GET['error']) && isset($_GET['code']) && $_GET['code'] != ""){ $code = $_GET['code']; $tokenURL = "https://notify-bot.line.me/oauth/token"; $headers = array( 'Content-Type: application/x-www-form-urlencoded' ); $data = array( 'grant_type' => 'authorization_code', // ไม่แก้ไขส่วนนี้ 'code' => (string)$code, 'redirect_uri' => 'https://www.mywebsite.com/web_callback.php', 'client_id' => 'กรอก client id ของ service ที่เราสร้าง', 'client_secret' => 'กรอก client secret ของ service ที่เราสร้าง' ); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $tokenURL); curl_setopt( $ch, CURLOPT_POST, 1); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec( $ch ); curl_close( $ch ); // ตรวจสอบค่าข้อมูล ว่าเป็นตัวแปร ปรเภทไหน ข้อมูลอะไร var_dump($result); // การเช็คสถานะการทำงาน $result = json_decode($result,TRUE); // ดูโครงสร้าง กรณีแปลงเป็น array แล้ว echo "<pre>"; print_r($result); // ตรวจสอบข้อมูล ใช้เป็นเงื่อนไขในการทำงาน if(!is_null($result) && array_key_exists('status',$result)){ if($result['status']==200){ echo "Access token is: ".$result['access_token']; } } }else{ // กรณีเกิด error หรืออื่นๆ if(isset($_SESSION['my_service_state_key'])){ unset($_SESSION['my_service_state_key']); } echo 'Authorization fail <br>'; echo '<a href="authorize.php"></a>'; exit; } ?>
ไฟล์ notify_service.php
<?php // กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // กรณีมีการเชื่อมต่อกับฐานข้อมูล //require_once("dbconnect.php"); $accToken = "กรอก access token ของผู้ใช้ ที่ต้องการหรือดึงจากฐานข้อมูลมาใช้งาน"; $notifyURL = "https://notify-api.line.me/api/notify"; $headers = array( 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Bearer '.$accToken ); $data = array( 'message' => 'ทดสอบส่งข้อความ Line ', ); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $notifyURL); curl_setopt( $ch, CURLOPT_POST, 1); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec( $ch ); curl_close( $ch ); // ตรวจสอบค่าข้อมูล ว่าเป็นตัวแปร ปรเภทไหน ข้อมูลอะไร var_dump($result); // การเช็คสถานะการทำงาน $result = json_decode($result,TRUE); // ดูโครงสร้าง กรณีแปลงเป็น array แล้ว //echo "<pre>"; //print_r($result); // ตรวจสอบข้อมูล ใช้เป็นเงื่อนไขในการทำงาน if(!is_null($result) && array_key_exists('status',$result)){ if($result['status']==200){ echo "Notify Send Success"; } } ?>ไฟล์ check_status.php
<?php // กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // กรณีมีการเชื่อมต่อกับฐานข้อมูล //require_once("dbconnect.php"); $accToken = "กรอก access token ของผู้ใช้ ที่ต้องการหรือดึงจากฐานข้อมูลมาใช้งาน"; $statusURL = "https://notify-api.line.me/api/status"; $headers = array( 'Authorization: Bearer '.$accToken ); $data = array(); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $statusURL); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec( $ch ); curl_close( $ch ); // ตรวจสอบค่าข้อมูล ว่าเป็นตัวแปร ปรเภทไหน ข้อมูลอะไร var_dump($result); // การเช็คสถานะการทำงาน $result = json_decode($result,TRUE); // ดูโครงสร้าง กรณีแปลงเป็น array แล้ว //echo "<pre>"; //print_r($result); // ตรวจสอบข้อมูล ใช้เป็นเงื่อนไขในการทำงาน if(!is_null($result) && array_key_exists('status',$result)){ if($result['status']==200){ echo "Access token valid"; } } ?>
ไฟล์ notify_revoke.php
<?php // กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); // กรณีมีการเชื่อมต่อกับฐานข้อมูล //require_once("dbconnect.php"); $accToken = "กรอก access token ของผู้ใช้ ที่ต้องการหรือดึงจากฐานข้อมูลมาใช้งาน"; $revokeURL = "https://notify-api.line.me/api/revoke"; $headers = array( 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Bearer '.$accToken ); $data = array(); $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $revokeURL); curl_setopt( $ch, CURLOPT_POST, 1); curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec( $ch ); curl_close( $ch ); // ตรวจสอบค่าข้อมูล ว่าเป็นตัวแปร ปรเภทไหน ข้อมูลอะไร var_dump($result); // การเช็คสถานะการทำงาน $result = json_decode($result,TRUE); // ดูโครงสร้าง กรณีแปลงเป็น array แล้ว //echo "<pre>"; //print_r($result); // ตรวจสอบข้อมูล ใช้เป็นเงื่อนไขในการทำงาน if(!is_null($result) && array_key_exists('status',$result)){ if($result['status']==200){ echo "Access token Revoke"; } } ?>
สามารถดูรายละเอียดการเรียกใช้ api พร้อมกับข้อมูลของ parameter ต่างๆ เพิ่มเติมได้ที่ลิ้งค์
ตัวอย่างหน้าการขอ authorize เพื่อเชื่อมต่อกับเว็บเซอร์วิส และเลือกการรับการแจ้งเตือน
ตอนนี้เราได้แนวทางการจัดการต่างๆ เกี่ยวกับ การใช้งาน Line Notify เชื่อมกับบริการเว็บเซอร์วิสที่เราสร้าง
แล้ว หลักๆ ที่สำคัญ ก็คือ access token ของผู้ใช้ ที่เราจะต้องบันทึกไว้ เพื่อเรียกใช้งานในภายหลัง
และถ้าหากป้องกันการแก้ไข access token กรณีมีการขอ authorize ใหม่ เราอาจจะอัพเดทข้อมูล โดยอ้างอิง
จาก id ผู้ใช้ของระบบเรา ยกตัวอย่าง เช่น ตรวจสอบก่อนว่า user id นี้มีการบันทึก access token แล้วหรือไม่
ถ้ามีแล้ว ก็เช็คว่า access token นี้ยังใช้ได้หรือไม่ ถ้าใช่ไม่ได้แล้ว ก็ให้ทำการขอ authorize เพิ่มรับ access
token ใหม่ พอเราได้รับค่าใหม่ ก็เอาไปอัพเดท ทับค่าเดิม เป็นต้น