跳轉至主體

提前準備

請檢查每個Offline API版本的先決條件。

當使用Offline API v4

若要呼叫Online API v4Online API v3Offline API v4,需在HTTP標頭中代入credentials。 可以在註冊合作商店後,於合作商店中心左側選單[管理付款連結 > 管理連結金鑰]的頁面中取得通訊管道ID和channel secret,並使用該數值生成credentials。

如果未註冊為合作商店,可以申請sandbox帳號取得channel ID和secret進行測試。

如果已經註冊成為合作商店取得channel ID和secret,則無需另行申請,可以立即在sandbox環境中使用它們。

指定credentials的HTTP標頭如下。

  • X-LINE-ChannelId
  • X-LINE-Authorization
  • X-LINE-Authorization-Nonce

X-LINE-ChannelId標頭中輸入channel ID值,並在X-LINE-Authorization-Nonce標頭中輸入UUID v1或v4或時間戳記等nonce值。

X-LINE-Authorization標頭中輸入的值是HMAC方法使用channel secret和目標訊息生成的MAC(message authentication code),該值以Base64格式編碼。根據呼叫API的HTTP方法,配置用於MAC生成訊息,如下所示。

HTTP方法MAC生成訊息
GETChannel secret + API路徑(apiPath) + 查詢字串(queryString) + nonce(nonce)
POSTChannel secret + API路徑(apiPath) + request body + nonce(nonce)

以下程式碼範例將credentials代入HTTP標頭中來呼叫Online API。

下面的程式碼範例中,處理交易ID值時需要handleBigInteger()函數。有關交易ID和handleBigInteger()函數的詳細訊息,請參考Online API v4Offline API v4中有關交易ID部分的說明。

const crypto = require("crypto");

function signKey(clientKey, msg) {
const encoder = new TextEncoder();
return crypto
.createHmac("sha256", encoder.encode(clientKey))
.update(encoder.encode(msg))
.digest("base64");
}

async function requestLINEPayAPI({
method,
baseUrl = "https://sandbox-api-pay.line.me",
apiPath,
queryString = "",
data = null,
signal = null,
}) {
const nonce = crypto.randomUUID();
let signature = "";

// 根據不同方式(method)生成MAC
if (method === "GET") {
signature = signKey(
YOUR_CHANNEL_SECRET,
YOUR_CHANNEL_SECRET + apiPath + queryString + nonce
);
} else if (method === "POST") {
signature = signKey(
YOUR_CHANNEL_SECRET,
YOUR_CHANNEL_SECRET + apiPath + JSON.stringify(data) + nonce
);
}
const headers = {
"X-LINE-ChannelId": YOUR_CHANNEL_ID,
"X-LINE-Authorization": signature,
"X-LINE-Authorization-Nonce": nonce,
};

const response = await fetch(
`${baseUrl}${apiPath}${queryString !== "" ? "&" + queryString : ""}`,
{
method: method,
headers: {
"Content-Type": "application/json",
...headers,
},
body: data ?JSON.stringify(data) : null,
signal: signal,
}
);

const processedResponse = handleBigInteger(await response.text());

return processedResponse;
}

當使用Offline API v2.x

在使用Offline API v2Offline API v2.4時,請準備以下內容:

設定伺服器允許的清單

若要使用Offline API v2Offline API v2.4,請先允許合作商店伺服器對sandbox的訪問權限。合作商店中心使用管理付款伺服器IP選單管理呼叫LINE Pay API伺服器允許的清單(allowlist)。如下註冊合作商店伺服器的IP位址。

如果您是測試合作商店商家,並於sandbox測試LINE Pay API時,不需要設定伺服器允許的清單。

  1. 請登入合作商店中心

  2. 從左側選單點選 [開發者工具 > 管理付款伺服器IP]。

  3. 管理付款伺服器IP 頁面,如下輸入合作商店伺服器IP位址及IP位址網路遮罩值,點選 加入

  4. (選填)如果您要測試多個合作商店伺服器,請點選右上角 插入行鍵,插入更多行,再根據需求重複步驟3。

處理Offline v2.x API credentials

若要呼叫Offline APIOffline API v2.4,需在HTTP標頭中代入credentials。 可以在註冊合作商店後,於合作商店中心左側選單[管理付款連結 > 管理連結金鑰]的頁面中取得通訊管道ID和channel secret,並將該數值代入HTTP標頭。

如果未註冊為合作商店,可以申請sandbox帳號取得channel ID和secret進行測試。

如果已經註冊成為合作商店取得channel ID和secret,則無需另行申請,可以立即在sandbox環境中使用它們。

指定credentials的HTTP標頭如下。

  • X-LINE-ChannelId
  • X-LINE-ChannelSecret

在使用Offline API v2Offline API v2.4時,合作商店設備相關資訊也可能包含在HTTP標頭當中。相關詳細說明請參閱請求API標頭。

X-LINE-ChannelId標頭中輸入channel ID值,並在X-LINE-ChannelSecret標頭中輸入channel secret值。以下程式碼範例將credentials代入HTTP標頭中來呼叫Offline API。

下面的程式碼範例中,處理交易ID值時需要handleBigInteger()函數。有關交易ID和handleBigInteger()函數的詳細訊息,請參考Offline API v2Offline API v2.4交易ID (transaction ID)。

const crypto = require("crypto");

async function requestLINEPayAPI({
method,
baseUrl = "https://sandbox-api-pay.line.me",
apiPath,
queryString = "",
data = null,
signal = null,
}) {
const headers = {
"X-LINE-ChannelId": YOUR_CHANNEL_ID,
"X-LINE-ChannelSecret": YOUR_CHANNEL_SECRET,
"X-LINE-MerchantDeviceProfileId": YOUR_DEVICE_PROFILE_ID,
"X-LINE-MerchantDeviceType": YOUR_DEVICE_TYPE,
};

const response = await fetch(
`${baseUrl}${apiPath}${queryString !== "" ? "&" + queryString : ""}`,
{
method: method,
headers: {
"Content-Type": "application/json",
...headers,
},
body: data ?JSON.stringify(data) : null,
signal: signal,
}
);

const processedResponse = handleBigInteger(await response.text());

return processedResponse;
}