---
# System prepended metadata

title: Laravel 整合 LINE Notify 的實現方法
tags: [' Backend', ' Laravel']

---

`LINE Notify` 是一個服務，允許你透過 `LINE` 的 `API` 傳送通知。以下是如何在 `Laravel` 中實現這項服務的詳細步驟。

* 生成並重定向至 `OAuth2 URL` 地址
* 儲存與用戶相關的 `OAuth2` 存取權杖（Access Token）
* 在需要發送通知時，調用通知 `API`
* （如果有檢視連接狀態的頁面）通過連接狀態 `API` 顯示連接狀態
* （當連接服務需要取消通知時）調用通知撤銷 `API`

## 申請服務

前往[Line Notify](https://notify-bot.line.me/my/services/)申請服務

1. 新增服務

![新增服務按鈕圖片](https://hackmd.io/_uploads/rkiwHz5jh.jpg)

2. 取得 `Client ID` 以及 `Client Secret`

![取得 `Client ID` 以及 `Client Secret`圖片](https://hackmd.io/_uploads/ryBdrfqjn.jpg)

## 1. 設置 OAuth2 驗證

首先，你需要設置 `OAuth2` 驗證流程。這需要向 `LINE` 註冊你的應用程式，然後獲取一個客戶端 `ID` 和密鑰。接著你可以創建一個 `URL`，將用戶導向 `LINE` 的 `OAuth2` 授權端點，並帶上客戶端 `ID` 和其他必要參數。在 `Laravel` 中，這可能會像下面這樣：

```php=
public function redirectToLineNotify($redirectUri)
{
    // Generate a random state value.
    $state = Str::random(40);

    // Save the state value in the session.
    session()->put('state', $state);

    // Generate the query string.
    $parameters = http_build_query([
        'response_type' => 'code',
        'client_id' => 'your_line_client_id',
        'redirect_uri' => $redirectUri,
        'scope' => 'notify',
        'state' => $state,
    ]);

    // Redirect to the LINE OAuth endpoint.
    return redirect()->away('https://notify-bot.line.me/oauth/authorize?' . $parameters);
}
```

## 2. 儲存 Access Token

當用戶通過 `LINE` 驗證後，`LINE` 會將他們重新導向回你的服務，並帶上一個授權碼。你可以使用這個授權碼向 `LINE` 的 `token` 端點請求一個 `access token`，並將其儲存在資料庫中。這可能會看起來像這樣：

```php=
public function handleLineNotifyCallback($state, $code, $redirectUri)
{
    if (session()->get('state') !== $state) {
        abort(403, 'Invalid state parameter. Possible CSRF attack.');
    }

    session()->forget('state');

    $response = Http::asForm()->post('https://notify-bot.line.me/oauth/token', [
        'grant_type' => 'authorization_code',
        'code' => $code,
        'redirect_uri' => $redirectUri,
        'client_id' => 'your_line_client_id',
        'client_secret' => 'your_line_client_secret',
    ]);

    if ($response->successful()) {
        $accessToken = $response->json()['access_token'];
        return $accessToken;
    }

    return null;
}

public function lineNotifyCallback(Request $request)
{
    $redirectUri = 'your_redriect_url'
    $accessToken = $this->lineNotifyService->handleLineNotifyCallback($request->state, $request->code, $redirectUri);
    $user = Auth::user();

    if ($accessToken) {
        $user->update([
            'line_notify_token' => $accessToken,
        ]);
    }
}
```

## 3. 發送通知

現在，當你需要向用戶發送通知時，你可以使用之前儲存的 `access token` 調用 `LINE` 的通知 `API`。這可能會看起來像這樣：

```php=
/**
 *  sends a message to a user on Line using the Line Notify API.
 */
public function sendLineNotification(User $user, $message)
{
    $response = Http::withHeaders([
        'Authorization' => 'Bearer ' . $user->line_notify_token, // The access token stored for the user
    ])->asForm()->post('https://notify-api.line.me/api/notify', [
        'message' => $message,
    ]);

    return $response->json();
}
```

## 4. 顯示狀態(如果有)

如果你的 `Laravel` 應用程式需要通過 `API` 來檢查並顯示 `LINE Notify` 的連接狀態，你可以這樣做

```php=
/**
 *  checks the connection status of the user's Line Notify token.
 */
public function checkLineConnectionStatus(User $user)
{
    $response = Http::withHeaders([
        'Authorization' => 'Bearer ' . $user->line_notify_token, // The access token stored for the user
    ])->get('https://notify-api.line.me/api/status');

    return $response->json();
}
```

## 5. 撤銷通知

如果用戶希望取消通知，你可以調用 `LINE` 的撤銷 `API`，並使用之前儲存的 `access token`。這可能看起來像這樣：

```php=
/**
 *  revokes the user's Line Notify token.
 */
public function revokeLineNotification($user)
{
    $response = Http::withHeaders([
        'Authorization' => 'Bearer ' . $user->line_notify_token,
    ])->post('https://notify-api.line.me/api/revoke');

    return $response->successful();
}
```

## 結論

![](https://hackmd.io/_uploads/HyoypG5i3.jpg)

`LINE Notify` 提供了一種便利的方式來發送 `LINE` 通知。在 `Laravel` 中整合 `LINE Notify` 的過程需要設置 `OAuth2` 驗證，儲存 `access token`，並調用相應的 `API` 進行通知或撤銷操作。希望這篇文章對你有所幫助！