
Service Messages เป็นฟีเจอร์หนึ่งใน LINE MINI App ที่ให้ผู้ให้บริการส่งข้อความแจ้งเตือนไปยังผู้ใช้งานที่มีปฏิพันสัมพันธ์บน LINE MINI App ได้โดยไม่มีค่าบริการ และไม่จำเป็นต้อง Add ตัว LINE OA ใดๆ เช่น เมื่อลูกค้าเข้ามาจองโต๊ะอาหาร ทางร้านก็สามารถส่งข้อความยืนยันการจอง หรือส่งข้อความแจ้งเตือนล่วงหน้าก่อนถึงวันที่จะเข้ามาใช้บริการ
ใน Codelab นี้คุณจะได้เรียนรู้ฟังก์ชันพื้นฐานการส่งข้อความ Service Messages ใน LINE MINI App ทั้งในส่วนของ Server-side และ Client-side
ใน Codelab นี้เราจะพัฒนา LINE MINI App ด้วย StackBlitz ซึ่งเป็น Editor แบบออนไลน์ที่ไม่ต้องติดตั้งโปรแกรมใดๆ และเราสามารถแชร์ URL ของโปรเจคให้กับผู้อื่นได้ โดยโปรเจคที่แชร์ จะอนุญาตให้ผู้อื่นเข้าถึงโค้ดทั้งหมด แต่จะไม่สามารถแก้ไขโปรเจคของเราได้


จุดเริ่มขบวนสำหรับการพัฒนาแอปพลิเคชันต่างๆบนแพลทฟอร์มของ LINE คือคุณจะต้องสมัครเป็น LINE Developer ก่อน


Provider คือ superset ของแอปทั้งหลายที่เราจะพัฒนาขึ้นรวมถึง LINE MINI App ด้วย โดยการสร้างเพียงให้ระบุชื่อของ Provider ลงไป ซึ่งอาจจะตั้งเป็นชื่อตัวเอง, ชื่อบริษัท, ชื่อทีม หรือชื่อกลุ่มก็ได้

Channel คือ subset ของ Provider ซึ่งเปรียบเสมือนแอปพลิเคชัน


หลังจากที่คุณมี Provider และ LINE MINI App channel เรียบร้อยแล้ว ขั้นตอนต่อไปเราจะมาตั้งค่าเพื่อใช้งาน LINE MINI App กัน โดยใน channel ให้เราเลือกแท็บชื่อ Web app settings

Endpoint URL: URL ที่รองรับ HTTPS ซึ่งใน Codelab นี้ให้คุณระบุ Endpoint URL ของ StackBlitz ที่ได้จากขั้นตอนที่ 2 ลงไปในช่องของ Developing

โดย URL ของ LINE MINI App ที่เราจะนำไปใช้จะอยู่ที่ LIFF URL แบบ Developing

ขั้นตอนต่อไปเราจะมาสร้าง Template ของข้อความกัน โดยใน channel ให้เราเลือกแท็บชื่อ Service message template แล้วกดปุ่ม Add สีเขียวทางด้านขวาล่าง




ใน Codelab นี้เราจะใช้บริการ Cloud Functions for Firebase มาสร้างเป็น API สำหรับส่งข้อความ Service Messages ดังนั้นเราจะเริ่มจากการไปสร้างโปรเจคใน Firebase ก่อน

เนื่องจาก Cloud Functions for Firebase มีเงื่อนไขว่า หากต้องการไป request ตัว APIs ที่อยู่ภายนอก Google คุณจำเป็นจะต้องใช้ Blaze plan(เราจะต้องไปเรียก API ของ LINE MINI App)

Firebase CLI เป็นเครื่องมือที่จำเป็นสำหรับการ deploy ตัวฟังก์ชันที่เราพัฒนาขึ้น อีกทั้งยังสามารถจำลองการทำงานฟังก์ชัน(Emulate) ภายในเครื่องที่เราพัฒนาอยู่(Locally) ได้
npm install -g firebase-tools
firebase --version
firebase login
mkdir bot
cd bot
firebase init functions


ขั้นตอนนี้เราจะสร้าง API ขึ้นมาเพื่อรับข้อมูลจาก LINE MINI App และส่งข้อความผ่าน Service Message API
ใน Codelab นี้เราจะใช้ axios มาเป็นตัวช่วยในการสร้าง request ซึ่งเราจะต้องทำการติดตั้ง dependency ตัวนี้ก่อน โดยให้เปิด command line แล้วเข้าไปที่ /functions จากนั้นใช้คำสั่ง
npm install axios --save
ถัดไปให้เรากลับไป LINE MINI App Channel ที่เราสร้างไว้ในขั้นตอนที่ 2 แล้วไปที่แท็บ Basic settings จากนั้นให้คัดลอกค่า Channel ID และ Channel secret จาก Developing มา


