台灣有超過 2,100 萬 LINE 用戶,而 LINE Pay 的月活躍用戶也突破千萬。問題是:大多數品牌的 LINE Bot 只能聊天,不能收錢

用戶在 Bot 裡問完「這個課程多少錢?」,還要被導到外部連結、重新登入、填信用卡——這個摩擦就是轉換率殺手。

LINE Pay 整合解決的就是這件事。


LINE Pay 能做什麼?

串接 LINE Pay 之後,你的 Bot 可以:

  • 用戶點選商品 → Bot 直接發送付款請求 → 用戶在 LINE 內完成付款
  • 付款成功後自動觸發後續動作(發送電子票、解鎖課程、更新訂單狀態)
  • 支援一次性付款、定期定額訂閱
  • 可結合會員系統,記錄消費歷史

適合場景:

產業使用情境
餐飲Bot 點餐 + 直接付款,取餐時掃碼
電商限時優惠直接在 LINE 下單
課程諮詢完直接購買,不跳轉外部網站
活動售票報名 + 付款一條龍,票券自動發送
訂閱服務定期扣款,續約提醒自動推播

付款流程設計

LINE Pay 的支付流程分三步:

1. Request(建立訂單)
   Bot 呼叫 LINE Pay API,取得付款 URL

2. Confirm(用戶授權)
   用戶點選 URL → 在 LINE 內完成指紋/臉部辨識授權

3. Confirm(後端確認)
   LINE Pay 回傳結果 → 你的 Webhook 接收 → 觸發後續動作

整個過程用戶不需要離開 LINE,體驗比跳轉外部金流流暢很多。


技術實作:Cloudflare Workers + LINE Pay API

環境設定

LINE Pay 提供 Sandbox 和 Production 兩套環境,開發時先用 Sandbox:

Sandbox API:https://sandbox-api-pay.line.me
Production API:https://api-pay.line.me

需要的環境變數:

LINE_PAY_CHANNEL_ID=
LINE_PAY_CHANNEL_SECRET=
LINE_PAY_CONFIRM_URL=https://your-worker.workers.dev/api/line-pay/confirm

建立訂單(Request)

async function createPaymentRequest(order: {
  orderId: string;
  amount: number;
  currency: string;
  productName: string;
}) {
  const body = {
    amount: order.amount,
    currency: order.currency,
    orderId: order.orderId,
    packages: [{
      id: 'pkg-1',
      amount: order.amount,
      products: [{ name: order.productName, quantity: 1, price: order.amount }],
    }],
    redirectUrls: {
      confirmUrl: env.LINE_PAY_CONFIRM_URL,
      cancelUrl: `${env.LINE_PAY_CONFIRM_URL}?cancelled=true`,
    },
  };

  const nonce = crypto.randomUUID();
  const timestamp = Date.now().toString();
  const signature = await generateSignature(
    env.LINE_PAY_CHANNEL_SECRET,
    `/v3/payments/request`,
    body,
    nonce,
    timestamp,
  );

  const res = await fetch('https://sandbox-api-pay.line.me/v3/payments/request', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-LINE-ChannelId': env.LINE_PAY_CHANNEL_ID,
      'X-LINE-Authorization-Nonce': nonce,
      'X-LINE-Authorization': signature,
    },
    body: JSON.stringify(body),
  });

  return res.json();
}

簽名產生(HMAC-SHA256)

LINE Pay 每個請求都需要簽名驗證:

async function generateSignature(
  secret: string,
  path: string,
  body: object,
  nonce: string,
  timestamp: string,
): Promise<string> {
  const message = secret + path + JSON.stringify(body) + nonce + timestamp;
  const key = await crypto.subtle.importKey(
    'raw',
    new TextEncoder().encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false,
    ['sign'],
  );
  const sig = await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(message));
  return btoa(String.fromCharCode(...new Uint8Array(sig)));
}

確認付款(Confirm)

用戶授權後,LINE Pay 會帶著 transactionIdorderId 回到你的 confirmUrl

export const GET: APIRoute = async ({ url }) => {
  const transactionId = url.searchParams.get('transactionId');
  const orderId = url.searchParams.get('orderId');

  if (!transactionId || !orderId) {
    return new Response('Bad Request', { status: 400 });
  }

  // 從 KV 取出訂單金額
  const order = await env.SESSION.get(`order:${orderId}`, { type: 'json' });

  // 呼叫 LINE Pay Confirm API
  const res = await confirmPayment(transactionId, order.amount, order.currency);

  if (res.returnCode === '0000') {
    // 付款成功 → 發送確認訊息給用戶
    await pushText(env.LINE_CHANNEL_ACCESS_TOKEN, order.userId, '✅ 付款成功!感謝您的購買,相關資訊將在幾分鐘內發送給您。');
    // 觸發後續動作(發票、解鎖、通知)
    await fulfillOrder(order);
  }

  return new Response('OK');
};

常見踩坑

1. Sandbox 和 Production 的 Channel ID 不一樣 很多人測試完切換 Production 後忘記換 ID,導致所有付款失敗。建議透過環境變數切換,不要硬寫在程式碼裡。

2. confirmUrl 必須是 HTTPS Cloudflare Workers 預設就是 HTTPS,但如果你用自定域名要確認憑證有效。

3. orderId 必須唯一 LINE Pay 不允許重複的 orderId。建議用 userId + timestamp + random 組合。

4. 付款超時未確認 用戶點了付款連結但沒完成,訂單會懸空。建議設計逾時清除機制(例如 KV TTL 30 分鐘)。

5. 金額單位 LINE Pay 的金額單位是整數(台幣不含小數),注意不要把 1990.0 傳成 1990.0,應傳 1990


建置成本與時程

項目說明
LINE Pay 審核申請後約 5–10 個工作天,需提供營業登記
開發時程基本串接約 3–5 天,含測試
交易手續費約 2.45%(依方案不同),無月費
Cloudflare Workers免費額度通常足夠

想在你的 LINE Bot 加入收款功能?

每個金流整合的細節都不太一樣,例如是否需要訂閱扣款、是否要整合既有 ERP、是否需要發票串接。

加入 LINE Bot 描述你的場景,我可以幫你評估整合範圍和開發成本。或者到聯絡頁面留下資訊,讓我們約個時間細談。