# 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'
```
<!--
### 如果店家要手動退款

前往 管理交易/ 交易記錄 ,最下面的交易清單,往右滑點擊退款 -->