跳轉至主體

執行付款

實體店面環境需要執行的付款方式是使用合作商店終端機掃描LINE Pay用戶生成的我的條碼(My code)付款的方式。該方式的操作流程如下。

根據上述操作流程,說明LINE Pay合作商店需要實現的內容。

實體付款中,LINE Pay用戶掃描合作商店提供的條碼或QR碼的付款方式,合作商店無須執行任何內容。

掃描我的條碼

使用合作商店終端機,掃描LINE Pay用戶的我的條碼。我的條碼以條型碼或行動條碼形式顯示,如右側畫面所示。

可以生成sandbox用我的條碼進行測試。請在sandbox環境中,前往下方的URL,並使用臨時生成的我的條碼進行測試。

// 台灣商家使用:
https://sandbox-web-pay.line.me/web/sandbox/payment/oneTimeKey?countryCode=TW

// 泰國商家使用:
https://sandbox-web-pay.line.me/web/sandbox/payment/oneTimeKey

呼叫上述URL時,可以設定以下查詢參數。

姓名說明
countryCode為國家代碼,請設定為各國啟用的貨幣。可以輸入TW(台幣)、TH(泰銖)的值。預設值為TH
paymentMethod為付款方式,可輸入card(信用卡)、balance(LINE Pay 餘額)、ipass(台灣專屬LINE Pay帳戶結算)。預設值為balance

使用合作商店終端機掃描LINE Pay用戶的我的條碼,掃描的條碼訊息與訂單訊息需傳輸到合作商店的伺服器。後續合作商店的伺服器將執行付款請求。當合作商店的伺服器收到回應時,將在終端機上顯示必要的訊息。

合作商店終端機的功能類似掃描條碼,執行合作商店終端機與合作商店伺服器之間的通訊的方法需要合作商店自行執行,此處不再贅述。

付款請求與授權

合作商店伺服器使用從終端機收到的訊息向LINE Pay伺服器請求付款。以下是使用終端機收到的我的條碼訊息(oneTimeKey)和訂單訊息,呼叫請求付款API的範例。

呼叫Offline API時,取得必要credentials的方法請參考準備API credentials。本頁所述的程式碼範例使用準備API credentials程式碼範例中定義的requestOfflineAPI()函數。

try {
let response = await requestOfflineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: "/v2/payments/oneTimeKeys/pay",
data: {
amount: 100,
currency: "TWD",
orderId: "EXAMPLE_ORDER_20230422_1000002",
productName: "Pen Brown",
oneTimeKey: "123456789012",
extras: {
branchName: "First branch",
branchId: "branch1",
},
},
});

console.log("Response: ", response);
} catch (error) {
console.log(error);
}

將得到付款請求結果回應如下。

{
"returnCode": "0000",
"returnMessage": "success",
"info": {
"transactionId": 2019010112345678910,
"orderId": "test_order_1",
"transactionDate": "2023-05-16T18:01:00Z",
"payInfo": [
{
"method": "BALANCE",
"amount": 100
}
],
"balance": 9900
}
}

處理付款請求,即完成付款授權。如果未分開請款,則在付款得到授權時自動處理為請款並完成結算。

合作商店伺服器通常會在向LINE Pay伺服器請求付款後,設定約20秒的Read逾時。如果在Read逾時時間內沒有收到回應,請呼叫查詢付款狀態API,確認付款狀態。以下是設定Read逾時時間為20秒,逾時時,定時查詢付款狀態的範例。

let intervalId = null;

// 確認付款請求狀態
const getPayRequestStatus = async function (orderId) {
try {
if (!orderId) throw new Error("Order ID is required!");

let response = await requestOfflineAPI({
method: "GET",
baseUrl: targetAPIServer,
apiPath: `/v2/payments/orders/${orderId}/check`,
});

console.log("Response: ", response);
switch (response.info.status) {
case "AUTH_READY":
console.log("In progress");
break;
case "COMPLETE":
console.log("Finished");
// Do something
case "CANCEL":
console.log("Cancelled");
// Do something
case "FAIL":
console.log("Failed");
// Do something
// ...
default:
clearInterval(intervalId);
}
} catch (error) {
console.log(error);
}
};

// 付款請求
try {
let response = await requestOfflineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: "/v2/payments/oneTimeKeys/pay",
data: {
orderId: "test_order_1",
// ...
},
// Read逾時設定
signal: AbortSignal.timeout(20000),
});

console.log("Response: ", response);
} catch (error) {
if (err.name === "TimeoutError") {
// 每隔1秒檢查付款請求狀態
intervalId = setInterval(getPayRequestStatus("test_order_1"), 1000);
} else {
// 其他異常處理
}
}

付款狀態查詢API的回應中info.status欄位傳回付款狀態訊息。狀態訊息如下。

  • "AUTH_READY": 顧客等待LINE Pay認證的狀態
  • "CANCEL": 顧客取消付款的狀態
  • "COMPLETE": 完成付款的狀態
  • "FAIL": 付款失敗的狀態