เชื่อมต่อ Line Notify กับผู้ใช้ Line รับการแจ้งเตือนผ่านบริการเว็บเซอร์วิส

เขียนเมื่อ 6 ปีก่อน โดย Ninenik Narkdee
push notification line notify notification line

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ push notification line notify notification line

ดูแล้ว 24,140 ครั้ง


ในเนื้อหาตอนที่แล้ว เราได้รู้จักวิธีการใช้งาน 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 ที่ได้บันทึกไว้ไปใช้ในส่วนของโค้ด ส่งการแจ้งเตือน โดยวิธีการส่งข้อมูล ก็จะใช้
วิธีเดียวกันกับบทความตอนที่แล้ว
    ใช้งาน Line Notify เป็น push notification แจ้งเตือนผ่านมือถือ อย่างง่าย http://niik.in/829
 
สำหรับที่เพิ่มเติมเข้ามาในเนื้อหาคือ เราสามารถตรวจสอบได้ว่า 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 ใหม่ พอเราได้รับค่าใหม่ ก็เอาไปอัพเดท ทับค่าเดิม เป็นต้น

 


   เพิ่มเติมเนื้อหา ครั้งที่ 1 วันที่ 06-11-2017


สร้าง class รวมส่วนของคำสั่งต่างๆ ของ Line Notify เพื่อให้ใช้งานสะดวกขึ้น

 
เนื้อหานี้จะเพิ่มเติม ไฟล์ LineNotifyLib.php ซึ่งเป็น ไฟล์ class ที่สร้างขึ้นจากตัวอย่าง
โค้ดด้านบน เพื่อให้สามารถนำไปใช้งานได้สะดวกขึ้น ดังนี้
 
ไฟล์ LineNotifyLib.php
 
<?php
class LineNotifyLib
{
    private $_CLIENT_ID;
    private $_CLIENT_SECRET;
    private $_CALLBACK_URL;
    private $_STATE_KEY = 'random_state_str';
	
    public function __construct($_CLIENT_ID,$_CLIENT_SECRET,$_CALLBACK_URL)
    {
		$this->_CLIENT_ID = $_CLIENT_ID;
		$this->_CLIENT_SECRET = $_CLIENT_SECRET;
		$this->_CALLBACK_URL = $_CALLBACK_URL;
    }	

	public function authorizeLineNotify()
	{
		if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
		
		$_SESSION[$this->_STATE_KEY] = $this->randomToken();

		$url = "https://notify-bot.line.me/oauth/authorize?".
			http_build_query(array(
				'response_type' => 'code',
				'client_id' => $this->_CLIENT_ID,
				'redirect_uri' => $this->_CALLBACK_URL,
				'scope' => 'notify',
				'state' => $_SESSION[$this->_STATE_KEY]
			)
		);
		if(!header("Location: {$url}")){
			echo '<meta http-equiv="refresh" content="0;URL=$url">';
		}
	}
	
	public function requestAccessToken($params, $returnResult = NULL, $ssl = NULL)
	{
		$_SSL_VERIFYHOST = (isset($ssl))?2:0;
		$_SSL_VERIFYPEER = (isset($ssl))?1:0;
		if (session_status() !== PHP_SESSION_ACTIVE) {session_start();}
			
		if(!isset($_SESSION[$this->_STATE_KEY]) || $params['state'] !== $_SESSION[$this->_STATE_KEY]){
			if(isset($_SESSION[$this->_STATE_KEY])){ unset($_SESSION[$this->_STATE_KEY]); }
			return false;
		}
		
		if(isset($_SESSION[$this->_STATE_KEY])){ unset($_SESSION[$this->_STATE_KEY]); }
		
		$code = $params['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' => $this->_CALLBACK_URL,
			'client_id' => $this->_CLIENT_ID,
			'client_secret' => $this->_CLIENT_SECRET				
		);
		
		$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, $_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)){
			if(is_null($returnResult)){
				if($result['status']==200){
					return $result['access_token'];
				}else{
					return NULL;	
				}
			}else{
				return $result;		
			}
		}else{
			return NULL;	
		}		
	}
	
	public function sendLineNotify($accessToken, $data, $returnResult = NULL, $ssl = NULL)
	{
		$_SSL_VERIFYHOST = (isset($ssl))?2:0;
		$_SSL_VERIFYPEER = (isset($ssl))?1:0;
		$accToken = $accessToken;
		$notifyURL = "https://notify-api.line.me/api/notify";
		
		$headers = array(
			'Content-Type: application/x-www-form-urlencoded',
			'Authorization: Bearer '.$accToken
		);
			
		$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, $_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)){
			if(is_null($returnResult)){
				if($result['status']==200){
					return true;	
				}else{
					return NULL;	
				}
			}else{
				return $result;		
			}
		}else{
			return NULL;	
		}
	}
	
	public function statusToken($accessToken, $returnResult = NULL, $ssl = NULL)
	{
		$_SSL_VERIFYHOST = (isset($ssl))?2:0;
		$_SSL_VERIFYPEER = (isset($ssl))?1:0;
		$accToken = $accessToken;
		$statusURL = "https://notify-api.line.me/api/status";
		
		$headers = array(
			'Authorization: Bearer '.$accToken
		);
		
		$ch = curl_init();
		curl_setopt( $ch, CURLOPT_URL, $statusURL);
		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)){
			if(is_null($returnResult)){
				if($result['status']==200){
					return true;	
				}else{
					return NULL;	
				}
			}else{
				return $result;		
			}
		}else{
			return NULL;	
		}
	}

	public function revokeToken($accessToken, $returnResult = NULL, $ssl = NULL)
	{
		$_SSL_VERIFYHOST = (isset($ssl))?2:0;
		$_SSL_VERIFYPEER = (isset($ssl))?1:0;
		$accToken = $accessToken;
		$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, $_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)){
			if(is_null($returnResult)){
				if($result['status']==200){
					return true;	
				}else{
					return NULL;	
				}
			}else{
				return $result;		
			}
		}else{
			return NULL;	
		}
	}
	
	public function setStateKey($stateKey){
		$this->_STATE_KEY = $stateKey;	
	}
	
	public 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));
		}
	}
	
}
?>
 

