前言
練習藍新金流,記錄實作步驟與需要的參數,參考 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) => { |