LINE Messaging API
先在官方帳號後方設定圖文選單,當使用者按下 選項 B 時,會送出 【綁定帳號】 給 LINE 機器人程式,接下來就開始綁定流程
按下選項 B,開始綁定流程
解除綁定相對簡單多了,因為 event 都會含 userId,所以藉由 userId 去資料庫找,將該會員的 userId 欄位清除即可。
有時候,您的公司在成立 LINE 官方帳號前,早就已經建立官網多時,這時我們希望能將 LINE 使用者與網站上的會員綁定,以提供會員更好的服務。
下圖是整個綁定的流程
LINE 機器人程式
<?php date_default_timezone_set('Asia/Taipei'); $channelAccessToken = '{blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla}'; $bodyMsg = file_get_contents('php://input'); // 寫 log $sLogfile = './log/log_'.date('Ymd').'.log'; $fp = fopen($sLogfile, "a+"); fwrite($fp , print_r(date('Y-m-d H:i:s').', Recive: '.$bodyMsg."\n", true)); fclose($fp); $obj = json_decode($bodyMsg, true); $payload = null; $event = null; foreach ($obj['events'] as &$event) { switch($event['type']) { // user 傳來訊息 case 'message': $userId = $event['source']['userId']; // 取得 使用者傳來的訊息 $msgUser = $event['message']['text']; // 判斷 client 端傳訊型態 switch($event['message']['type']) { // 文字 case 'text': { switch($event['message']['text']) { ... ... case '【綁定帳號】': // 1. 向 LINE 平台申請 link token $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.line.me/v2/bot/user/$userId/linkToken"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $channelAccessToken ]); $result = curl_exec($ch); curl_close($ch); // 寫 log $sLogfile = './log/log_'.date('Ymd').'.log'; $fp = fopen($sLogfile, "a+"); fwrite($fp , print_r(date('Y-m-d H:i:s').', LINE resule: '.$result."\n", true)); fclose($fp); // 2. LINE 平台回覆 linkToken 給 機器人 $objResult = json_decode($result, true); $linkToken = $objResult['linkToken']; // 寫 log $sLogfile = './log/log_'.date('Ymd').'.log'; $fp = fopen($sLogfile, "a+"); fwrite($fp , print_r(date('Y-m-d H:i:s').", decode json → linkToken = $linkToken \n", true)); fclose($fp); // 3. 傳送 linking URL 給 LINE 平台 $payload = ["to" => $userId, "messages" => [ [ "type" => "template", "altText" => "Account Link", "template" => [ "type" => "buttons", "text" => "綁定帳號", "actions" => [ [ "type" => "uri", "label" => "登入", "uri" => "https://網址/line/link.php?linkToken=$linkToken" ] ] ] ] ] ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.line.me/v2/bot/message/push"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $channelAccessToken ]); $result = curl_exec($ch); curl_close($ch); // 寫 log $sLogfile = './log/log_'.date('Ymd').'.log'; $fp = fopen($sLogfile, "a+"); fwrite($fp , print_r(date('Y-m-d H:i:s').', Redirect user resule: '.$result."\n", true)); fwrite($fp , print_r("encode payload = ".json_encode($payload)." \n", true)); fclose($fp); // 4. LINE 平台將 user 導至網站登入頁面 exit; } } } break; case 'accountLink': 11. LINE 平台傳送 會員的 userId 給機器人 $userId = $event['source']['userId']; $nonce = $event['link']['nonce']; 12. 在資料庫找到 user, 並存入該會員的 LINE userId // 寫 log $sLogfile = './log/log_'.date('Ymd').'.log'; $fp = fopen($sLogfile, "a+"); fwrite($fp , print_r(date('Y-m-d H:i:s').', 藉由 nonce: '.$nonce." 在資料庫中找到使用者, 並存入 userId($userId), 完成綁定 \n", true)); fclose($fp); exit; } } ?>
網站登入程式 link.php
<?php // 在本例, 我們偷懶, 將 step 5 ~ 9 都寫在同一支程式 // setp 5 在下方 // 7. 驗證登入 if(isset($_POST['token'])) { // user submit // 驗證登入資訊 // 略, 偽裝 user 通過驗證 $id = $_POST['id']; $pwd = $_POST['pwd']; $token = $_POST['token']; // 8. 產生 nonce 並存入資料庫, 以便後面流程連結 userId 用 $nonce = base64_encode(random_bytes(16)); // 9. 重導至綁定成功頁面 echo "<script> location.href='https://access.line.me/dialog/bot/accountLink?linkToken=$token&nonce=$nonce' </script>"; exit; } ?> <html> <body> <?php // 5. user 引導至網站登入頁 if(isset($_GET['linkToken'])) { $linkToken = $_GET['linkToken']; } // 6. 顯示登入頁面 ?> <center> <form id="frmLogin" method="post" action="link.php" style="font-size:30pt;"> <table border="0"> <tr> <td><input type="hidden" id="hidToken" name="token" value="<?php echo $linkToken; ?>" /></td> </tr> <tr> <td><input type="text" id="txtID" name="id" maxlength="20" width="50" /></td> </tr> <tr> <td><input type="password" id="txtPwd" name="pwd" maxlength="20" width="50" /></td> </tr> <tr> <td><input type="submit" text="提交" /> <input type="reset" text="重填" /></td> </tr> </table> </form> </center> </body> </html>
沒有留言:
張貼留言