Node.js SDK
GitHub Repository: sunbay-nexus-sdk-nodejs
Official SUNBAY Nexus Node.js SDK, providing complete payment integration capabilities for Node.js applications.
Features
- ✅ Support for TypeScript and JavaScript
- ✅ Complete type definitions
- ✅ Automatic authentication
- ✅ Automatic retry for GET requests
- ✅ Comprehensive error handling
- ✅ HTTP connection pool (axios + HTTP Agent)
- ✅ Support for custom logging
Installation
npm
npm install @sunbay/sunbay-nexus-sdkNote: This SDK is written in TypeScript but compiled to JavaScript. You can use it directly in both JavaScript and TypeScript projects without any compilation steps.
Quick Start
1. Initialize Client
NexusClient uses an internal HTTP connection pool. Create it once and reuse it globally — do not create a new instance for every request. Repeated creation wastes connection pool resources.
JavaScript (CommonJS)
const { NexusClient } = require('@sunbay/sunbay-nexus-sdk');
const client = new NexusClient({
apiKey: '{YOUR_API_KEY}',
baseUrl: 'https://open.sunbay.us',
});We recommend tuning connectTimeout, readTimeout, maxRetries, maxTotal, and maxPerRoute based on your concurrency level and business requirements. See Configuration Options for details.
2. Create Payment Transaction
Important: All amount fields use the smallest currency unit (integers). For example: 100.00 USD = 10000 cents
JavaScript (CommonJS)
const {
NexusClient,
SunbayBusinessError,
SunbayNetworkError,
} = require('@sunbay/sunbay-nexus-sdk');
// Assume client is already initialized (from step 1)
const request = {
appId: 'app_123456',
merchantId: 'mch_789012',
referenceOrderId: 'ORDER20231119001',
transactionRequestId: `PAY_REQ_${Date.now()}`,
amount: {
orderAmount: 10000, // 100.00 USD = 10000 cents
priceCurrency: 'USD',
},
description: 'Product purchase',
terminalSn: 'T1234567890',
};
try {
const response = await client.sale(request);
console.log('Transaction ID:', response.transactionId);
} catch (error) {
if (error.name === 'SunbayNetworkError') {
console.error('Network Error:', error.message);
if (error.retryable) {
console.log('This error is retryable');
}
} else if (error.name === 'SunbayBusinessError') {
console.error('API Error:', error.code, error.message);
if (error.traceId) {
console.error('Trace ID:', error.traceId);
}
}
}API Methods
All request types are TypeScript interfaces. Requests are constructed as plain object literals.
In-Person Payment APIs
sale(request)- Payment transactionauth(request)- Pre-authorizationforcedAuth(request)- Forced authorizationincrementalAuth(request)- Incremental authorizationpostAuth(request)- Post-authorization completionrefund(request)- RefundvoidTransaction(request)- Void transactionabort(request)- Abort transactiontipAdjust(request)- Tip adjustmentbatchQuery(request)- Query open (unsettled) batchesbatchClose(request)- Batch settlementbatchCloseList(request)- Query closed (settled) batches
Online Payment APIs
createCheckoutSession(request)- Create hosted checkout sessionexpireCheckoutSession(request)- Expire a checkout sessioncheckoutDirectPayment(request)- Direct payment (server-to-server)onlineRefund(request)- Online refund
Transaction Query APIs
query(request)- Query transaction
Merchant APIs
merchantQuery(request)- Retrieve merchant informationmerchantTerminalsQuery(request)- List terminals bound to a merchant
Error Handling
The SDK throws two types of errors:
SunbayNetworkError: Network-related errors (connection timeout, network errors, etc.)SunbayBusinessError: Business logic errors (parameter validation, API business errors, etc.)
JavaScript (CommonJS)
try {
const response = await client.sale(request);
} catch (error) {
if (error.name === 'SunbayNetworkError') {
console.error('Network Error:', error.message);
if (error.retryable) {
// Can retry
}
} else if (error.name === 'SunbayBusinessError') {
console.error('API Error:', error.code, error.message);
if (error.traceId) {
console.error('Trace ID:', error.traceId);
}
}
}Enum Types
The SDK provides enum types for improved type safety. Response fields are automatically converted from API codes to enum types.
TransactionStatus
import { TransactionStatus } from '@sunbay/sunbay-nexus-sdk';
const response = await client.query(request);
if (response.transactionStatus === TransactionStatus.SUCCESS) {
console.log('Transaction successful');
}
console.log(response.transactionStatus.getCode()); // 'S'Available TransactionStatus values:
TransactionStatus.INITIAL- Initial state (code: I)TransactionStatus.PROCESSING- Processing (code: P)TransactionStatus.SUCCESS- Success (code: S)TransactionStatus.FAIL- Failed (code: F)TransactionStatus.CLOSED- Closed (code: C)
Other Enums
TransactionType- SALE, AUTH, FORCED_AUTH, INCREMENTAL, POST_AUTH, REFUND, VOIDEntryMode- MANUAL, SWIPE, FALLBACK_SWIPE, CONTACT, CONTACTLESSCardNetworkType- CREDIT, DEBIT, EBT, EGC, UNKNOWNPaymentCategory- CARD, CARD_CREDIT, CARD_DEBIT, QR_MPM, QR_CPMAuthenticationMethod- NOT_AUTHENTICATED, PIN, OFFLINE_PIN, BY_PASS, SIGNATURERelatedTransactionStatus- VOIDED, INCREMENTAL, REFUNDED, CAPTURE, PART_REFUNDEDTransactionBatchStatus- N, U, C
Configuration Options
const client = new NexusClient({
apiKey: 'sk_test_xxx', // Required: API key
baseUrl: 'https://open.sunbay.us', // Default: https://open.sunbay.us
connectTimeout: 10000, // Default: 10000ms (10 seconds)
readTimeout: 30000, // Default: 30000ms (30 seconds)
maxRetries: 3, // Default: 3 times (GET request retry)
maxTotal: 200, // Default: 200 (max connections in pool)
maxPerRoute: 200, // Default: 200 (max connections per route)
});Logging
The SDK supports custom loggers compatible with debug(), info(), warn(), error() methods (e.g., winston, pino). By default it uses console logging with [sunbay-nexus-sdk] prefix.
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [new winston.transports.Console()],
});
const client = new NexusClient({
apiKey: 'sk_test_xxx',
logger: logger,
});System Requirements
- Node.js 18.x or higher
- axios 1.6+
The SDK is compiled to JavaScript. You don’t need TypeScript to use this SDK. TypeScript projects will automatically get full type definitions and IntelliSense support.
Related Links
License
MIT License