LINE Pay 提供兩種付款方式:線上付款與實體付款。實體付款主要採用店家出示條碼的模式,顧客掃描後即可輸入金額完成付款。這兩種付款方式都支援在沙盒(Sandbox)環境中進行測試。本文將著重說明線上付款的整合流程。
LINE Pay 沙盒註冊官方網站
沙盒環境是一個獨立的測試空間,所有操作都不會產生實際付款,開發者可以放心進行測試。
填寫完資料後,系統會將沙盒環境的帳號密碼以 Email 方式寄送給您,該帳號用於登入 LINE Pay 官方網站。
LINE Pay 官方網站登入的時候,需要使用信件內提供的帳號密碼。
LINE Pay 官方網站
LINE Pay 服務在使用時需要 ChannelId 及 ChannelSecret,取得方式如下:
通路 ID (ChannelId)
及 通路密鑰 (ChannelSecret)
LINE Pay 線上付款流程包含四個核心步驟,這些步驟與 API 的設計和使用密切相關:
LINE Pay API 需要在 HTTP 請求標頭中指定以下三個欄位::
接下來操作會透過 Postman 跑過一次流程,首先會先使用 pre-request
處理標頭的部分。
Postman 設定環境變數
在 Postman 中建立環境變數以儲存 Channel ID 和 Channel Secret,設定完成後可搭配 Pre-request Script 自動產生請求標頭資訊。
Postman Enviroment(變數值記得替換你申請的部分)
Postman pre-request
const CryptoJS = require('crypto-js');
const channelId = pm.environment.get("Channel_ID").trim();
const channelSecretKey = pm.environment.get("Channel_Secret_Key").trim();
const nonce = crypto.randomUUID();
const body = pm.request.body.raw
const apiPath = new URL(pm.request.url.toString()).pathname;
// 按照官方文檔組合訊息:ChannelSecret + URI + Body + Nonce
const message = channelSecretKey + apiPath + body + nonce;
// 使用 ChannelSecret 作為 HMAC key,對 message 進行簽名
const signature = CryptoJS.HmacSHA256(message, channelSecretKey)
.toString(CryptoJS.enc.Base64);
// 設定 Headers
pm.request.headers.upsert({ key: "Content-Type", value: "application/json" });
pm.request.headers.upsert({ key: "X-LINE-ChannelId", value: channelId });
pm.request.headers.upsert({ key: "X-LINE-Authorization-Nonce", value: nonce });
pm.request.headers.upsert({ key: "X-LINE-Authorization", value: signature });
API 說明
【 基本參數 】
TWD
【 packages(套裝產品資訊) 】
【 redirectUrls(跳轉網址) 】
我們可以使用上面的參數組合出我們的付款請求
orderId
使用過之後必須要手動替換喔!
body 請求 JSON
{
"orderId": "TEST_20251009_0013",
"currency": "TWD",
"packages": [
{
"id": "1",
"amount": 100,
"products": [
{
"id": "P001",
"name": "鐵人咖啡",
"quantity": 1,
"imageUrl": "https://res.cloudinary.com/dseg0uwc9/image/upload/v1759988202/2025%20IT%20%E9%90%B5%E4%BA%BA%E8%B3%BD/Day%2025%EF%BC%9ALINE%20%E9%9B%86%E9%BB%9E%E5%8D%A1%E8%88%87%E5%84%AA%E6%83%A0%E5%8D%B7/%E5%92%96%E5%95%A1%E5%9C%96_qb2gt2.jpg",
"originalPrice": 200,
"price": 100
}
]
}
],
"amount": 100,
"redirectUrls": {
"confirmUrl": "https://www.google.com.tw/",
"cancelUrl": "https://www.google.com.tw/",
"confirmUrlType": "CLIENT"
}
}
呼叫付款請求 API 成功後會收到以下回應內容:
{
"returnCode": "0000",
"returnMessage": "Success.",
"info": {
"paymentUrl": {
"web": "https://sandbox-web-pay.line.me/web/payment/wait?transactionReserveId=MURWc0NLQ3VZVU5nTzdueVFCcnIyK1dnVzJjMHhBV2hoNnVRSTh1Tk9qSFQ0TjlsaEp2OEcxY0pLN3YreVRtWg",
"app": "line://pay/payment/MURWc0NLQ3VZVU5nTzdueVFCcnIyK1dnVzJjMHhBV2hoNnVRSTh1Tk9qSFQ0TjlsaEp2OEcxY0pLN3YreVRtWg"
},
"transactionId": 2025100902308399810,
"paymentAccessToken": "884394403270"
}
}
1. 網頁呈現 paymentUrl .web 導覽畫面(未登入 LINE 狀態,需要驗證)
2. 手機呈現 paymentUrl .web 導覽畫面(驗證通過,可看到購買商品資訊)
API 說明
當手機端完成付款後,網頁會自動跳轉至 confirmUrl,並在網址列中攜帶交易編號(transactionId)及訂單編號(orderId)等參數。
同時,後端接收到付款完成的通知後,會將網頁導向至 confirmUrl 進行後續確認。
後端可以根據交易編號(transactionId)向 LINE Pay 伺服器請求付款授權。
請求的時候,必須確保總額與當初使用者授權的總額相同,才可以完成該筆交易。
body 請求 JSON
{
"amount": 100,
"currency": "TWD"
}
呼叫付款授權 API 成功後會收到以下回應內容,其中 payInfo.method 欄位的可能值包括:
{
"returnCode": "0000",
"returnMessage": "Success.",
"info": {
"transactionId": 2025101002308403110,
"orderId": "TEST_20251009_0013",
"payInfo": [
{
"method": "CREDIT_CARD",
"amount": 100,
"maskedCreditCardNumber": "************1111"
}
],
"packages": [
{
"id": "1",
"amount": 100,
"userFeeAmount": 0,
"products": [
{
"id": "P001",
"name": "鐵人咖啡",
"imageUrl": "https://res.cloudinary.com/dseg0uwc9/image/upload/v1759988202/2025%20IT%20%E9%90%B5%E4%BA%BA%E8%B3%BD/Day%2025%EF%BC%9ALINE%20%E9%9B%86%E9%BB%9E%E5%8D%A1%E8%88%87%E5%84%AA%E6%83%A0%E5%8D%B7/%E5%92%96%E5%95%A1%E5%9C%96_qb2gt2.jpg",
"quantity": 1,
"price": 100,
"originalPrice": 200
}
]
}
]
}
}
今天是第一次接觸 LINE Pay 線上付款整合,實際操作後發現 API 流程設計蠻好理解,從付款請求到付款授權,每個步驟都有明確的參數定義與回應格式。沙盒環境的支援也可以讓開發過程更加順暢,不僅可以讓開發者能安心反覆測試各種付款情境,還能透過管理後台即時查看交易狀態與處理結果,大幅降低了金流整合的門檻。