tutor4dev

คอร์สอบรม, บทความ และ คลิปวีดีโอ การพัฒนาเว็บแอพพลิเคชั่น

ใช้งาน LINE Notify Service


LINE Notify มีรูปแบบบริการ 2 แบบหลักๆ แบบแรกจะเป็นลักษณะการใช้งานแบบส่วนตัว โดยการไป Obtain access_token จาก LINE Platform ซึ่งมีความหมายว่า เราเป็นผู้อนุญาตตัวเราเอง ให้ตัวเราเองสามารถส่ง Notification ถึงตัวเราเองได้ โดยทุกครั้งที่ส่ง Notification จะต้องใช้ access_token ซึ่งเป็นเสมือนบัตรผ่านยืนยันการได้รับอนุญาติดังกล่าว

ในบทความนี้จะเป็นนำเสนอ LINE Notify ในแบบที่ 2 หรือ เรียกว่าแบบ LINE Notify Service ตัวอย่างการนำไปประยุกต์ใช้งาน เช่น สมมุติผู้เขียนมี Website ที่อยากให้มีความสามารถ ในการแจ้งข้อมูลการจัดส่งสินค้าให้ลูกค้าทราบ ในทุกขั้นตอนของการจัดส่งสินค้า กรณีนี้ผู้เขียนสามารถนำ LINE Notify Service มา Integrate กับระบบ Order Tracking ของผู้เขียนเพื่อใช้ส่ง Notification ให้กับลูกค้าได้

ขั้นตอนการขอ access_token ของ LINE Notify

ซึ่งในการใช้งาน LINE Notify Service นั้นผู้ส่ง Notification คือระบบของเรา แต่ผู้รับ Notification จะเป็นบุคคลอื่น ดังนั้นการได้มาซึ่ง access_token นั้นจะต้องเป็นการได้รับอนุญาต เป็นรายบุคคลโดยต้องเจาะจงชื่อของ Service จากผู้รับเสียก่อน

เพื่อความเข้าใจตรงกัน การส่ง Notification ของ LINE Notify ทั้ง 2 แบบนั้น ไม่สามารถส่งตรงๆ ถึงผู้รับ หรือ อาจจะเรียกว่า User บน LINE Platform ได้ ซึ่งการส่ง Notification ของ LINE Notify จะเป็นการส่งผ่านเพื่อนของผู้รับที่ชื่อว่าคุณ LINE Notify เท่านั้น และ หากกลุ่มบน LINE Platform มีคุณ LINE Notify เป็นสมาชิกในกลุ่ม กลุ่มก็จะได้รับ Notification ไปด้วยเช่นกัน (ต้องได้รับการอนุญาตเสียก่อน)

ขั้นตอนในการ Implement LINE Notify Service

  1. ผู้รับจะต้องทำการเพิ่มเพื่อนชื่อคุณ LINE Notify ให้กับบัญชี LINE ของตัวเอง
  2. ผู้ส่งใช้บัญชี LINE Developer สร้าง Service ซึ่งสามารถที่จะสร้าง Service ขึ้นมากี่ตัวก็ได้
  3. Website จะต้องมีลิงค์เพื่อ Redirect ไปยังระบบ Authentication ของ LINE Platform ที่จะใช้ในการให้ผู้รับอนุญาตให้ Service ของเราสามารถส่ง Notification ให้กับผู้รับได้
  4. โปรแกรม PHP เพื่อใช้รอรับ Callback จาก LINE โดยในขั้นตอนนี้ทาง LINE จะให้ code หรือ อาจจะเรียกว่า refresh token ตามหลักการของ OAuth2
  5. โปรแกรม PHP เพื่อใช้ส่ง code ไปยัง LINE Platform เพื่อเป็นการขอรับ access_token
  6. โปรแกรม PHP เพื่อใช้ส่ง Notification โดยใช้ access_token เสมือนเป็นตั๋วยืนยันการได้รับอนุญาต ซึ่งเราก็สามารถส่ง Notification ให้กับผู้รับคนนั้นได้เรื่อยๆ (ผ่าน LINE Notify) จนกว่า access_token จะถูกยกเลิก หรือ หมดอายุ

