# LINE Pay api 串接 ## 官方文件 https://pay.line.me/th/developers/apis/onlineApis?locale=zh_TW ## 前置準備 - 廠商 1. 建立LinePay商店 2. LinePay商店 / 管理付款連結/ 管理付款伺服器 IP,收款商家需手動把後端打api 的IPv4位址放進白名單,如果沒有,串接LINEPay api會失敗 - 開發者 - 每次打linepay api請求時headers須帶入廠商建立的Line Pay商家Id 與key <!-- 測試店家 - Channel-ID 2002559080 - Channel Secret Key 2e5a25ee803a703021d1f4dc8a8a81c3 測試用,LINE Pay商家的帳號密碼 test_202401027094 XvgYKv-6yF [登入網址](https://pay.line.me/portal/tw/auth/login) --> ## 環境 - Sandbox https://sandbox-api-pay.line.me 測試用的環境。略過實際扣款 - Production https://api-pay.line.me 正式的服務環境 ## 加密headers用到的套件 ``` const crypto = require('crypto-js'); const axios = require('axios'); const uuid = require('uuid4'); ``` ## 串LinePay API範例 - 付款 ```jsx let key = '2e5a25ee803a703021d1f4dc8a8a81c3' let nonce = uuid() let path = '/v3/payments/request' let body = { amount : 1, currency : 'TWD', orderId : 'order20210921003', packages : [ { id : "20210921003", amount : 1, products : [ { name : "testProduct", quantity : 1, price : 1 } ] } ], redirectUrls : { confirmUrl: "http://127.0.0.1:3000/confitmUrl", cancelUrl : "http://127.0.0.1:3000/cancelUrl" } } let encrypt = crypto.HmacSHA256(key + path + JSON.stringify(body) + nonce, key) let hmacBase64 = crypto.enc.Base64.stringify(encrypt) let configs = { headers: { 'Content-Type': 'application/json', 'X-LINE-ChannelId': 2002559080, 'X-LINE-Authorization-Nonce': nonce, 'X-LINE-Authorization': hmacBase64 } } axios.post('https://api-pay.line.me' + path, body, configs).then(res => { console.log(res.data) }) ``` ## 正常成功付款流程 1. 用web url驗證、用帳密或qrcode登入,回到手機app選擇信用卡、付款,手機付款步驟結束,無通知,電腦瀏覽器自動跳轉到我們指定的確認付款頁面(目前這邊自動登入驗證沒有過),再打一次確認api完成付款 2. 把app url 轉成QR code,選擇信用卡、付款,手機瀏覽器自動跳轉到我們指定的確認付款頁面(用戶手機),再打一次確認api完成付款 ## 付款中斷 1. 手動 在手機上取消付款,跳轉到前端設定的cancel畫面(目前這邊自動登入驗證沒有過) 3. 自動 超時取消(20分鐘) ## 重複付款 - 若已點選付款,但還未按確認,這時重複刷QRCode再次點付款,LinePay會檔掉,報通知"發生暫時性錯誤而無法付款,請至店家頁面重新執行付款操作" ## 有新付款請求,但手機還留在舊付款畫面 - 手機跳通知,"有新的付款邀請,要立即付款嗎?" ## 付款確認 更改path,產生新的hmacBase64簽章,Response Body參考API文件 ```jsx let path = '/v3/payments/${transactionId}/confirm' ``` ## 退款 更改path,產生新的hmacBase64簽章,Response Body參考API文件 ```jsx let path = '/v3/payments/${transactionId}/refund' ``` <!-- ### 如果店家要手動退款 ![image](https://hackmd.io/_uploads/SyvZ6y4d6.png) 前往 管理交易/ 交易記錄 ,最下面的交易清單,往右滑點擊退款 -->