台灣有超過 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 會帶著 transactionId 和 orderId 回到你的 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 描述你的場景,我可以幫你評估整合範圍和開發成本。或者到聯絡頁面留下資訊,讓我們約個時間細談。