前言
練習藍新金流,記錄實作步驟與需要的參數,參考 alpha camp 教材以及 藍新串接官方文件
邏輯
在串接上第三方支付平台需要取得交易參數
| 參數 | 中文 | 備註 |
|---|---|---|
| MerchantID | 商店代號 | 藍新金流商店代號 |
| Version | 串接程式版本 | |
| RespondType | 回傳格式 | Json 或 string |
| TimeStamp | 時間戳 | |
| Amt | 訂單金額 | |
| 付款人電子信箱 | ||
| MerchantOrderNo | 商店訂單編號 | |
| ItemDesc | 商品資訊 | 鑑別訂單紀錄 |
| LoginType | 藍新金流會員 | 1 為需要登入,0 為不需要,對 client 的要求 |
| ReturnURL | 支付完成返還商店網址 | |
| NotifyURL | 支付通知網址 | 每期授權結果通知 |
| ClientBackURL | 支付取消返回網址 |
資料會進行加密才進行傳送參數
| 參數 | 中文 | 備註 |
|---|---|---|
| MerchantID | 商品代號 | |
| TradInfo | 交易資料 AES 加密 | |
| TradInSha | 交易資料 SHA256 加密 | |
| Version | 串接程式版本 |
前端頁面會先取得訂單付款頁面,取得訂單編號、總金額、金流參數、加密過後資料(AES、SHA256)。
教材顯示 MerchantID、 TradeInfo、 TradeSha、 Version,官方是以字串呈現,以及教材導向網址 PayGateWay(可更改命名是為表單給予要導向的網頁,教材命名這個名稱),在按出按鈕後傳送到付款頁面。
官方 ( HTML )
- 正式:
https://core.newebpay.com/MPG/period - 測試:
https://ccore.newebpay.com/MPG/period - 新網址:
https://ccore.newebpay.com/MPG/mpg_gateway
<form action="https://ccore.newebpay.com/MPG/mpg_gateway" method="POST"> |
教材( 使用 handlebars )
<h3>準備為訂單編號: {{order.id}} 付款</h3> |
步驟
- 付款頁面,如果有購物餐車,顯示購物車資料,在按付款後才會導向真正的付款頁面,這裡為
/order/:id/payment 串接金流 Get /order/:id/payment,取得訂單 data,使用 4 個 function ,
genDataChain將物件轉換成字串、create_mpg_aes_encrypt加密、create_mpg_sha_encrypt雜湊打包TradeInfo進行交易、回傳後使用的create_mpg_aes_decrypt解密,最後解密重新取得TradeInfo處理已取得的資料。- getTradeInfo - 取得 data
- getTradeInfo - data 放入 mpg_aes_encrypt(data) 處理 , 結果再放入 mpg_sha_encrypt(mpg_aes_encrypt(data)) 處理
getTradeInfo - 得到的資料打包成 tradeInfo,包含上方提到的 MerchantID 、 TradInfo 放 mpg_aes_encrypt , TradInSha 放 mpg_sha_encrypt, Version 放版本。
另外在多 payGeteWay,發送 API 的位置,還有 MerchantOrderNo,存到訂單做紀錄。
串接金流 Post /spgateway/callback
/spgateway/callback?from=NotifyURL,支付通知網址,電商端 req.query 會收到- spgatewayCallback:
TradeInfo,交易完成後回傳的資料,作為電商核對確認付款 - spgatewayCallback:
create_mpg_aes_decrypt,使用解密函式,作為確認資料正確性,以及更新資料庫 - spgatewayCallback:
data,create_mpg_aes_decrypt解密後 /spgateway/callback?from=ReturnURL,支付完成返還商店網址
實作
定義 route
router.get("/order/:id/payment", orderController.getPayment); |
定義參數
- 臨時網址 ngrok 工具
const URL = ""; //本地 domain 不接受,使用 ngrok 工具做臨時網址,取得的網址放這 |
敏感資料安裝 dotenv 放在 .env
URL= |
加密用 function,最後會將 getTradeInfo 放到 getPayment 。經由 getPayment 呼叫 getTradeInfo 傳入 Amt、 Desc、 email,進入 getTradeInfo 之後
genDataChain放在create_mpg_aes_encrypt()中幫忙 data 改為字串資料- 將
data作為參數放到create_mpg_aes_encrypt(TradeInfo)宣告成mpg_aes_encrypt - 將
mpg_aes_encrypt放到create_mpg_sha_encrypt(TradeInfo)宣告成mpg_sha_encrypt - 宣告
tradeInfo打包 mpg_aes_encrypt 、 mpg_aes_encrypt 等資料回傳作為傳送交易參數
使用 getTradeInfo 時,我們會定義 data 其中會設定 MerchantOrderNo 並用 Date.now() 設定編號,未來在 打包 tradeInfo 也會設定 MerchantOrderNo 將資料從 data 傳入,在做交易的時候,取得回傳交易資料解碼後一樣會有 MerchantOrderNo,我們會當作 order 欄位 sn 搜尋依據,更改是否已經付款。
const crypto = require("crypto"); // 加密 |
GET /order/:id/payment
getPayment: (req, res) => { |
Post /spgateway/callback
在 return 的結果中,req.body.TradeInfo 的 Result,會有紀錄 TradeNo 編號,我們使用這個交易編號,作為我們在資料庫 order 中撈資料的依據
spgatewayCallback: (req, res) => { |