เราสามารถสร้างการแจ้งเตือนจากเว็บไซต์เราเข้า LINE ของลูกค้าได้ผ่าน LINE Notify แบบ 1-1-Chat
หลักการทำงาน
ขั้นแรก ลูกค้าร้องข้อเชื่อมต่อกับ Service ของเราผ่านเว็บไซต์เราเพื่อทำ Authorize โดยเข้าระบบแล้วอนุญาตการเชื่อมต่อกับ Service เรา
ขั้นที่สอง หลังจากลูกค้าอนุญาตแล้วระบบจะกลับมาที่หน้า callback ที่ได้ตั้งค่าไว้ โดยจะส่ง token กลับมา อันนี้ล่ะ เอาไปเก็บไว้ใน Database เพื่อนำไปใช้ในการส่งให้ลูกค้าครั้งต่อๆ ไป
ขั้นที่สาม เอา token มาส่ง Notify หรือข้อความ รูปภาพ สติ๊กเกอร์ ให้ลูกค้าได้
การเปิดใช้งาน Service
เข้า URL : https://notify-bot.line.me/en/ จากนั้นเข้าระบบให้เรียบร้อย แล้วเลื่อนมาด้านล่าง คลิกที่ ลงทะเบียนบริการ
จากนั้นจะปรากฏหน้าสำหรับกรอกข้อมูลบริการของเรา
ทำการกรอกข้อมูลให้เรียบร้อย
- โลโก้ เลือกรูปในเครื่องเราได้เลย
- ชื่อบริการ เช่น แม่ค้า
- คำอธิบาย เช่น แม่ค้าออนไลน์
- URL ในที่นี้ใช้ URL localhost ในการทดสอบ เช่น http://loalhost/yii2-maekha/web
- บริษัท/ผู้ประกอบการ ใช้ บริษัท หนุมานไอที จำกัด
- ประเทศ/ภูมิภาค ใช้ Thailand
- ผู้รับผิดชอบ เช่น ผู้ดูแลระบบ
- อีเมล์ เช่น your@email.com
- Callback URL อันนี้สำคัญใส่ URL ตอบกลับ เช่น http://localhost/yii2-maekha/web/index.php?r=site/callback
จากนั้นกดบันทึกข้อมูล เราจะได้ Client ID และ Client Secret เป็นอันเสร็จเรียบร้อยในขั้นตอนนี้
เขียนโปรแกรม
ในที่นี้จะใช้ Yii Framework 2 Basic ในการเขียนโปรแกรมซึ่งมี 3 Action ด้วยกันคือ
- Action site/index สร้างปุ่มสำหรับกดเชื่อมต่อ
- Actiion site/callback หลังเข้าระบบ Authorize แล้วกลับมาหน้านี้
- Action site/notify การส่งข้อความไปยังผู้รับ
เขียนโปรแกรม action site/index
เปิด controllers/SiteController.php จากนั้นแก้ actionIndex() ดังนี้
public function actionIndex()
{
$client_id = 'ZtAdgYvwFsgwhx4BCa7HyOUZ';
$api_url = 'https://notify-bot.line.me/oauth/authorize?';
$callback_url = 'http://localhost/yii2-maekha/web/index.php?r=site/callback';
$query = [
'response_type' => 'code',
'client_id' => $client_id,
'redirect_uri' => $callback_url,
'scope' => 'notify',
'state' => 'mylinenotify'
];
$result = $api_url . http_build_query($query);
return $this->render('index',[
'result' => $result
]);
}
ใน views/site/index.php สร้างปุ่มลักษณะดังนี้
<?php
/* @var $this yii\web\View */
use yii\helpers\Html;
$this->title = 'Line Notify';
?>
<?=Html::a('ลงทะเบียน', $result, ['class' => 'btn btn-success'])?>
ทดลอง run จะพบหน้าจอลักษณะนี้
เขียนโปรแกรม action site/callback
ในขั้นตอนนี้สิ่งที่เราต้องการคือ access_token เพื่อใช้สำหรับการส่ง Notify ไปยังผู้รับได้ถูกต้อง ดังนั้นสามารถเขียนเพิ่มเติมให้บันทึกในฐานข้อมูลได้
public function actionCallback()
{
$client_id = 'ZtAdgYvewFgwh4BCda7HyOUZ';
$client_secret = 'Cr6zqdWdWRPm6CgfU7bnas7IWp2gxouoUfbiROHwXQHZDk7';
$api_url = 'https://notify-bot.line.me/oauth/token';
$callback_url = 'http://localhost/yii2-maekha/web/index.php?r=site/callback';
parse_str($_SERVER['QUERY_STRING'], $queries);
//var_dump($queries);
$fields = [
'grant_type' => 'authorization_code',
'code' => $queries['code'],
'redirect_uri' => $callback_url,
'client_id' => $client_id,
'client_secret' => $client_secret
];
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
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) {
throw new Exception($e->getMessage());
//var_dump($e);
}
return $this->render('callback', [
'json' => $json
]);
}
ใน views/site/callback
<?php
use yii\helpers\Html;
//var_dump($json);
?>
<?=Html::a('ส่งข้อความ', ['notify', 'token' => $json->access_token])?>
เขียนโปรแกรม action site/notify
เมื่อกดลิ้งค์จากหน้า callback จะมี token ส่งมาด้วย ซึ่งจะใช้สำหรับส่งให้ผู้ใช้งาน (ในความเป็นจริงต้องให้ระบบส่งเองนะครับ ดังนั้นต้องเก็บ access_token ลูกค้าให้ดี เช่น เก็บใน database)
ในขั้นตอนนี้สร้าง Model มารับค่าก่อนใน models/Notify.php ดังนี้
<?php
namespace app\models;
use yii\base\Model;
class Notify extends Model {
public $name;
public function rules() {
return [
[['name'], 'required']
];
}
public function attributeLabels()
{
return [
'name' => 'ข้อความ'
];
}
}
จากนั้นแก้ controllers/SiteController.php เพิ่ม action notify ดังนี้
public function actionNotify($token)
{
$api_url = 'https://notify-api.line.me/api/notify';
$model = new Notify();
$json = null;
if($model->load(Yii::$app->request->post())){
$headers = [
'Authorization: Bearer ' . $token
];
$fields = [
'message' => 'ทดสอบการส่งข้อความไปยังผู้ใช้งาน '. $model->name
];
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
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) {
throw new Exception($e->getMessage);
}
}
return $this->render('notify', [
'model' => $model,
'json' => $json
]);
}
หน้า views/site/notify.php
<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;
?>
<?php $form = ActiveForm::begin()?>
<?=$form->field($model, 'name')?>
<?=Html::submitButton('ส่งข้อความ', ['class' => 'btn btn-warning'])?>
<?php ActiveForm::end()?>
<?php var_dump($json)?>
ทดลองส่งข้อความ
ทดลองส่งข้อความ โดยเปิด URL : http://localhost/yii2-maekha/web จะปรากฏหน้าเว็บดังนี้
จากนั้นคลิกปุ่ม ลงทะเบียน ระบบจะส่งข้อมูลไปหน้า LINE เพื่อ เชื่อมต่อและ Authorize
เลือกบริการ แล้วกดปุ่ม เห็นด้วยและเชื่อมต่อ จากนั้นระบบจะกลับมาหน้าที่ callback
กดลิ้ง ส่งข้อความ จากนั้นจะไปหน้า notify กรอกข้อความทดสอบ จากนั้นกดปุ่ม ส่งข้อความ หากส่งสำเร็จจะปรากฏ status 200 message ok ดังนี้
เมื่อเปิดดูใน LINE จะปรากฏข้อความขึ้นดังนี้
ความคิดเห็น