ตัวอย่างการนำไปใช้งาน 

ไฟล์ notify_uselib.php 
    ในตัวอย่างนี้ จะสมมติบันทึก access token ไว้ใน session
 
<?php
session_start();
require_once("LineNotifyLib.php");

define('LINE_NOTIFY_CLIENT_ID','กรอก client id ของ service ที่เราสร้าง');
define('LINE_NOTIFY_CLIENT_SECRET','กรอก client secret ของ service ที่เราสร้าง');
define('LINE_NOTIFY_CALLBACK_URL','https://www.mywebsite.com/notify_uselib_callback.php');

$LineNotify = new LineNotifyLib(
	LINE_NOTIFY_CLIENT_ID, LINE_NOTIFY_CLIENT_SECRET, LINE_NOTIFY_CALLBACK_URL);
	
if(!isset($_SESSION['ses_accToken_val'])){	
	$LineNotify->authorizeLineNotify();	
	exit;
}

$accToken = $_SESSION['ses_accToken_val'];
// Status Token Check
if($LineNotify->statusToken($accToken)){
	echo "Token Status OK <br>";	
}

echo "<pre>";
// Status Token Check with Result 
$statusToken = $LineNotify->statusToken($accToken, true);
print_r($statusToken);

//////////////////////////
echo "<hr>";
// Send Notification
/*$data = array(
	"message" => "ส่งข้อความผ่าน class library"
);

if($LineNotify->sendLineNotify($accToken, $data)){
	echo "Send notification Pass <br>";
}*/

//////////////////////////
// Send Notification with Result
/*$data = array(
	"message" => "ส่งข้อความผ่าน class library"
);

$statusNotifySend = $LineNotify->sendLineNotify($accToken, $data, true);
print_r($statusNotifySend);*/

echo "<hr>";
// Revoke Token
/*if($LineNotify->revokeToken($accToken)){
	echo "Disconnected Line Notify";	
}*/

// Revoke Token with Result
/*$statusRevoke = $LineNotify->revokeToken($accToken, true);
print_r($statusRevoke);*/
?>
<?php
if($LineNotify->statusToken($accToken)){
?>
<form method="post">
<button type="submit" name="revoke">Disconnect Web Service Notification</button>
</form>
<?php }else{ ?>
<form method="post">
<button type="submit" name="connect">Connect Web Service Notification</button>
</form>	
<?php } ?>
<?php
if(isset($_POST['connect'])){
	$LineNotify->authorizeLineNotify();	
	exit;	
}
if(isset($_POST['revoke'])){
	echo "<hr>";
	if($LineNotify->revokeToken($accToken)){
		echo "Disconnected Line Notify<br>";	
	}
	echo '
	<form method="post">
	<button type="submit" name="connect">Connect Web Service Notification Again</button>
	</form>	
	';
}
?>
 
ไฟล์ notify_uselib_callback.php 
ในขั้นตอนของไฟล์นี้ เราสามารถบันทึก access token ลง ฐานข้อมูลได้ ในตัวอย่างนี้ 
จะเก็บไว้ในตัวแปร session
 
<?php
session_start();
require_once("LineNotifyLib.php");

define('LINE_NOTIFY_CLIENT_ID','กรอก client id ของ service ที่เราสร้าง');
define('LINE_NOTIFY_CLIENT_SECRET','กรอก client secret ของ service ที่เราสร้าง');
define('LINE_NOTIFY_CALLBACK_URL','https://www.mywebsite.com/notify_uselib_callback.php');

$LineNotify = new LineNotifyLib(
	LINE_NOTIFY_CLIENT_ID, LINE_NOTIFY_CLIENT_SECRET, LINE_NOTIFY_CALLBACK_URL);
	
$accToken = $LineNotify->requestAccessToken($_GET);
if(isset($accToken) && is_string($accToken)){
	$_SESSION['ses_accToken_val'] = $accToken;
}
header("Location:notify_uselib.php");
?>
 
จะเห็นว่า ถ้าเราประยุกต์สร้างเป็น class ไว้ใช้งาน ก็จะทำให้สะดวกมากขึ้น อย่างไรก็ตาม พื้นฐานความเข้าใจ
ตามโค้ดในบทความตอนต้น ก็มีความสำคัญ นอกจากนี้ เราสามารถใช้ library ตัวอื่นมาประยุกต์ แทนการใช้
คำสั่ง cURL ก็ได้เช่นกัน

 


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



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




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





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







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