---
# System prepended metadata

title: LINE Pay api 串接
tags: [金流]

---

# 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)
前往 管理交易/ 交易記錄 ，最下面的交易清單，往右滑點擊退款 -->