จากนั้นเราจะสร้าง Environment Variable โดยให้ไปสร้างไฟล์ .env ใน /functions แล้วให้เอาค่า Channel ID และ Channel secret มาระบุลงไป
CHANNEL_ID=YOUR-CHANNEL-ID
CHANNEL_SECRET=YOUR-CHANNEL-SECRET
เพื่อโค้ดที่สั้น เป็นระเบียบ เราจะแยกฟังก์ชันสำหรับการเรียกใช้ LINE API ออกมาเป็น module โดยภายในจะมีฟังก์ชัน
ขั้นตอนนี้ให้สร้างไฟล์ /functions/utils/request.js แล้วให้ copy โค้ดด้านล่างนี้ไปวาง
const axios = require("axios");
const MESSAGING_API = "https://api.line.me/oauth2/v3";
const MINI_APP_API = "https://api.line.me/message/v3/notifier";
class Request {
async issueChannelAccessToken(channelId, channelSecret) {
const params = new URLSearchParams();
params.append('grant_type', "client_credentials");
params.append('client_id', channelId);
params.append('client_secret', channelSecret);
const response = await axios({
method: "post",
url: `${MESSAGING_API}/token`,
headers: { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } },
params
});
return response.data.access_token;
}
async issueServiceNotificationToken(headers, liffAccessToken) {
const response = await axios.post({
method: "post",
url: `${MINI_APP_API}/token`,
headers,
data: { liffAccessToken }
});
return response.data.notificationToken;
}
async sendServiceMessage(headers, notificationToken) {
return axios({
method: "post",
url: `${MINI_APP_API}/send?target=service`,
headers,
data: {
templateName: "couponnoti_s_c_th",
params: { btn1_url: "https://linedevth.line.me" },
notificationToken
}
});
}
}
module.exports = new Request()
ถัดไปให้เปิดไฟล์ /functions/index.js แล้วให้ copy โค้ดด้านล่างนี้ไปแทนที่โค้ดเดิม เพื่อรับค่า liffAccessToken และส่งข้อความ
const { onRequest } = require("firebase-functions/v2/https");
const request = require("./utils/request");
exports.serviceMessages = onRequest({ cors: "*" }, async (req, res) => {
const channelAccessToken = await request.issueChannelAccessToken(process.env.CHANNEL_ID, process.env.CHANNEL_SECRET);
const headers = { "Content-Type": "application/json", Authorization: `Bearer ${channelAccessToken}`}
const notificationToken = await request.issueServiceNotificationToken(headers, req.body.liffAccessToken);
const response = await request.sendServiceMessage(headers, notificationToken);
res.json({ result: response.data });
});
เสร็จแล้วให้เปิด command line ขึ้นมาอีกครั้ง และให้แน่ใจว่าเราอยู่ที่ /functions จากนั้นใช้คำสั่งด้านล่างนี้เพื่อ deploy ตัว webhook ของเราขึ้น production
firebase deploy --only functions
เมื่อ deploy เสร็จเรียบร้อยเราจะเห็น API โผล่อยู่ใน command line เลย ก็ให้เรา copy มา หรือกรณีที่ไม่พบก็ให้เข้าไปที่ Firebase console เลือกโปรเจคที่เราสร้างไว้ แล้วเลือกเมนู Build > Functions จะเจอชื่อฟังก์ชัน serviceMessages และ API ที่นั่น

{
notificationToken: 'd938cb43-7868-054e-6d84-758acc2dc847',
remainingCount: 4,
expiresIn: 31535999,
sessionId: 'wZgQzped'
}
หลังจากที่คุณได้พัฒนา API สำหรับส่งข้อความ Service Messages เรียบร้อยแล้ว คราวนี้เราจะมาลงมือโค้ดเพื่อเรียกใช้งาน API ดังกล่าวกัน
index.html ใน StackBlitz แล้ว Uncomment ตัว LIFF SDK ใน <script src="https://static.line-scdn.net/liff/edge/2/sdk.js"></script>
index.js แล้วเพิ่มคำสั่ง initialize ตัว LIFF app ด้วย LIFF ID ที่คุณได้จากขั้นตอนที่ 4 ในฟังก์ชัน main()// Initialize LIFF SDK
await liff.init({ liffId: "YOUR-LIFF-ID" })
ขั้นตอนนี้ให้เราเอา URL ของ API ไปแทนที่ YOUR-API ในไฟล์ index.js เพื่อให้ LINE MINI App ทำการ request ไป โดยใน request เราจะแนบ liffAccessToken ไปด้วย
async function requestAPI() {
await fetch("YOUR-API", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ liffAccessToken: liff.getAccessToken() })
});
alert("Message sent successfully!");
liff.closeWindow();
}
ให้เราเอา URL ของ LINE MINI App ในขั้นตอนที่ 4 ซึ่งมีลักษณะ https://miniapp.line.me/YOUR-LIFF-ID

ยินดีด้วยครับ ถึงตรงนี้คุณก็มี LINE MINI App ตัวแรกเป็นของคุณเองแล้ว!!!