newebpay-api
v1.3.0
Published
This project implements NewebPay (藍新金流) in Node.js
Downloads
8
Maintainers
Readme
NewebPay API Implementation
This project implements NewebPay (藍新金流) in Node.js
Packages Used:
crypto
(built-in)node-fetch
dotenv
qs
Usage
1. Download the package
npm i newebpay-api
2. Create a .env file
NEWEBPAY_HASH_KEY=your_hash_key
NEWEBPAY_HASH_IV=your_hash_iv
3. Code Example
1. Instantiate NewebPay class
Set
isProduction
tofalse
for using NewebPay testing website
1.1 Initialize a merchant object and pass it into NewebPay
import NewebPay from 'newebpay-api';
import { config } from 'dotenv';
config();
const merchant = {
MerchantID: 'YourMerchantID',
hashKey: process.env.NEWEBPAY_HASH_KEY,
hashIV: process.env.NEWEBPAY_HASH_IV,
isProduction: false,
};
const newebpay = new NewebPay(merchant);
2. Generate Post Data
2.1 Generate trade information using NewebPay.generateTradeInfo
const tradeInfo = newebpay.generateTradeInfo({
MerchantOrderNo: 'ljwvis_1633936296772',
Amt: 40400,
ItemDesc: 'IPhone 13 Pro Max 256GB Graphite',
Email: '[email protected]',
ReturnURL: '',
NotifyURL: '',
ClientBackURL: '',
});
Or your can specify RespondType
. The defualt is default JSON
, you can specify it to String
.
const tradeInfo = newebpay.generateTradeInfo(
{
MerchantOrderNo: "ljwvis_1633936296772",
Amt: 40400,
ItemDesc: "IPhone 13 Pro Max 256GB Graphite",
Email: "[email protected]",
ReturnURL: "",
NotifyURL: "",
ClientBackURL: "",
},
"String")
);
Output:
{
MerchantID: 'MS323389404',
RespondType: 'JSON',
TimeStamp: 1634030621628,
Version: '1.6',
MerchantOrderNo: 'ljwvis_1633936296772',
Amt: 40400,
ItemDesc: 'IPhone 13 Pro Max 256GB Graphite',
Email: '[email protected]',
ReturnURL: '',
NotifyURL: '',
ClientBackURL: ''
}
2.2 Pass tradeInfo into NewebPay.generatePostData
to Generate POST Data
const postData = newebpay.generatePostData(tradeInfo);
Output:
{
URL: 'https://ccore.newebpay.com/MPG/mpg_gateway',
MerchantID: 'MS323389404',
TradeInfo: 'e37d5e47d5be4ac5c86f3f2e4c62c92cb60fb318976b41a3a26154d7d3bc69c15eecb522494a3c95b667e93e3b4339254998214886998336e6de787c6fa88e1b8c2f14e1768e604084342364f0af1170daaf8af3fde671b09901e72df4885e9c9decda2856040b1acb5b42b0b48d2b5bab14f3a823d21bd817014b82174718e67662946191fcba7527971d952630748fd6e5cd279628f238c1ca0e2dcfa5267cc922a3c8ddfa994b2e10d7cc96b01eeb59c5d405ccf91f174b1cbbb2155d5a1c675314565c76f1751eafc264aaab2d8d1f4d6ca6fd810c7ed44d60439e9750e5398e5609503fa83adedb616e09b88e77c0f9b44c4e7aee9f2d125d81dc11ee99',
TradeSha: '5679E8CA307EC67B82060006A5D24FFDB803640548AB6F85465ABCE33FC04CFF',
Version: '1.6'
}
3. Server Receiving Payment Infomation from NewebPay
3.1 Simple server example and its output
app.post('/payment/confirm/newebpay', (req, res) => {
const returnMessage = req.body;
console.log(returnMessage);
});
output:
{
Status: "SUCCESS",
MerchantID: "MS323389404",
Version: "1.6",
TradeInfo:
"dea2ece70ce77eaf9c1c8d5dbf3efaa04561be1e542f12e506f90c24010cb53a1d1c0e65d186d94065923e4b7dc6c5a8c054f1cbfab5a5dac2b41d12c50dbfd43b81fa6ce53712bd731b80f705701c2acdeaea06342d6984e507988456626cf1a36b244fdf364943f1e5878cce5224993b1c8a3d53c425b57f06be12a7327feb38516cc7aec442d5c0064c791e7db4f32faad6d2ddd4c8c4b060b4f9b1624cb5f8d6660584b9b93be123a536720641b0c9ac89c996818429070040d8366255ba40ce487f709794330b664dd291c571f0dee4102e82b6592fbd041c6d88be080f69c86238cb3c0e7d38b413957e43559a8bf1b9305619b2568f64524463f84d62dfbe94de5e75a1446447d7a224c3136e295d5c6d9dd487d38e4b8b25cd624fc03c08441652e031937dd0928ca3889f618ee1c9f0de1b3c0e6b97e90cf62726098cea004ae9f48cb6077edb3b2bf16abd78e18d3a4cf30d8921beafa0bcbdf56d69c4a1df8e908ed27651023ca5eb10fd2841e01472ad6f69246070bf8a3ea444aa2161f20f069a524f4257921e860e58f36d0701e4ea18c280df33b69aacd71221ad6be3e2b6d46021548fa2b9dbdb5ac6907f58166e13cf608f569912e06971e69ec826cec95ec7603e8194bea8f050d36f6eab5524b4cda470d2e8c6f37644",
TradeSha: "BC41CC582C146C798504AE582E1A8335C1E792C62ACBFD82FD4ADB4381BE757A",
}
3.2 Decrypt the returned message using NewebPay.decrypt
const decryptedMessage = newebpay.decrypt(returnMessage);
If RespondType
is set to String
as described in section 2.1, parseQueryString
should be set to true
const decryptedMessage = newebpay.decrypt(returnMessage, true);
Output:
{
Status: 'SUCCESS',
Message: '授權成功',
Result: {
MerchantID: 'MS323389404',
Amt: 300,
TradeNo: '21100714592067778',
MerchantOrderNo: 'vevzlu_1633589710468',
RespondType: 'JSON',
IP: '123.456.789.123',
EscrowBank: 'HNCB',
PaymentType: 'CREDIT',
RespondCode: '00',
Auth: '755566',
Card6No: '400022',
Card4No: '1111',
Exp: '2603',
TokenUseStatus: '0',
InstFirst: 0,
InstEach: 0,
Inst: 0,
ECI: '',
PayTime: '2021-10-0714:59:20',
PaymentMethod: 'CREDIT'
}
}
4. Confirm trade result by querying trade information
4.1 Generate query information using NewebPay.generateQueryInfo
. The first argument is MerchantOrderNo
(Order id) and the second, Amt
(Amount)
const queryInfo = newebpay.generateQueryInfo('vevzlu_1633589710468', 300);
Output:
{
MerchantID: 'MS323389404',
Version: '1.2',
RespondType: 'JSON',
CheckValue: '',
TimeStamp: 1634032084432,
MerchantOrderNo: 'vevzlu_1633589710468',
Amt: 300
}
4.2 Query trade information using NewebPay.queryTradeInfo
const queryResult = await newebpay.queryTradeInfo(queryInfo);
Output:
{
Status: 'SUCCESS',
Message: '查詢成功',
Result: {
MerchantID: 'MS323389404',
Amt: 300,
TradeNo: '21100714592067778',
MerchantOrderNo: 'vevzlu_1633589710468',
TradeStatus: '1',
PaymentType: 'CREDIT',
CreateTime: '2021-10-07 14:59:20',
PayTime: '2021-10-07 14:59:20',
FundTime: '0000-00-00',
CheckCode: '824B2BDE75941FE8620F681F8876A6E4175BC36905D2922287A5A7DF79F95283',
RespondCode: '00',
Auth: '755566',
ECI: null,
CloseAmt: null,
CloseStatus: '0',
BackBalance: '300',
BackStatus: '0',
RespondMsg: '授權成功',
Inst: '0',
InstFirst: '0',
InstEach: '0',
PaymentMethod: 'CREDIT',
Card6No: '400022',
Card4No: '1111',
AuthBank: 'KGI'
}
}
5. Resources
6. Contact
if you have any suggestion or question, please do not hesitate to email me at [email protected]