เพื่อนคนใหม่ชื่อคุณ LINE Notify

เพิ่มเพื่อน LINE Notify

การเพิ่มเพื่อนที่ชื่อคุณ LINE Notify เป็น Requirement ที่ขาดไม่ได้ในการใช้บริการ LINE Notify

สร้าง Service เพื่อใช้กับ LINE Notify

สร้าง LINE Notify Service

ข้อมูล LINE Notify Service

Client ID และ Client Secret ของ LINE Notify Service

ขั้นตอนการขออนุญาตจากผู้รับ

ในขั้นตอนนี้เราจะต้องสร้างลิงค์สำหรับ Redirect ไปยังระบบของ LINE Platform

ในขั้นตอนนี้จะต้องมีการใช้งาน Client ID ซึ่งดูได้จาก หน้าจอ Manage Registered Service และ ข้อมูล Parameter ที่ใช้ในการส่ง Request สามารถดูได้จาก LINE Notify API Document

register.php

<?php

define('CLIENT_ID', 'VHMNK5D2JYbYyGlJH...');
define('LINE_API_URI', 'https://notify-bot.line.me/oauth/authorize?');
define('CALLBACK_URI', 'http://localhost:8000/callback.php');

$queryStrings = [
    'response_type' => 'code',
    'client_id' => CLIENT_ID,
    'redirect_uri' => CALLBACK_URI,
    'scope' => 'notify',
    'state' => 'abcdef123456'
];

$queryString = LINE_API_URI . http_build_query($queryStrings);

?>

<a href="<?php echo $queryString; ?>">Register</a>

Terminal

php -S localhost:8000

สั่ง Start PHP Built-in Web Server ที่ Root Path ของโปรเจค

Browser

http://localhost:8000/register.php

หน้าจอ Authentication ของ LINE Platform

กรณีไม่มีข้อผิดพลาดเกิดขึ้น ผู้ขอรับ Notification จะถูก Redirect ไปยังระบบ Authentication หลังจาก Click ลิงค์ Register

เลือกห้องแชทสำหรับรับ Notification

หลังจากผ่านขั้นตอนการ Authentication ผู้รับจะเป็นผู้เลือกว่าจะรับ Notification แบบส่วนตัว หรือ แบบกลุ่ม

Notification ยืนยันการอนุญาตส่ง Notification

LINE Platform ส่ง Notification ให้กับผู้รับเพื่อเป็นการยืนยันว่าผู้รับได้อนุญาตให้ Service สามารถส่ง Notification หาผู้รับได้

ขั้นตอนการทดสอบ Callback

หลังจากขั้นตอนการ Authentication LINE Platform จะทำการ Redirect กลับมายัง URI ที่เราได้ระบุไว้ตอนสร้าง Service

callback.php

<?php

parse_str($_SERVER['QUERY_STRING'], $queries);

var_dump($queries);

Result

array (size=2)
  'code' => string 'RMcGvWMuTS9JbLpBPWLYTk' (length=22)
  'state' => string 'abcdef123456' (length=12)

code และ state ถูกส่งเป็น Query String มาพร้อมกับ Callback

ใช้งาน Postman

ในขั้นตอนการทดสอบ เราสามารถนำ code มาขอรับ access_token โดยการใช้ Postman แทนการเขียนโปรแกรม

หน้าจอ Postman ขอรับ access_token

access_token จาก LINE Platform

หน้าจอ Postman ขอรับ access_token (Error)

code เดิมที่เคยใช้ไปแล้วไม่สามารถนำมาขอ access_token ได้อีก

ขั้นตอนการขอ access_token

ในขั้นตอนนี้เราจะแก้ไขไฟล์ callback.php เพิ่มเติมเพื่อส่ง Request ไปขอ access_token แทนการใช้ Postman

