@muhammedaksam/sipay-node 1.0.5 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/branded-solution.js +0 -7
- package/dist/esm/resources/branded-solution.js.map +1 -1
- package/dist/esm/resources/cards.js +74 -0
- package/dist/esm/resources/cards.js.map +1 -0
- package/dist/esm/resources/cashout.js +17 -0
- package/dist/esm/resources/cashout.js.map +1 -0
- package/dist/esm/resources/marketplace.js +58 -0
- package/dist/esm/resources/marketplace.js.map +1 -0
- package/dist/esm/resources/payment-completion.js +41 -0
- package/dist/esm/resources/payment-completion.js.map +1 -0
- package/dist/esm/resources/payments.js +34 -1
- package/dist/esm/resources/payments.js.map +1 -1
- package/dist/esm/resources/recurring.js +4 -12
- package/dist/esm/resources/recurring.js.map +1 -1
- package/dist/esm/resources/sub-merchant.js +84 -0
- package/dist/esm/resources/sub-merchant.js.map +1 -0
- package/dist/esm/types/index.js +2 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/status-codes.js +292 -0
- package/dist/esm/types/status-codes.js.map +1 -0
- package/dist/esm/utils/http-client.js +14 -3
- package/dist/esm/utils/http-client.js.map +1 -1
- package/dist/esm/utils/index.js +158 -15
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/status-code-helpers.js +158 -0
- package/dist/esm/utils/status-code-helpers.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/branded-solution.d.ts +1 -5
- package/dist/resources/branded-solution.d.ts.map +1 -1
- package/dist/resources/branded-solution.js +0 -7
- package/dist/resources/branded-solution.js.map +1 -1
- package/dist/resources/cards.d.ts +76 -0
- package/dist/resources/cards.d.ts.map +1 -0
- package/dist/resources/cards.js +78 -0
- package/dist/resources/cards.js.map +1 -0
- package/dist/resources/cashout.d.ts +28 -0
- package/dist/resources/cashout.d.ts.map +1 -0
- package/dist/resources/cashout.js +21 -0
- package/dist/resources/cashout.js.map +1 -0
- package/dist/resources/commissions.d.ts +2 -2
- package/dist/resources/commissions.d.ts.map +1 -1
- package/dist/resources/marketplace.d.ts +87 -0
- package/dist/resources/marketplace.d.ts.map +1 -0
- package/dist/resources/marketplace.js +62 -0
- package/dist/resources/marketplace.js.map +1 -0
- package/dist/resources/payment-completion.d.ts +21 -0
- package/dist/resources/payment-completion.d.ts.map +1 -0
- package/dist/resources/payment-completion.js +78 -0
- package/dist/resources/payment-completion.js.map +1 -0
- package/dist/resources/payments.d.ts +21 -7
- package/dist/resources/payments.d.ts.map +1 -1
- package/dist/resources/payments.js +34 -1
- package/dist/resources/payments.js.map +1 -1
- package/dist/resources/recurring.d.ts +0 -9
- package/dist/resources/recurring.d.ts.map +1 -1
- package/dist/resources/recurring.js +4 -12
- package/dist/resources/recurring.js.map +1 -1
- package/dist/resources/sub-merchant.d.ts +136 -0
- package/dist/resources/sub-merchant.d.ts.map +1 -0
- package/dist/resources/sub-merchant.js +88 -0
- package/dist/resources/sub-merchant.js.map +1 -0
- package/dist/types/index.d.ts +373 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/status-codes.d.ts +125 -0
- package/dist/types/status-codes.d.ts.map +1 -0
- package/dist/types/status-codes.js +300 -0
- package/dist/types/status-codes.js.map +1 -0
- package/dist/utils/http-client.d.ts.map +1 -1
- package/dist/utils/http-client.js +14 -3
- package/dist/utils/http-client.js.map +1 -1
- package/dist/utils/index.d.ts +50 -5
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +170 -16
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/status-code-helpers.d.ts +42 -0
- package/dist/utils/status-code-helpers.d.ts.map +1 -0
- package/dist/utils/status-code-helpers.js +164 -0
- package/dist/utils/status-code-helpers.js.map +1 -0
- package/package.json +11 -9
package/dist/utils/index.js
CHANGED
|
@@ -32,39 +32,43 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
35
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.
|
|
39
|
+
exports.luhnCheck = luhnCheck;
|
|
37
40
|
exports.validateCreditCard = validateCreditCard;
|
|
41
|
+
exports.maskCardNumber = maskCardNumber;
|
|
38
42
|
exports.formatAmount = formatAmount;
|
|
43
|
+
exports.formatAmountForHash = formatAmountForHash;
|
|
44
|
+
exports.generatePaymentHashKey = generatePaymentHashKey;
|
|
45
|
+
exports.generateStatusHashKey = generateStatusHashKey;
|
|
46
|
+
exports.generateConfirmPaymentHashKey = generateConfirmPaymentHashKey;
|
|
47
|
+
exports.generateHashKey = generateHashKey;
|
|
39
48
|
exports.generateInvoiceId = generateInvoiceId;
|
|
40
49
|
exports.validatePaymentData = validatePaymentData;
|
|
41
50
|
exports.maskCreditCard = maskCreditCard;
|
|
42
51
|
exports.parseSipayError = parseSipayError;
|
|
52
|
+
exports.validateHashKey = validateHashKey;
|
|
53
|
+
exports.generateServerFormatHashKey = generateServerFormatHashKey;
|
|
43
54
|
const crypto = __importStar(require("crypto"));
|
|
55
|
+
const { createHash, createCipheriv, createDecipheriv } = crypto;
|
|
44
56
|
/**
|
|
45
57
|
* Utility functions for Sipay SDK
|
|
46
58
|
*/
|
|
47
|
-
/**
|
|
48
|
-
* Generate hash key for payment requests
|
|
49
|
-
* Based on Sipay documentation requirements
|
|
50
|
-
*/
|
|
51
|
-
function generateHashKey(merchantKey, invoiceId, amount, secretKey) {
|
|
52
|
-
const hashString = `${merchantKey}${invoiceId}${amount}${secretKey}`;
|
|
53
|
-
return crypto.createHash('sha256').update(hashString).digest('hex');
|
|
54
|
-
}
|
|
55
59
|
/**
|
|
56
60
|
* Validate credit card number using Luhn algorithm
|
|
57
61
|
*/
|
|
58
|
-
function
|
|
59
|
-
const
|
|
60
|
-
// Check
|
|
61
|
-
if (
|
|
62
|
+
function luhnCheck(cardNumber) {
|
|
63
|
+
const digits = cardNumber.replace(/\D/g, '').split('').map(Number);
|
|
64
|
+
// Check minimum length
|
|
65
|
+
if (digits.length < 13 || digits.length > 19) {
|
|
62
66
|
return false;
|
|
63
67
|
}
|
|
64
68
|
let sum = 0;
|
|
65
69
|
let isEven = false;
|
|
66
|
-
for (let i =
|
|
67
|
-
let digit =
|
|
70
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
71
|
+
let digit = digits[i];
|
|
68
72
|
if (isEven) {
|
|
69
73
|
digit *= 2;
|
|
70
74
|
if (digit > 9) {
|
|
@@ -77,11 +81,100 @@ function validateCreditCard(cardNumber) {
|
|
|
77
81
|
return sum % 10 === 0;
|
|
78
82
|
}
|
|
79
83
|
/**
|
|
80
|
-
*
|
|
84
|
+
* Validate credit card number (alias for luhnCheck)
|
|
85
|
+
*/
|
|
86
|
+
function validateCreditCard(cardNumber) {
|
|
87
|
+
return luhnCheck(cardNumber);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Mask credit card number for display
|
|
91
|
+
*/
|
|
92
|
+
function maskCardNumber(cardNumber) {
|
|
93
|
+
const cleaned = cardNumber.replace(/\D/g, '');
|
|
94
|
+
if (cleaned.length < 8)
|
|
95
|
+
return cleaned;
|
|
96
|
+
const first4 = cleaned.slice(0, 4);
|
|
97
|
+
const last4 = cleaned.slice(-4);
|
|
98
|
+
const middle = '*'.repeat(cleaned.length - 8);
|
|
99
|
+
return `${first4}${middle}${last4}`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Format amount for Sipay API - amounts should be sent as numbers, not cents
|
|
81
103
|
*/
|
|
82
104
|
function formatAmount(amount) {
|
|
105
|
+
// Amount should be formatted as a float with proper decimal places
|
|
106
|
+
// For amounts like 100.00, it should be "100.00", not "1.00"
|
|
83
107
|
return amount.toFixed(2);
|
|
84
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Format amount specifically for hash key generation
|
|
111
|
+
* This should match PHP's number_format($amount, 2, ".", "") exactly
|
|
112
|
+
* PHP always formats with 2 decimal places: 10.00, 125.50, etc.
|
|
113
|
+
*/
|
|
114
|
+
function formatAmountForHash(amount) {
|
|
115
|
+
// Match PHP number_format($amount, 2, ".", "") - always 2 decimal places
|
|
116
|
+
return amount.toFixed(2);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate hash key for payment requests
|
|
120
|
+
* Order matches PHP SDK CreateNonSecurePaymentRequest::generateHashKeyParts():
|
|
121
|
+
* 1. total, 2. installments_number, 3. currency_code, 4. merchant_key, 5. invoice_id
|
|
122
|
+
*/
|
|
123
|
+
function generatePaymentHashKey(total, installment, currencyCode, merchantKey, invoiceId, apiSecret) {
|
|
124
|
+
const parts = [
|
|
125
|
+
formatAmountForHash(total),
|
|
126
|
+
installment.toString(),
|
|
127
|
+
currencyCode,
|
|
128
|
+
merchantKey,
|
|
129
|
+
invoiceId,
|
|
130
|
+
];
|
|
131
|
+
return generateHashKey(parts, apiSecret);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Generate hash key for status check requests
|
|
135
|
+
* Order matches PHP SDK CheckTransactionStatusRequest::generateHashKeyParts():
|
|
136
|
+
* 1. invoice_id, 2. merchant_key
|
|
137
|
+
*/
|
|
138
|
+
function generateStatusHashKey(invoiceId, merchantKey, apiSecret) {
|
|
139
|
+
const parts = [invoiceId, merchantKey];
|
|
140
|
+
return generateHashKey(parts, apiSecret);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generate hash key for payment confirmation requests
|
|
144
|
+
* Order matches PHP SDK: merchant_key|invoice_id|status
|
|
145
|
+
*/
|
|
146
|
+
function generateConfirmPaymentHashKey(merchantKey, invoiceId, status, apiSecret) {
|
|
147
|
+
const parts = [merchantKey, invoiceId, status.toString()];
|
|
148
|
+
return generateHashKey(parts, apiSecret);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generate hash key for payment requests
|
|
152
|
+
* Exact 1:1 Node.js implementation of PHP's generateHashKey function
|
|
153
|
+
* Matches: $total . '|' . $installment . '|' . $currency_code . '|' . $merchant_key . '|' . $invoice_id
|
|
154
|
+
* with openssl_encrypt('aes-256-cbc') encryption
|
|
155
|
+
*/
|
|
156
|
+
function generateHashKey(parts, appSecret) {
|
|
157
|
+
const data = parts.join('|');
|
|
158
|
+
// Generate IV using SHA1 hash of random value
|
|
159
|
+
const iv = createHash('sha1').update(String(Math.random())).digest('hex').slice(0, 16);
|
|
160
|
+
// Generate password using SHA1 hash of app secret
|
|
161
|
+
const password = createHash('sha1').update(appSecret).digest('hex');
|
|
162
|
+
// Generate salt using SHA1 hash of random value
|
|
163
|
+
const salt = createHash('sha1').update(String(Math.random())).digest('hex').slice(0, 4);
|
|
164
|
+
// Create encryption key using SHA256 hash of password and salt
|
|
165
|
+
const saltWithPassword = createHash('sha256')
|
|
166
|
+
.update(password + salt)
|
|
167
|
+
.digest('hex')
|
|
168
|
+
.slice(0, 32);
|
|
169
|
+
// Encrypt data using AES-256-CBC
|
|
170
|
+
const cipher = createCipheriv('aes-256-cbc', saltWithPassword, iv);
|
|
171
|
+
let encrypted = cipher.update(data, 'binary', 'base64');
|
|
172
|
+
encrypted += cipher.final('base64');
|
|
173
|
+
// Bundle components and replace forward slashes with double underscores
|
|
174
|
+
let msgEncryptedBundle = `${iv}:${salt}:${encrypted}`;
|
|
175
|
+
msgEncryptedBundle = msgEncryptedBundle.replace(/\//g, '__');
|
|
176
|
+
return msgEncryptedBundle;
|
|
177
|
+
}
|
|
85
178
|
/**
|
|
86
179
|
* Generate a unique invoice ID
|
|
87
180
|
*/
|
|
@@ -175,4 +268,65 @@ function parseSipayError(error) {
|
|
|
175
268
|
message: error.message || 'Network error',
|
|
176
269
|
};
|
|
177
270
|
}
|
|
271
|
+
/**
|
|
272
|
+
* Validate hash key using server-side validation logic
|
|
273
|
+
* This matches exactly what the PHP SDK does for server-side validation
|
|
274
|
+
* Expected decrypted format: status|total|invoiceId|orderId|currencyCode
|
|
275
|
+
*/
|
|
276
|
+
function validateHashKey(hashKey, secretKey) {
|
|
277
|
+
let status = '';
|
|
278
|
+
let currencyCode = '';
|
|
279
|
+
let total = 0;
|
|
280
|
+
let invoiceId = '';
|
|
281
|
+
let orderId = 0;
|
|
282
|
+
if (!hashKey) {
|
|
283
|
+
return [status, total, invoiceId, orderId, currencyCode];
|
|
284
|
+
}
|
|
285
|
+
try {
|
|
286
|
+
// Replace underscores with forward slashes (PHP compatibility)
|
|
287
|
+
const normalizedHashKey = hashKey.replace(/_/g, '/');
|
|
288
|
+
const password = createHash('sha1').update(secretKey).digest('hex');
|
|
289
|
+
const components = normalizedHashKey.split(':');
|
|
290
|
+
if (components.length > 2) {
|
|
291
|
+
const iv = components[0] || '';
|
|
292
|
+
const saltHex = components[1] || '';
|
|
293
|
+
const encryptedMsg = components[2] || '';
|
|
294
|
+
// Generate salt exactly like PHP: hash('sha256', $password . $salt)
|
|
295
|
+
const saltWithPassword = createHash('sha256')
|
|
296
|
+
.update(password + saltHex)
|
|
297
|
+
.digest('hex');
|
|
298
|
+
// Create decipher with proper parameters
|
|
299
|
+
// PHP's openssl_decrypt expects:
|
|
300
|
+
// - IV as raw ASCII bytes (16-char hex string treated as ASCII)
|
|
301
|
+
// - Key as binary from hex string (32 bytes for AES-256)
|
|
302
|
+
const decipher = createDecipheriv('aes-256-cbc', Buffer.from(saltWithPassword, 'hex').slice(0, 32), // 32-byte key from hex
|
|
303
|
+
Buffer.from(iv, 'ascii') // IV: 16-char hex string as ASCII bytes
|
|
304
|
+
);
|
|
305
|
+
let decrypted = decipher.update(encryptedMsg, 'base64', 'utf8');
|
|
306
|
+
decrypted += decipher.final('utf8');
|
|
307
|
+
if (decrypted.includes('|')) {
|
|
308
|
+
const array = decrypted.split('|');
|
|
309
|
+
status = array[0] || '0';
|
|
310
|
+
total = parseFloat(array[1] || '0');
|
|
311
|
+
invoiceId = array[2] || '0';
|
|
312
|
+
orderId = parseInt(array[3] || '0');
|
|
313
|
+
currencyCode = array[4] || '';
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
// Silently handle decryption errors
|
|
319
|
+
}
|
|
320
|
+
return [status, total, invoiceId, orderId, currencyCode];
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Generate hash key in server validation format
|
|
324
|
+
* Server expects: status|total|invoiceId|orderId|currencyCode
|
|
325
|
+
*/
|
|
326
|
+
function generateServerFormatHashKey(status, total, invoiceId, orderId, currencyCode, appSecret) {
|
|
327
|
+
const parts = [status, formatAmountForHash(total), invoiceId, orderId.toString(), currencyCode];
|
|
328
|
+
return generateHashKey(parts, appSecret);
|
|
329
|
+
}
|
|
330
|
+
// Export status code helpers
|
|
331
|
+
__exportStar(require("./status-code-helpers"), exports);
|
|
178
332
|
//# sourceMappingURL=index.js.map
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sipay Status Code Utilities
|
|
3
|
+
* Helper functions for working with Sipay API status codes
|
|
4
|
+
*/
|
|
5
|
+
import { SipayStatusCode, SipayStatusCategory } from '../types/status-codes';
|
|
6
|
+
/**
|
|
7
|
+
* Enhanced error information for status codes
|
|
8
|
+
*/
|
|
9
|
+
export interface StatusCodeInfo {
|
|
10
|
+
code: number;
|
|
11
|
+
description: string;
|
|
12
|
+
category: SipayStatusCategory;
|
|
13
|
+
isSuccess: boolean;
|
|
14
|
+
isError: boolean;
|
|
15
|
+
isRetryable: boolean;
|
|
16
|
+
httpEquivalent?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get comprehensive information about a status code
|
|
20
|
+
*/
|
|
21
|
+
export declare function getStatusCodeInfo(statusCode: number): StatusCodeInfo;
|
|
22
|
+
/**
|
|
23
|
+
* Common status code groups for easy checking
|
|
24
|
+
*/
|
|
25
|
+
export declare const StatusCodeGroups: {
|
|
26
|
+
readonly SUCCESS: readonly [SipayStatusCode.SUCCESSFUL, SipayStatusCode.REFUND_REQUEST_CREATED, SipayStatusCode.PARTIALLY_SUCCESSFUL];
|
|
27
|
+
readonly VALIDATION_ERRORS: readonly [SipayStatusCode.BASIC_VALIDATION, SipayStatusCode.ITEMS_VALIDATION_ERROR, SipayStatusCode.PRICE_TOTAL_MISMATCH, SipayStatusCode.QUANTITY_MUST_BE_INTEGER, SipayStatusCode.INVALID_INVOICE_ID, SipayStatusCode.INVALID_CHARACTER, SipayStatusCode.INVALID_CARD_NUMBER, SipayStatusCode.CANCELLATION_URL_SHOULD_NOT_BE_BLANK];
|
|
28
|
+
readonly PAYMENT_ERRORS: readonly [SipayStatusCode.ORDER_FAILED, SipayStatusCode.PAYMENT_TERM_NOT_SET, SipayStatusCode.REFUND_FAILED, SipayStatusCode.TRANSACTION_NOT_FOUND, SipayStatusCode.ORDER_NOT_YET_PROCESSED, SipayStatusCode.TRANSACTION_NOT_APPROVED];
|
|
29
|
+
readonly MERCHANT_LIMIT_ERRORS: readonly [SipayStatusCode.CREDIT_CARD_BLOCKED, SipayStatusCode.MERCHANT_DAILY_AMOUNT_LIMIT_EXCEEDED, SipayStatusCode.MERCHANT_MONTHLY_TRANSACTION_LIMIT_EXCEEDED, SipayStatusCode.MERCHANT_MONTHLY_AMOUNT_LIMIT_EXCEEDED, SipayStatusCode.MINIMUM_TRANSACTION_LIMIT_VIOLATED];
|
|
30
|
+
readonly CARD_ERRORS: readonly [SipayStatusCode.CREDIT_CARD_BLOCKED, SipayStatusCode.MERCHANT_CARD_TRANSACTION_NOT_ALLOWED, SipayStatusCode.CARD_PROGRAM_MISMATCH, SipayStatusCode.FOREIGN_CARDS_NOT_ALLOWED, SipayStatusCode.NO_FOREIGN_CARD_COMMISSION];
|
|
31
|
+
readonly HASH_KEY_ERRORS: readonly [SipayStatusCode.HASH_KEY_VALIDATION_ERROR, SipayStatusCode.INVALID_HASH_KEY, SipayStatusCode.HASH_KEY_MERCHANT_KEY_MISMATCH, SipayStatusCode.HASH_KEY_CUSTOMER_NUMBER_MISMATCH, SipayStatusCode.HASH_KEY_CARD_HOLDER_NAME_MISMATCH, SipayStatusCode.HASH_KEY_CARD_NUMBER_MISMATCH, SipayStatusCode.HASH_KEY_EXPIRY_MONTH_MISMATCH, SipayStatusCode.HASH_KEY_EXPIRY_YEAR_MISMATCH, SipayStatusCode.HASH_KEY_CARD_TOKEN_MISMATCH];
|
|
32
|
+
readonly RETRYABLE_ERRORS: readonly [SipayStatusCode.ORDER_NOT_YET_PROCESSED, SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED, SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED_ALT, SipayStatusCode.REFUND_FAILED];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Check if status code is in a specific group
|
|
36
|
+
*/
|
|
37
|
+
export declare function isStatusInGroup(statusCode: number, group: readonly number[]): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Get suggested actions based on status code
|
|
40
|
+
*/
|
|
41
|
+
export declare function getSuggestedAction(statusCode: number): string;
|
|
42
|
+
//# sourceMappingURL=status-code-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-code-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/status-code-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,eAAe,EACf,mBAAmB,EAMpB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,CAUpE;AAsDD;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;CA6DnB,CAAC;AAEX;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAErF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAkC7D"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sipay Status Code Utilities
|
|
4
|
+
* Helper functions for working with Sipay API status codes
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.StatusCodeGroups = void 0;
|
|
8
|
+
exports.getStatusCodeInfo = getStatusCodeInfo;
|
|
9
|
+
exports.isStatusInGroup = isStatusInGroup;
|
|
10
|
+
exports.getSuggestedAction = getSuggestedAction;
|
|
11
|
+
const status_codes_1 = require("../types/status-codes");
|
|
12
|
+
/**
|
|
13
|
+
* Get comprehensive information about a status code
|
|
14
|
+
*/
|
|
15
|
+
function getStatusCodeInfo(statusCode) {
|
|
16
|
+
return {
|
|
17
|
+
code: statusCode,
|
|
18
|
+
description: (0, status_codes_1.getStatusDescription)(statusCode),
|
|
19
|
+
category: (0, status_codes_1.getStatusCategory)(statusCode),
|
|
20
|
+
isSuccess: (0, status_codes_1.isSuccessStatus)(statusCode),
|
|
21
|
+
isError: (0, status_codes_1.isErrorStatus)(statusCode),
|
|
22
|
+
isRetryable: (0, status_codes_1.isRetryableStatus)(statusCode),
|
|
23
|
+
httpEquivalent: getHttpEquivalent(statusCode),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Map Sipay status codes to HTTP status codes where applicable
|
|
28
|
+
*/
|
|
29
|
+
function getHttpEquivalent(statusCode) {
|
|
30
|
+
switch (statusCode) {
|
|
31
|
+
case status_codes_1.SipayStatusCode.SUCCESSFUL:
|
|
32
|
+
case status_codes_1.SipayStatusCode.REFUND_REQUEST_CREATED:
|
|
33
|
+
case status_codes_1.SipayStatusCode.PARTIALLY_SUCCESSFUL:
|
|
34
|
+
return 200; // OK
|
|
35
|
+
case status_codes_1.SipayStatusCode.BASIC_VALIDATION:
|
|
36
|
+
case status_codes_1.SipayStatusCode.ITEMS_VALIDATION_ERROR:
|
|
37
|
+
case status_codes_1.SipayStatusCode.PRICE_TOTAL_MISMATCH:
|
|
38
|
+
case status_codes_1.SipayStatusCode.QUANTITY_MUST_BE_INTEGER:
|
|
39
|
+
case status_codes_1.SipayStatusCode.INVALID_INVOICE_ID:
|
|
40
|
+
case status_codes_1.SipayStatusCode.INVALID_CHARACTER:
|
|
41
|
+
case status_codes_1.SipayStatusCode.INVALID_CARD_NUMBER:
|
|
42
|
+
case status_codes_1.SipayStatusCode.CANCELLATION_URL_SHOULD_NOT_BE_BLANK:
|
|
43
|
+
return 400; // Bad Request
|
|
44
|
+
case status_codes_1.SipayStatusCode.INVALID_CREDENTIALS:
|
|
45
|
+
case status_codes_1.SipayStatusCode.INVALID_TOKEN_OR_CLIENT_NUMBER:
|
|
46
|
+
return 401; // Unauthorized
|
|
47
|
+
case status_codes_1.SipayStatusCode.PAYMENT_INTEGRATION_NOT_ALLOWED:
|
|
48
|
+
case status_codes_1.SipayStatusCode.MERCHANT_NOT_ALLOWED_TOKEN_PAYMENT:
|
|
49
|
+
case status_codes_1.SipayStatusCode.MERCHANT_CARD_TRANSACTION_NOT_ALLOWED:
|
|
50
|
+
case status_codes_1.SipayStatusCode.FOREIGN_CARDS_NOT_ALLOWED:
|
|
51
|
+
return 403; // Forbidden
|
|
52
|
+
case status_codes_1.SipayStatusCode.MERCHANT_NOT_FOUND:
|
|
53
|
+
case status_codes_1.SipayStatusCode.TRANSACTION_NOT_FOUND:
|
|
54
|
+
case status_codes_1.SipayStatusCode.POS_NOT_FOUND:
|
|
55
|
+
case status_codes_1.SipayStatusCode.COMMISSION_NOT_FOUND:
|
|
56
|
+
case status_codes_1.SipayStatusCode.INSTALLMENT_NOT_FOUND:
|
|
57
|
+
case status_codes_1.SipayStatusCode.SUB_MERCHANT_NOT_FOUND:
|
|
58
|
+
return 404; // Not Found
|
|
59
|
+
case status_codes_1.SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED:
|
|
60
|
+
case status_codes_1.SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED_ALT:
|
|
61
|
+
return 409; // Conflict
|
|
62
|
+
case status_codes_1.SipayStatusCode.UNKNOWN_ERROR:
|
|
63
|
+
case status_codes_1.SipayStatusCode.CURRENCY_CONVERSION_FAILED:
|
|
64
|
+
case status_codes_1.SipayStatusCode.FILE_PROCESSING_ERROR:
|
|
65
|
+
return 500; // Internal Server Error
|
|
66
|
+
default:
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Common status code groups for easy checking
|
|
72
|
+
*/
|
|
73
|
+
exports.StatusCodeGroups = {
|
|
74
|
+
SUCCESS: [
|
|
75
|
+
status_codes_1.SipayStatusCode.SUCCESSFUL,
|
|
76
|
+
status_codes_1.SipayStatusCode.REFUND_REQUEST_CREATED,
|
|
77
|
+
status_codes_1.SipayStatusCode.PARTIALLY_SUCCESSFUL,
|
|
78
|
+
],
|
|
79
|
+
VALIDATION_ERRORS: [
|
|
80
|
+
status_codes_1.SipayStatusCode.BASIC_VALIDATION,
|
|
81
|
+
status_codes_1.SipayStatusCode.ITEMS_VALIDATION_ERROR,
|
|
82
|
+
status_codes_1.SipayStatusCode.PRICE_TOTAL_MISMATCH,
|
|
83
|
+
status_codes_1.SipayStatusCode.QUANTITY_MUST_BE_INTEGER,
|
|
84
|
+
status_codes_1.SipayStatusCode.INVALID_INVOICE_ID,
|
|
85
|
+
status_codes_1.SipayStatusCode.INVALID_CHARACTER,
|
|
86
|
+
status_codes_1.SipayStatusCode.INVALID_CARD_NUMBER,
|
|
87
|
+
status_codes_1.SipayStatusCode.CANCELLATION_URL_SHOULD_NOT_BE_BLANK,
|
|
88
|
+
],
|
|
89
|
+
PAYMENT_ERRORS: [
|
|
90
|
+
status_codes_1.SipayStatusCode.ORDER_FAILED,
|
|
91
|
+
status_codes_1.SipayStatusCode.PAYMENT_TERM_NOT_SET,
|
|
92
|
+
status_codes_1.SipayStatusCode.REFUND_FAILED,
|
|
93
|
+
status_codes_1.SipayStatusCode.TRANSACTION_NOT_FOUND,
|
|
94
|
+
status_codes_1.SipayStatusCode.ORDER_NOT_YET_PROCESSED,
|
|
95
|
+
status_codes_1.SipayStatusCode.TRANSACTION_NOT_APPROVED,
|
|
96
|
+
],
|
|
97
|
+
MERCHANT_LIMIT_ERRORS: [
|
|
98
|
+
status_codes_1.SipayStatusCode.MERCHANT_DAILY_TRANSACTION_LIMIT_EXCEEDED,
|
|
99
|
+
status_codes_1.SipayStatusCode.MERCHANT_DAILY_AMOUNT_LIMIT_EXCEEDED,
|
|
100
|
+
status_codes_1.SipayStatusCode.MERCHANT_MONTHLY_TRANSACTION_LIMIT_EXCEEDED,
|
|
101
|
+
status_codes_1.SipayStatusCode.MERCHANT_MONTHLY_AMOUNT_LIMIT_EXCEEDED,
|
|
102
|
+
status_codes_1.SipayStatusCode.MINIMUM_TRANSACTION_LIMIT_VIOLATED,
|
|
103
|
+
],
|
|
104
|
+
CARD_ERRORS: [
|
|
105
|
+
status_codes_1.SipayStatusCode.CREDIT_CARD_BLOCKED,
|
|
106
|
+
status_codes_1.SipayStatusCode.MERCHANT_CARD_TRANSACTION_NOT_ALLOWED,
|
|
107
|
+
status_codes_1.SipayStatusCode.CARD_PROGRAM_MISMATCH,
|
|
108
|
+
status_codes_1.SipayStatusCode.FOREIGN_CARDS_NOT_ALLOWED,
|
|
109
|
+
status_codes_1.SipayStatusCode.NO_FOREIGN_CARD_COMMISSION,
|
|
110
|
+
],
|
|
111
|
+
HASH_KEY_ERRORS: [
|
|
112
|
+
status_codes_1.SipayStatusCode.HASH_KEY_VALIDATION_ERROR,
|
|
113
|
+
status_codes_1.SipayStatusCode.INVALID_HASH_KEY,
|
|
114
|
+
status_codes_1.SipayStatusCode.HASH_KEY_MERCHANT_KEY_MISMATCH,
|
|
115
|
+
status_codes_1.SipayStatusCode.HASH_KEY_CUSTOMER_NUMBER_MISMATCH,
|
|
116
|
+
status_codes_1.SipayStatusCode.HASH_KEY_CARD_HOLDER_NAME_MISMATCH,
|
|
117
|
+
status_codes_1.SipayStatusCode.HASH_KEY_CARD_NUMBER_MISMATCH,
|
|
118
|
+
status_codes_1.SipayStatusCode.HASH_KEY_EXPIRY_MONTH_MISMATCH,
|
|
119
|
+
status_codes_1.SipayStatusCode.HASH_KEY_EXPIRY_YEAR_MISMATCH,
|
|
120
|
+
status_codes_1.SipayStatusCode.HASH_KEY_CARD_TOKEN_MISMATCH,
|
|
121
|
+
],
|
|
122
|
+
RETRYABLE_ERRORS: [
|
|
123
|
+
status_codes_1.SipayStatusCode.ORDER_NOT_YET_PROCESSED,
|
|
124
|
+
status_codes_1.SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED,
|
|
125
|
+
status_codes_1.SipayStatusCode.INVOICE_ID_ALREADY_PROCESSED_ALT,
|
|
126
|
+
status_codes_1.SipayStatusCode.MAXIMUM_TRANSACTION_LIMIT_VIOLATED,
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Check if status code is in a specific group
|
|
131
|
+
*/
|
|
132
|
+
function isStatusInGroup(statusCode, group) {
|
|
133
|
+
return group.includes(statusCode);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get suggested actions based on status code
|
|
137
|
+
*/
|
|
138
|
+
function getSuggestedAction(statusCode) {
|
|
139
|
+
const info = getStatusCodeInfo(statusCode);
|
|
140
|
+
switch (info.category) {
|
|
141
|
+
case status_codes_1.SipayStatusCategory.SUCCESS:
|
|
142
|
+
return 'Transaction completed successfully';
|
|
143
|
+
case status_codes_1.SipayStatusCategory.VALIDATION_ERROR:
|
|
144
|
+
return 'Check request parameters and fix validation errors';
|
|
145
|
+
case status_codes_1.SipayStatusCategory.AUTHENTICATION_ERROR:
|
|
146
|
+
return 'Verify API credentials and merchant configuration';
|
|
147
|
+
case status_codes_1.SipayStatusCategory.PAYMENT_ERROR:
|
|
148
|
+
if (info.isRetryable) {
|
|
149
|
+
return 'Transaction may be retried after a short delay';
|
|
150
|
+
}
|
|
151
|
+
return 'Check payment details and try with different parameters';
|
|
152
|
+
case status_codes_1.SipayStatusCategory.MERCHANT_ERROR:
|
|
153
|
+
return 'Contact your payment provider to resolve merchant configuration issues';
|
|
154
|
+
case status_codes_1.SipayStatusCategory.CARD_ERROR:
|
|
155
|
+
return 'Try with a different card or contact the card issuer';
|
|
156
|
+
case status_codes_1.SipayStatusCategory.HASH_ERROR:
|
|
157
|
+
return 'Verify hash key generation parameters and algorithm';
|
|
158
|
+
case status_codes_1.SipayStatusCategory.RECURRING_ERROR:
|
|
159
|
+
return 'Check recurring payment configuration and parameters';
|
|
160
|
+
default:
|
|
161
|
+
return 'Contact technical support for assistance';
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=status-code-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-code-helpers.js","sourceRoot":"","sources":["../../src/utils/status-code-helpers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@muhammedaksam/sipay-node",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Node.js TypeScript SDK for Sipay payment gateway",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -35,22 +35,22 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/muhammedaksam/sipay-node#readme",
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@eslint/js": "^9.
|
|
38
|
+
"@eslint/js": "^9.36.0",
|
|
39
39
|
"@types/jest": "^30.0.0",
|
|
40
|
-
"@types/node": "^24.
|
|
41
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
42
|
-
"@typescript-eslint/parser": "^8.
|
|
43
|
-
"eslint": "^9.
|
|
44
|
-
"jest": "^30.
|
|
40
|
+
"@types/node": "^24.5.2",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.44.0",
|
|
42
|
+
"@typescript-eslint/parser": "^8.44.0",
|
|
43
|
+
"eslint": "^9.36.0",
|
|
44
|
+
"jest": "^30.1.3",
|
|
45
45
|
"prettier": "^3.6.2",
|
|
46
46
|
"rimraf": "^6.0.1",
|
|
47
|
-
"ts-jest": "^29.4.
|
|
47
|
+
"ts-jest": "^29.4.4",
|
|
48
48
|
"ts-node": "^10.9.2",
|
|
49
49
|
"tsx": "^4.20.5",
|
|
50
50
|
"typescript": "^5.9.2"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"axios": "^1.
|
|
53
|
+
"axios": "^1.12.2"
|
|
54
54
|
},
|
|
55
55
|
"engines": {
|
|
56
56
|
"node": ">=18"
|
|
@@ -64,6 +64,8 @@
|
|
|
64
64
|
"test": "jest",
|
|
65
65
|
"test:watch": "jest --watch",
|
|
66
66
|
"test:coverage": "jest --coverage",
|
|
67
|
+
"test:integration": "npx tsx test/integration/test-runner.ts",
|
|
68
|
+
"test:final": "npx tsx examples/final-payment-test.ts",
|
|
67
69
|
"lint": "eslint src test examples --ext .ts",
|
|
68
70
|
"lint:fix": "eslint src test examples --ext .ts --fix",
|
|
69
71
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\" \"examples/**/*.ts\"",
|