-
Notifications
You must be signed in to change notification settings - Fork 6
API Document
綠界全方位金流(ECPay All-In-One, AIO) node.js SDK。這是根據官方 API 規格書全新實作並且支援 TypeScript 的版本,並非官方 SDK 的 fork 改寫版本。
因綠界主要使用者皆在台灣,故本模組文件皆以中文書寫。
npm install --save node-ecpay-aio
Step 1 | Step 2 | Step 3
+------------+
merchant.createPayment() | |
+------------------------->| payment |--> await payment.checkout()
| | |
| +------------+
|
+------------+ +------------+
| | .createQuery() | |
new Merchant() --->| merchant |------------------->| query |--> await query.read()
| | | |
+------------+ +------------+
|
| +------------+
| | |
+------------------------->| action |--> await action.execute()
merchant.createAction() | |
+------------+
-
Step 1: 建立特店(
merchant) -
Step 2: 可以再用特店建立
- 付款方式:
payment - 查詢:
query - 操作:
action
- 付款方式:
-
Step 3:
- payment 可以執行結帳:
await payment.checkout() - query 可以執行讀取:
await query.read() - action 可以執行操作:
await action.execute()
- payment 可以執行結帳:
如何閱讀本文件
- 建議先稍微讀過官方的 API 手冊。
- 參數物件會以 必填 與 選填 兩部份區隔開。
- 因參數眾多,僅在需要之處以註解稍加說明。若對某參數不了解,請直接參考官方 API 手冊。
- 參數命名一律按官方的大寫駝峰式書寫。
- 參數 Schema 或參數間的相依條件已有防衛性驗證,違反規則即會拋錯,故本文件不會特別說明這些限制。
- 參數型別是嚴格的,字串就是字串,數字就是數字。官方的 SDK 會自動將字串轉數字,但本模組不會,因為這會造成型別混淆。你心裡只要記住幾乎 99% 的參數都是字串,僅有部分涉及「金額」、「次數」的地方才會有數字出現。
- 關於可用參數及其型別、選項,TypeScript 會協助你。不過,到底要用 TS 還是 JS 來寫,由你自行決定。
- 空值與 undefined 不同。在官方手冊中提到的「空值」在本模組中一律是指空字串
''而不是null或undefined。本模組中,只要是undefined的參數,皆不會編入 x-www-form-urlencoded 的鍵值對字串中。如果你想要將屬性編入 post 字串,請給予該屬性空字串'',而非給予undefined。綠界的請求參數並不使用null,故請勿使用null表示空值。
代表綠界特店的 Class,它的實例帶有工廠方法 createPayment()、createQuery() 以及 createAction() 可以產生特店的結帳、資料查詢與信用卡作業操作。特店是指「提供綠界金流付款服務給消費者付款交易的賣家系統」,一般來講也就是你的後端系統。
import { Merchant } from 'node-ecpay-aio';建立綠界特店的實例。建立時需給予組態 config 用來設定你的特店資訊。Merchant 的實例帶有工廠方法 createPayment()、createQuery() 以及 createAction()。
Arguments:
-
mode(String):'Test' | 'Production',各表示特店要使用綠界的測試環境或生產環境 API。 -
config(Object): 特店的組態參數如下{ // 必填 MerchantID: '2000132', HashKey: '5294y06JbISpM5x9', HashIV: 'v77hoKGq4kWxNNIS', ReturnURL: 'https://yourservice.com/foo/bar', // 選填 PlatformID: '', // 只有平台商需填此編號, 我們大部分都不是 PeriodReturnURL: 'https://...', OrderResultURL: 'https://...' , ClientBackURL: 'https://...', PaymentInfoURL: 'https://...', ClientRedirectURL: 'https://...' }
-
ecpayServiceUrls(Object, optional): 改寫或新增綠界 API 的服務端點資料,一般不會用到此參數。為節省說明版面,請見 XXX(有時間再補文件) 說明。
Returns:
- (Object): merchant 實例
import { Merchant } from 'node-ecpay-aio';
const merchant = new Merchant('Test', {
MerchantID: '2000132',
HashKey: '5294y06JbISpM5x9',
HashIV: 'v77hoKGq4kWxNNIS',
ReturnURL: 'https://api.test.com/our/hook1',
PaymentInfoURL: 'https://api.test.com/our/hook2',
});建立付款方式的工廠方法。建立時請注入要使用的 PaymentClass,並準備好每一種付款方式都要填寫的基本參數 baseParams,以及屬於個別付款方式的專屬參數 params。
注意
永遠不可以省略
params,即使你並未使用params中的任何屬性,還是應該令其為空物件{}而非undefined。這其中有一些設計考量,在此省略說明。
Arguments:
-
PaymentClass(Class): 各種付款方式的 Class,包含有-
CreditOneTimePayment: 信用卡一次付清 -
CreditDividePayment: 信用卡分期付款 -
CreditPeriodPayment: 信用卡定期定額 (訂閱式收費) -
WebATMPayment: WebATM 付款 -
ATMPayment: ATM 付款 -
CVSPayment: 超商代碼付款 -
BARCODEPayment: 超商條碼付款 -
AndroidPayPayment: Google Pay 付款。綠界目前暫時停止此服務,目前產生AndroidPayPayment時會自動 throw Error。
-
-
baseParams(Object): 所有付款方式都需要填的基本參數{ // 必填 MerchantTradeNo: 'tn12345678', // 廠商自己的訂單編號, 只接受大小寫英數字組合, min: 4, max: 20 MerchantTradeDate: '2022/04/25 18:26:12', TotalAmount: 500, TradeDesc: '交易描述', ItemName: '商品名稱', // 以下選填 Remark: '備註', NeedExtraPaidInfo: 'Y', // 'N': 不要, 'Y': 要 StoreID: '', ItemURL: 'https://...', CustomField1: '自訂欄位1', CustomField2: '自訂欄位2', CustomField3: '自訂欄位3', CustomField4: '自訂欄位4', ReturnURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook ClientBackURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的返回網址 OrderResultURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要顯示個別的付款結果網址 }
-
params(Object): 根據不同的 PaymentClass 付款方式,各自需要的獨特參數。分述於下方各種付款方式範例。
Returns:
- (Object): payment 實例
import { Merchant, CreditOneTimePayment } from 'node-ecpay-aio';
const merchant = new Merchant('Test', { ... }); // ... 略
const baseParams: BasePaymentParams = {
MerchantTradeNo: 'tn12345678',
MerchantTradeDate: '2021/04/17 10:55:26',
TotalAmount: 1000,
TradeDesc: '交易描述',
ItemName: '商品名稱',
// ReturnURL: undefined,
// ClientBackURL: undefined,
// OrderResultURL: undefined,
};
const params: CreditOneTimePaymentParams = {
// 皆為選填
BindingCard: 1, // 記憶信用卡: 1 (記) | 0 (不記)
MerchantMemberID: '2000132u001', // 記憶卡片需加註識別碼: MerchantId+廠商會員編號
Language: 'ENG', // 語系: undefined(繁中) | 'ENG' | 'KOR' | 'JPN' | 'CHI'
Redeem: 'Y', // 紅利折抵: undefined(不用) | 'Y' (使用)
UnionPay: 2, // [需申請]銀聯卡: 0(可用, default) | 1(導至銀聯網) | 2(不可用)
};
const payment = merchant.createPayment(CreditOneTimePayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(/* 可選填發票 */); import { Merchant, CreditDividePayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const extraParams: CreditDividePaymentParams = {
// 必填
CreditInstallment: '3', // 分期數: '3' | '6' | '12' | '18' | '24' | '30N'(圓夢彈性分期)
// 選填
BindingCard: 0,
MerchantMemberID: undefined, // 寫 undefined 只是表示有此參數可設定, 實際上不賦值就不用寫此屬性
Language: undefined, // 同上
Redeem: undefined, // 同上
UnionPay: undefined, // 同上
};
const payment = merchant.createPayment(CreditDividePayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(/* 可選填發票 */); import { Merchant, CreditPeriodPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: CreditPeriodPaymentParams = {
// 必填
PeriodAmount: 500, // 週期授權金額, 須與 baseParams.TotalAmount 相等, 否則拋錯
PeriodType: 'M', // 'D'(日) | 'M'(月) | 'Y'(年)
Frequency: 1, // 多久執行一次, min: 1, max: 365(天) | 12(月) | 1(年)
ExecTimes: 10, // 執行次數, min: 1, max: 999(天) | 99(月) | 9(年)
// 選填
BindingCard: 0,
MerchantMemberID: undefined,
Language: undefined,
Redeem: undefined,
UnionPay: 2,
PeriodReturnURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook
};
const payment = merchant.createPayment(CreditPeriodPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(/* 可選填發票 */); import { Merchant, WebATMPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: WebATMPaymentParams = {
/* 無參數, 請保持空物件*/
};
const payment = merchant.createPayment(WebATMPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(); import { Merchant, ATMPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: ATMPaymentParams = {
// 皆選填
ExpireDate: 7,
PaymentInfoURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook
ClientRedirectURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook
};
const payment = merchant.createPayment(ATMPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(); import { Merchant, CVSPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: CVSPaymentParams = {
// 皆選填
StoreExpireDate: 7,
Desc_1: 'POS 機顯示條目 1',
Desc_2: 'POS 機顯示條目 2',
Desc_3: 'POS 機顯示條目 3',
Desc_4: 'POS 機顯示條目 4',
PaymentInfoURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook
ClientRedirectURL: 'https://...', // 若在 merchant 設定過, 此處不需再設定, 除非你針對此單要用個別的 hook
};
const payment = merchant.createPayment(CVSPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(); import { Merchant, BARCODEPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const extraParams: BARCODEPaymentParams = {
// 皆為可選
StoreExpireDate: 7,
PaymentInfoURL: 'https://...', // 不必特別設定, 因未設定會自動吃 merchant config 的值
ClientRedirectURL: 'https://...', // 不必特別設定, 因未設定會自動吃 merchant config 的值
Desc_1: 'POS 機顯示條目 1',
Desc_2: 'POS 機顯示條目 2',
Desc_3: 'POS 機顯示條目 3',
Desc_4: 'POS 機顯示條目 4',
};
const payment = merchant.createPayment(BARCODEPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(); import { Merchant, AndroidPayPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: AndroidPayPaymentParams = {
/* 綠界當前不提供此服務, 無參數, 請保持空物件 */
};
const payment = merchant.createPayment(AndroidPayPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout(); import { Merchant, ALLPayment } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const baseParams: BasePaymentParams = { ... };
const params: ALLPaymentParams = {
// 選填
IgnorePayment: ['WebATM', 'ATM'],
// 陣列可填 'Credit', 'WebATM', 'ATM', 'CVS', 'BARCODE', 'AndroidPay'
// 表示不提供這些付款方式給消費者選擇
// 其餘參數: 根據可用的付款方式, 將所有 params 結合起來在此設定
// 個別設定請參考前述 1~8 之設定
BindingCard: 0,
MerchantMemberID: undefined,
Language: undefined,
Redeem: undefined,
UnionPay: 2,
// ... 略
};
const payment = merchant.createPayment(ALLPayment, baseParams, params);
const htmlRedirectPostForm = await payment.checkout();建立交易資料查詢的工廠方法。建立時請注入要使用的 QueryClass,並準備好每一種查詢要填寫的參數 params。建立的 QueryClass 實例具有 .read() 的非同步方法可以向綠界服務發起查詢請求。Query 是冪等操作。
注意
永遠不可以省略
params,即使你並未使用params中的任何屬性,還是應該令其為空物件{}而非undefined。
Arguments:
-
QueryClass(Class): 各種查詢的 Class,包含有-
TradeInfoQuery: 訂單資料查詢 -
PaymentInfoQuery: ATM/CVS/BARCODE 取號結果查詢 -
CreditCardPeriodInfoQuery: 信用卡定期定額訂單查詢 -
TradeV2Query: 查詢信用卡單筆明細紀錄 -
TradeNoAioQuery: 下載特店對帳媒體檔 -
FundingReconDetail: 下載信用卡撥款對帳資料檔
-
-
params(Object): 根據不同的 QueryClass 查詢方式,各自所需的獨特參數。分述於下方各種查詢範例。
Returns:
- (Object): query 實例
import { Merchant, TradeInfoQuery } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(TradeInfoQuery, {
MerchantTradeNo: 'tn12345678'
});
const data = await query.read();-
查詢「信用卡一次付清」、「信用卡分期」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '4e5c882cab5a4796be7f', ItemName: '手機/平板 鋁合金桌面支架 | 人體工 學追劇必備#', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261428508660', TradeDate: '2022/04/26 14:28:50', TradeAmt: 1440, TradeStatus: '1', HandlingCharge: 29, PaymentDate: '2022/04/26 14:29:15', PaymentType: 'Credit_CreditCard', PaymentTypeChargeFee: 29, // 以下欄位只有當結帳時 baseParams.NeedExtraPaidInfo 設 'Y' 才有 // 故不一定會在響應資料中出現 // 以下欄位和信用卡交易方式有關 process_date: '2022/04/27 17:19:44', amount: 1440, auth_code: '777777', gwsr: 11718189, eci: 0, card4no: '2222', card6no: '431195', // 以下欄位和此交易方式無關 ATMAccBank: '', ATMAccNo: '', WebATMBankName: '', WebATMAccBank: '', WebATMAccNo: '', PayFrom: '', PaymentNo: '', red_dan: '', red_de_amt: '', red_ok_amt: '', red_yet: '', staed: '', stage: '', stast: '', // 以下官方已棄用 AlipayID: '', AlipayTradeNo: '', TenpayTradeNo: '', }
-
查詢「信用卡定期定額」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '20211026001969730', ItemName: 'test 200 新台幣 x 1', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2110261713558708', TradeDate: '2021/10/26 17:13:55', TradeAmt: 200, TradeStatus: '1', HandlingCharge: 5, PaymentDate: '2021/10/26 17:14:27', PaymentType: 'Credit_CreditCard', PaymentTypeChargeFee: 5, PeriodType: 'D', Frequency: 91, ExecTimes: 999, TotalSuccessTimes: 3, PeriodAmount: 200, TotalSuccessAmount: 600, // 以下欄位和信用卡交易方式有關 process_date: '2021/10/26 17:14:27', amount: 200, auth_code: '777777', gwsr: 11718189, card4no: '2222', card6no: '431195', eci: '', // 當非數字時,保持空值(空字串) // 其餘欄位和此交易方式無關, 也不一定會出現 // 所有欄位請參考上方完整的 response data 格式 // ...略 }
-
查詢「WebATM」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '20220426133333', ItemName: '湊町十六-打go嚴選-【黑水】雙鬥茶 200 元 x 2#運費 137 元 x 1', CustomField1: '商家統一編號:83269087', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261333378539', TradeDate: '2022/04/26 13:33:37', TradeAmt: '537', TradeStatus: '1', HandlingCharge: '10', PaymentDate: '2022/04/26 13:33:45', PaymentType: 'WebATM_TAISHIN', PaymentTypeChargeFee: '10', WebATMBankName: '', WebATMAccBank: '812', WebATMAccNo: '15646', // 其餘欄位和此交易方式無關, 也不一定會出現 // 所有欄位請參考上方完整的 response data 格式 // ...略 }
- 查詢「ATM」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: 'N22042600020513', ItemName: '日本金鳥-吊掛式蚊香盤一般尺寸 173 元 X1#雙龍牌 日式兒童前開式雨衣-XS/S/M/L 136 元 X1', CustomField1: '', CustomField2: '', CustomField3: 'N22042600020', CustomField4: 'ATM', TradeNo: '2204261421418645', TradeDate: '2022/04/26 14:21:41', TradeAmt: 409, TradeStatus: '0', HandlingCharge: '10', PaymentDate: '', PaymentType: 'ATM_LAND', PaymentTypeChargeFee: 10, ATMAccBank: '', ATMAccNo: '', // 其餘欄位和此交易方式無關, 也不一定會出現 // 所有欄位請參考上方完整的 response data 格式 // ...略 }
- 查詢「CVS」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '2204220310222', ItemName: '顥陽蘭坊 5000 TWD x 1', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261439048696', TradeDate: '2022/04/26 14:39:04', TradeAmt: 200, TradeStatus: '1', HandlingCharge: '0', PaymentNo: 'LLL22112732600', PaymentDate: '2022/04/22 14:11:30', PaymentType: 'CVS_CVS', PayFrom: 'ibon', PaymentTypeChargeFee: 0, // 其餘欄位和此交易方式無關, 也不一定會出現 // 所有欄位請參考上方完整的 response data 格式 // ...略 }
- 查詢「BARCODE」交易的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '2204220310222', ItemName: '顥陽蘭坊 5000 TWD x 1', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261439048696', TradeDate: '2022/04/26 14:39:04', TradeAmt: 200, TradeStatus: '1', HandlingCharge: 0, PaymentNo: 'LLL22112732600', PaymentDate: '2022/04/22 14:11:30', PaymentType: 'BARCODE_BARCODE', PayFrom: 'family', PaymentTypeChargeFee: 0, // 其餘欄位和此交易方式無關, 也不一定會出現 // 所有欄位請參考上方完整的 response data 格式 // ...略 }
import { Merchant, PaymentInfoQuery } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(PaymentInfoQuery, {
MerchantTradeNo: 'tn12345678'
});
const data = await query.read();-
查詢「ATM」付款資訊的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: 'N22042600020513', CustomField1: '', CustomField2: '', CustomField3: 'N22042600020', CustomField4: 'ATM', TradeNo: '2204261421418645', TradeDate: '2022/04/26 14:21:51', TradeAmt: 409, PaymentType: 'ATM_LAND', ExpireDate: '2022/04/29', BankCode: '005', vAccount: '5219111913209840', RtnCode: 2, RtnMsg: 'Get VirtualAccount Succeeded', }
-
查詢「CVS」付款資訊的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: '7c80cdef716c4a2998d', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261439048696', TradeDate: '2022/04/26 14:39:30', TradeAmt: 200, PaymentType: 'CVS_CVS', ExpireDate: '2022/05/03 14:39:30', PaymentNo: 'LLL22116735498', PaymentURL: 'https://payment-stage.ecpay.com.tw/PaymentRule/CVSBarCode?PaymentNo=LLL22116735498', RtnCode: 10100073, RtnMsg: 'Get CVS Code Succeeded.', }
-
查詢「BARCODE」付款資訊的 response data 範例
{ CheckMacValue: 'ABCD...', MerchantID: '2000132', StoreID: '', MerchantTradeNo: 'CK20220426401292', CustomField1: '', CustomField2: '', CustomField3: '', CustomField4: '', TradeNo: '2204261401048597', TradeDate: '2022/04/26 14:02:17', TradeAmt: 1500, PaymentType: 'BARCODE_BARCODE', ExpireDate: '2022/05/03 14:39:30', Barcode1: '1105036EA', Barcode2: '3453011539919569', Barcode3: '042677000001500', RtnCode: 10100073, RtnMsg: 'Get CVS Code Succeeded.', }
-
無法查詢「信用卡」、「ATM」立即付款的資訊(PaymentInfoQuery 只能查延遲付款類的)
{ // ... 略 RtnCode: 10200047, RtnMsg: 'Cant not find the trade data.', }
import { Merchant, CreditCardPeriodInfoQuery } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(CreditCardPeriodInfoQuery, {
MerchantTradeNo: 'tn12345678'
});
const data = await query.read();-
查詢「信用卡定期定額」付款資訊的 response data 範例
{ MerchantID: '2000132', MerchantTradeNo: 'a2394da5fa5c4ef6b0b', TradeNo: '2204260959138173', PeriodType: 'M', Frequency: 1, ExecTimes: 12, TotalSuccessTimes: 1, PeriodAmount: 100, TotalSuccessAmount: 100, RtnCode: 1, ExecStatus: '1', ExecLog: [ { RtnCode: 1, RtnMsg: '成功.', TradeNo: '2204260959138173', amount: 100, auth_code: '777777', gwsr: 11955800, process_date: '2022/04/26 10:00:22', }, ], process_date: '2022/04/26 10:00:22', amount: 100, auth_code: '777777', gwsr: 11955800, card4no: '4444', card6no: '431195', }
-
無法查詢信用卡「一次付清」、「分期」付款資訊
{ MerchantID: '0', MerchantTradeNo: null, RtnCode: 10200047, // ... 略 }
import { Merchant, TradeV2Query } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(TradeV2Query, {
CreditRefundId: 10123456, // baseParams.NeedExtraPaidInfo = 'Y' 時取得詳情中的 gwsr 值即是此 Id
CreditAmount: 500,
CreditCheckCode: 59997889 // 商家檢查碼, 後台 > 信用卡收單 > 信用卡授權資訊可查到
});
const data = await query.read();-
response data
{ RtnMsg: "", RtnValue: { TradeID: '0015625112', amount: 100, clsamt: 100, authtime: "2016/5/12 下午 07:09:17", status: "已關帳" close_data: [ { status: "已關帳", sno: "2782343", amount: 100, datetime: "2016/5/12 下午 08:00:00" } ] }, }
import { Merchant, TradeNoAioQuery } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(TradeNoAioQuery, {
// 必填
DateType: '2', // '2'(付款日) | '4'(撥款日) | '6'(訂單日)
BeginDate: '2022-04-25',
EndDate: '2022-04-26',
MediaFormated: '1', // '0'(舊格式) | '1'(新格式)
// 選填
PaymentType: '01', // '01'(信用卡) | '02'(WebATM) | '03'(ATM) | '04'(CVS) | '05'(BARCODE) | '10'(全家立即儲) | '11'(圓夢彈性分期);
PlatformStatus: undefined, // undefined(全部) | '1'(一般) | '2'(平台)
PaymentStatus: '0', // undefined(全部) | '0'(未付款) | '1'(已付款) | '2'(訂單失敗)
AllocateStatus: undefined, // undefined(全部) | '0'(未撥款) | '1'(已撥款)
CharSet: '1', // undefeind(Server預設) | '1'(Big5) | '2'(utf8);
});
const data: string = await query.read(); // csv檔- response data: 純文字 (.csv 檔)
import { Merchant, FundingReconDetail } from 'node-ecpay-aio';
const merchant = new Merchant(...);
const query = merchant.createQuery(FundingReconDetail, {
// 必填
PayDateType: 'fund', // 'fund'(依結算日) | 'close'(依關帳日) | 'enter'(依撥款日)
StartDate: '2022-04-25',
EndDate: '2022-04-26',
MediaFormated: '1', // '0'(舊格式) | '1'(新格式)
// 選填
CharSet: '1', // undefeind(Server預設) | '1'(Big5) | '2'(utf8);
});
const data: string = await query.read(); // csv檔- response data: 純文字 (.csv 檔)
建立操作的工廠方法。建立時請注入要使用的 ActionClass,並準備好每一種操作要填寫的參數 params。建立的 ActionClass 實例具有 .execute() 的非同步方法可以向綠界服務發起遠端操作請求。Action 是非冪等操作。
注意
永遠不可以省略
params,即使你並未使用params中的任何屬性,還是應該令其為空物件{}而非undefined。
Arguments:
-
ActionClass(Class): 各種操作的 Class,包含有-
DoAction: 信用卡請退款作業 -
CreditCardPeriodAction: 信用卡定期定額訂單作業
-
-
params(Object): 根據不同的 ActionClass 操作方式,各自所需的獨特參數。分述於下方各種操作範例。
Returns:
- (Object): action 實例
const action = merchant.createAction(DoAction, {
// 皆為必填
MerchantTradeNo: 'tn12345678',
TradeNo: '8811223388121'.
Action: 'C' , // 'C'(關帳) | 'R'(退刷) | 'E'(取消) | 'N'(放棄)
TotalAmount: 500
});
const result = await action.execute(); // {}-
response data
{ MerchantID: '2000132', MerchantTradeNo: '20211026001969730', TradeNo: '20120315174058256423', RtnCode: 1, RtnMsg: '關帳成功', }
const action = merchant.createAction(CreditCardPeriodAction, {
// 皆為必填
MerchantTradeNo: 'tn12345678',
Action: 'ReAuth', // 'ReAuth' | 'Cancel';
});
const result = await action.execute(); // {}-
response data
{ CheckMacValue: '205B4135AAB1F78AAD407838E344A291C0CCD67BB3188A58992B07F27BE61006', MerchantID: '2000132', MerchantTradeNo: '20211026001969730', RtnCode: 1, RtnMsg: '停用成功', }
所有的 Payment Classes 都有 .checkout() 的結帳方法。
如果需要開立電子發票,請於結帳時帶入發票參數 chekcout(invoice)。如不開立發票,直接執行checkout()即可。
Arguments:
-
invoice(Object, optional): 發票參數 結帳時開立電子發票
Returns:
- (String): html redirect post form
const htmlRedirectPostForm = await payment.checkout();-
result (a html redirect post form)
<form id="_form_aio_checkout" action="https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5" method="post"> <input type="hidden" name="CheckMacValue" id="CheckMacValue" value="2C6E582088B63CE828D27CE7E89FE0BA840F2599F10002A6AC0213DFD147C116" />...略...<input type="hidden" name="TradeDesc" id="TradeDesc" value="node-ecpay-aio testing order for CreditOneTimePayment" /> <script type="text/javascript"> document.getElementById('_form_aio_checkout').submit(); </script> </form>
const invoice: InvoiceParams = {
RelateNumber: 'rl-no',
TaxType: '1',
Donation: '0',
Print: '0',
InvoiceItemName: 'item1|item2',
InvoiceItemCount: '2|5',
InvoiceItemWord: '台|張',
InvoiceItemPrice: '100|50',
InvoiceRemark: '測試發票備註',
CustomerPhone: '0911111111',
};
const htmlRedirectPostForm = await payment.checkout(invoice);-
result (a html redirect post form)
<form id="_form_aio_checkout" action="https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5" method="post"> <input type="hidden" name="CarruerType" id="CarruerType" value="" /><input type="hidden" name="CheckMacValue" id="CheckMacValue" value="3185EDD19B600CA2780AD3DE387DB09434A84AE0BE37B64EB36C428D3BA40264" />...略...<input type="hidden" name="TotalAmount" id="TotalAmount" value="999" /><input type="hidden" name="TradeDesc" id="TradeDesc" value="node-ecpay-aio testing order for CreditOneTimePayment" /> <script type="text/javascript"> document.getElementById('_form_aio_checkout').submit(); </script> </form>
所有的 Query Classes 都有 .read() 的查詢資料讀取方法。
Arguments:
-
invoice(Object, optional): 發票參數 結帳時開立電子發票
Returns:
- (Promise): promise
const result = await query.read();- 各種不同查詢的回傳結果資料請參考
createQuery()API 說明。
所有的 Action Classes 都有 .execute() 的執行操作方法。
Arguments:
- none
Returns:
- (Promise): promise
const reuslt = action.execute();- 各種不同操作的回傳結果資料請參考
createAction()API 說明。
import { Merchant } from 'node-ecpay-aio';
// Step 1: 建立特店
const merchant = new Merchant('Test', {
MerchantID: 'your-merchant-id',
HashKey: 'your-merchant-hashkey',
HashIV: 'your-merchant-hashiv',
ReturnURL: 'https://api.test.com/your/hook',
});
// [使用情境一] Step 2: 特店建立 payment => Step 3: 結帳
const payment = merchant.createPayment(CreditOneTimePayment, {});
const htmlRedirectPostForm = await payment.checkout({
// 結帳時給予發票資訊即表示要開立發票
RelateNumber: 'order-123456',
TaxType: '1',
Donation: '0',
Print: '0',
InvoiceItemName: '鉛筆|橡皮擦',
InvoiceItemCount: '10|2',
InvoiceItemWord: '支|顆',
InvoiceItemPrice: '12|18',
DelayDay: 0,
});
// [使用情境二] Step 2: 特店建立 query => Step 3: 執行查詢
const tradeInfoQuery = merchant.createQuery(TradeInfoQuery, {
MerchantTradeNo: 'tn12345678',
});
const tradeInfo = await tradeInfoQuery.read();
// [使用情境三] Step 2: 特店建立 action => Step 3: 執行操作
const reAuthAction = merchant.createAction(CreditCardPeriodAction, {
MerchantTradeNo: 'some-trade-no';
Action: 'ReAuth'
});
const reAuthResult = await reAuthAction.execute();