ในขั้นตอนนี้จะต้องมีการใช้งาน Client ID และ Client Secret ซึ่งดูได้จาก หน้าจอ Manage Registered Service และ ข้อมูล Parameter ที่ใช้ในการส่ง Request สามารถดูได้จาก LINE Notify API Document

ในระบบจริงเราควรจัดเก็บ access_token ในระบบฐานข้อมูล โดยจัดเก็บคู่กับ ID, email, etc. ของผู้รับ

callback.php

<?php

define('CLIENT_ID', 'VHMNK5D2JYbYyGlJH...');
define('CLIENT_SECRET', 'pXMb1ZOo2KO6vTnKyZtOdp8KwKHiTjJu2EhXGq...');
define('LINE_API_URI', 'https://notify-bot.line.me/oauth/token');
define('CALLBACK_URI', 'http://localhost:8000/callback.php');

parse_str($_SERVER['QUERY_STRING'], $queries);

$fields = [
    'grant_type' => 'authorization_code',
    'code' => $queries['code'],
    'redirect_uri' => CALLBACK_URI,
    'client_id' => CLIENT_ID,
    'client_secret' => CLIENT_SECRET
];

try {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, LINE_API_URI);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $res = curl_exec($ch);
    curl_close($ch);

    if ($res == false)
        throw new Exception(curl_error($ch), curl_errno($ch));

    $json = json_decode($res);

    var_dump($json);
} catch(Exception $e) {
    var_dump($e);
}

Result

object(stdClass)[1]
  public 'status' => int 200
  public 'message' => string 'access_token is issued' (length=22)
  public 'access_token' => string 'P0ku2DjIlLItSPfQhCOtNj0OJpEA7qOLH2YfaC...' (length=43)

access_token จาก LINE Platform เพื่อนำไปใช้ในการส่ง Notification ให้กับผู้รับต่อไป

ขั้นตอนการส่ง Notification

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

ข้อมูล Parameter ที่ใช้ในการส่ง Request สามารถดูได้จาก LINE Notify API Document

notify.php

<?php

define('ACCESS_TOKEN', 'P0ku2DjIlLItSPfQhCOtNj0OJpEA7qOLH2YfaC...');
define('LINE_API_URI', 'https://notify-api.line.me/api/notify');

$headers = [
    'Authorization: Bearer ' . ACCESS_TOKEN
];
$fields = [
    'message' => 'Your order #12345 has been delivered'
];

try {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, LINE_API_URI);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, count($fields));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $res = curl_exec($ch);
    curl_close($ch);

    if ($res == false)
        throw new Exception(curl_error($ch), curl_errno($ch));

    $json = json_decode($res);
    $status = $json->status;

    var_dump($status);
} catch (Exception $e) {
    var_dump($e);
}

Notification จาก Service

ผู้รับได้รับ Notification จาก Service เป็นที่เรียบร้อย

บทสรุป

ในความเห็นส่วนตัวของผู้เขียน ถึงแม้ LINE Platform จะมีระบบหลังบ้านที่ยังไม่ค่อยดีนัก และ ลูกเล้นต่างๆก็อาจะยังไม่ได้มากเมื่อเปรียบเทียบกับ Facebook Platform แต่ LINE ถือเป็นโปรแกรม Chat ที่ได้รับความนิยมมากในประเทศไทย การนำ LINE Notify มา Integrate กับระบบของเราจึงเป็นสิ่งที่น่าลงทุนเป็นอย่างยิ่งครับ

ในบทความนี้ผู้เขียนเลือกใช้ภาษา PHP ในการเขียนโปรแกรม เนื่องจากเป็นภาษาที่เราคุ้นเคยกันดีอยู่แล้ว แต่เราสามารถเลือกใช้ภาษาอะไรก็ได้ในการเขียนโปรแกรม เพราะในการทำงานร่วมกับ LINE Notify ทั้งหมดนั้น เป็นเพียงการใช้งาน HTTP Request ซึ่งเป็น Standard ที่แทบจะรองรับในทุกๆ ภาษาที่ได้รับความนิยม