@muhammedaksam/sipay-node 1.1.2 → 1.1.3

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 CHANGED
@@ -8,6 +8,7 @@ import { PaymentCompletion } from './resources/payment-completion';
8
8
  import { Marketplace } from './resources/marketplace';
9
9
  import { Cashout } from './resources/cashout';
10
10
  import { SubMerchant } from './resources/sub-merchant';
11
+ import { SipayWebhooks } from './resources/webhooks';
11
12
  export class Sipay {
12
13
  constructor(config) {
13
14
  this.client = new SipayHttpClient(config);
@@ -21,6 +22,7 @@ export class Sipay {
21
22
  this.marketplace = new Marketplace(this.client);
22
23
  this.cashout = new Cashout(this.client);
23
24
  this.subMerchant = new SubMerchant(this.client);
25
+ this.webhooks = new SipayWebhooks(this.client);
24
26
  }
25
27
  /**
26
28
  * Manually authenticate with Sipay API
@@ -57,5 +59,6 @@ export { PaymentCompletion } from './resources/payment-completion';
57
59
  export { Marketplace } from './resources/marketplace';
58
60
  export { Cashout } from './resources/cashout';
59
61
  export { SubMerchant } from './resources/sub-merchant';
62
+ export { SipayWebhooks } from './resources/webhooks';
60
63
  export * from './utils';
61
64
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,OAAO,KAAK;IAahB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,iBAAiB;AACjB,eAAe,KAAK,CAAC;AAErB,gBAAgB;AAChB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import { SipayResource } from './base';
2
+ import { validateHashKey } from '../utils';
3
+ /**
4
+ * Webhooks resource for handling Sipay webhook events
5
+ * Provides methods to validate and parse webhook notifications
6
+ *
7
+ * Uses the existing validateHashKey utility from utils for hash validation,
8
+ * which provides full AES-256-CBC decryption compatible with PHP SDK
9
+ */
10
+ export class SipayWebhooks extends SipayResource {
11
+ /**
12
+ * Validate webhook hash key to ensure request authenticity
13
+ * Uses the existing validateHashKey utility function
14
+ */
15
+ validateHashKey(hashKey, secretKey) {
16
+ try {
17
+ if (!hashKey) {
18
+ return { isValid: false, error: 'Hash key is required' };
19
+ }
20
+ // Use the existing validateHashKey function from utils
21
+ const [status, total, invoiceId, orderId, currencyCode] = validateHashKey(hashKey, secretKey);
22
+ // If we got valid data back, consider it a successful validation
23
+ const isValid = status !== '' || total !== 0 || invoiceId !== '' || orderId !== 0 || currencyCode !== '';
24
+ return {
25
+ isValid,
26
+ status,
27
+ total,
28
+ invoiceId,
29
+ orderId,
30
+ currencyCode,
31
+ error: isValid ? undefined : 'Hash validation failed',
32
+ };
33
+ }
34
+ catch (error) {
35
+ return {
36
+ isValid: false,
37
+ error: `Hash validation error: ${error.message}`,
38
+ };
39
+ }
40
+ }
41
+ /**
42
+ * Parse sales webhook payload
43
+ */
44
+ parseSalesWebhook(payload) {
45
+ return {
46
+ sipay_status: payload.sipay_status || '',
47
+ order_no: payload.order_no || '',
48
+ invoice_id: payload.invoice_id || '',
49
+ status_code: payload.status_code || '',
50
+ status_description: payload.status_description || '',
51
+ sipay_payment_method: payload.sipay_payment_method || '',
52
+ credit_card_no: payload.credit_card_no || '',
53
+ transaction_type: payload.transaction_type || 'Auth',
54
+ payment_status: payload.payment_status || '0',
55
+ payment_method: payload.payment_method || '1',
56
+ error_code: payload.error_code || '',
57
+ error: payload.error || '',
58
+ status: payload.status || '',
59
+ hash_key: payload.hash_key || '',
60
+ };
61
+ }
62
+ /**
63
+ * Parse recurring webhook payload
64
+ */
65
+ parseRecurringWebhook(payload) {
66
+ return {
67
+ merchant_key: payload.merchant_key || '',
68
+ invoice_id: payload.invoice_id || '',
69
+ order_id: payload.order_id || '',
70
+ product_price: parseFloat(payload.product_price) || 0,
71
+ plan_code: payload.plan_code || '',
72
+ recurring_number: payload.recurring_number || '',
73
+ status: payload.status || '',
74
+ attempts: payload.attempts || '',
75
+ action_date: payload.action_date || '',
76
+ };
77
+ }
78
+ /**
79
+ * Parse refund webhook payload
80
+ */
81
+ parseRefundWebhook(payload) {
82
+ return {
83
+ invoice_id: payload.invoice_id || '',
84
+ order_id: payload.order_id || '',
85
+ amount: parseFloat(payload.amount) || 0,
86
+ status: payload.status || '',
87
+ hash_key: payload.hash_key || '',
88
+ };
89
+ }
90
+ /**
91
+ * Verify sales webhook - validates hash and parses event
92
+ */
93
+ verifySalesWebhook(payload, appSecret) {
94
+ try {
95
+ const event = this.parseSalesWebhook(payload);
96
+ if (!event.hash_key) {
97
+ return { isValid: false, error: 'Missing hash key in webhook payload' };
98
+ }
99
+ const validation = this.validateHashKey(event.hash_key, appSecret);
100
+ return {
101
+ isValid: validation.isValid,
102
+ event: validation.isValid ? event : undefined,
103
+ validation,
104
+ error: validation.error,
105
+ };
106
+ }
107
+ catch (error) {
108
+ return {
109
+ isValid: false,
110
+ error: `Webhook verification failed: ${error.message}`,
111
+ };
112
+ }
113
+ }
114
+ /**
115
+ * Check if payment was successful based on webhook data
116
+ */
117
+ isPaymentSuccessful(event) {
118
+ return event.payment_status === '1' && event.status_code === '100';
119
+ }
120
+ /**
121
+ * Check if payment was pre-authorized (needs confirmation)
122
+ */
123
+ isPaymentPreAuthorized(event) {
124
+ return event.payment_status === '1' && event.transaction_type === 'Pre-Authorization';
125
+ }
126
+ /**
127
+ * Check if payment failed
128
+ */
129
+ isPaymentFailed(event) {
130
+ return event.payment_status === '0';
131
+ }
132
+ /**
133
+ * Get human-readable payment status
134
+ */
135
+ getPaymentStatusDescription(event) {
136
+ if (this.isPaymentSuccessful(event)) {
137
+ return event.transaction_type === 'Pre-Authorization'
138
+ ? 'Payment pre-authorized successfully - requires confirmation'
139
+ : 'Payment completed successfully';
140
+ }
141
+ if (this.isPaymentFailed(event)) {
142
+ return `Payment failed: ${event.status_description}`;
143
+ }
144
+ return `Payment status: ${event.status_description}`;
145
+ }
146
+ }
147
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/resources/webhooks.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ import { PaymentCompletion } from './resources/payment-completion';
8
8
  import { Marketplace } from './resources/marketplace';
9
9
  import { Cashout } from './resources/cashout';
10
10
  import { SubMerchant } from './resources/sub-merchant';
11
+ import { SipayWebhooks } from './resources/webhooks';
11
12
  export declare class Sipay {
12
13
  private client;
13
14
  payments: Payments;
@@ -19,6 +20,7 @@ export declare class Sipay {
19
20
  marketplace: Marketplace;
20
21
  cashout: Cashout;
21
22
  subMerchant: SubMerchant;
23
+ webhooks: SipayWebhooks;
22
24
  constructor(config: SipayConfig);
23
25
  /**
24
26
  * Manually authenticate with Sipay API
@@ -47,5 +49,6 @@ export { PaymentCompletion } from './resources/payment-completion';
47
49
  export { Marketplace } from './resources/marketplace';
48
50
  export { Cashout } from './resources/cashout';
49
51
  export { SubMerchant } from './resources/sub-merchant';
52
+ export { SipayWebhooks } from './resources/webhooks';
50
53
  export * from './utils';
51
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAEzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;gBAEpB,MAAM,EAAE,WAAW;IAe/B;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAG9B;AAGD,eAAe,KAAK,CAAC;AAGrB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAkB;IAEzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;gBAEnB,MAAM,EAAE,WAAW;IAgB/B;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;IAI9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAG9B;AAGD,eAAe,KAAK,CAAC;AAGrB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.SubMerchant = exports.Cashout = exports.Marketplace = exports.PaymentCompletion = exports.Cards = exports.Commissions = exports.BrandedSolution = exports.Recurring = exports.Payments = exports.SipayResource = exports.SipayHttpClient = exports.Sipay = void 0;
17
+ exports.SipayWebhooks = exports.SubMerchant = exports.Cashout = exports.Marketplace = exports.PaymentCompletion = exports.Cards = exports.Commissions = exports.BrandedSolution = exports.Recurring = exports.Payments = exports.SipayResource = exports.SipayHttpClient = exports.Sipay = void 0;
18
18
  const http_client_1 = require("./utils/http-client");
19
19
  const payments_1 = require("./resources/payments");
20
20
  const recurring_1 = require("./resources/recurring");
@@ -25,6 +25,7 @@ const payment_completion_1 = require("./resources/payment-completion");
25
25
  const marketplace_1 = require("./resources/marketplace");
26
26
  const cashout_1 = require("./resources/cashout");
27
27
  const sub_merchant_1 = require("./resources/sub-merchant");
28
+ const webhooks_1 = require("./resources/webhooks");
28
29
  class Sipay {
29
30
  constructor(config) {
30
31
  this.client = new http_client_1.SipayHttpClient(config);
@@ -38,6 +39,7 @@ class Sipay {
38
39
  this.marketplace = new marketplace_1.Marketplace(this.client);
39
40
  this.cashout = new cashout_1.Cashout(this.client);
40
41
  this.subMerchant = new sub_merchant_1.SubMerchant(this.client);
42
+ this.webhooks = new webhooks_1.SipayWebhooks(this.client);
41
43
  }
42
44
  /**
43
45
  * Manually authenticate with Sipay API
@@ -86,5 +88,7 @@ var cashout_2 = require("./resources/cashout");
86
88
  Object.defineProperty(exports, "Cashout", { enumerable: true, get: function () { return cashout_2.Cashout; } });
87
89
  var sub_merchant_2 = require("./resources/sub-merchant");
88
90
  Object.defineProperty(exports, "SubMerchant", { enumerable: true, get: function () { return sub_merchant_2.SubMerchant; } });
91
+ var webhooks_2 = require("./resources/webhooks");
92
+ Object.defineProperty(exports, "SipayWebhooks", { enumerable: true, get: function () { return webhooks_2.SipayWebhooks; } });
89
93
  __exportStar(require("./utils"), exports);
90
94
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAsD;AAEtD,mDAAgD;AAChD,qDAAkD;AAClD,mEAA+D;AAC/D,yDAAsD;AACtD,6CAA0C;AAC1C,uEAAmE;AACnE,yDAAsD;AACtD,iDAA8C;AAC9C,2DAAuD;AAEvD,MAAa,KAAK;IAahB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAe,CAAC,MAAM,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,0BAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAjDD,sBAiDC;AAED,iBAAiB;AACjB,kBAAe,KAAK,CAAC;AAErB,gBAAgB;AAChB,0CAAwB;AACxB,mDAAsD;AAA7C,8GAAA,eAAe,OAAA;AACxB,yCAAiD;AAAxC,qGAAA,aAAa,OAAA;AACtB,iDAAgD;AAAvC,oGAAA,QAAQ,OAAA;AACjB,mDAAkD;AAAzC,sGAAA,SAAS,OAAA;AAClB,iEAA+D;AAAtD,mHAAA,eAAe,OAAA;AACxB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,2CAA0C;AAAjC,8FAAA,KAAK,OAAA;AACd,qEAAmE;AAA1D,uHAAA,iBAAiB,OAAA;AAC1B,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,kGAAA,OAAO,OAAA;AAChB,yDAAuD;AAA9C,2GAAA,WAAW,OAAA;AACpB,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,qDAAsD;AAEtD,mDAAgD;AAChD,qDAAkD;AAClD,mEAA+D;AAC/D,yDAAsD;AACtD,6CAA0C;AAC1C,uEAAmE;AACnE,yDAAsD;AACtD,iDAA8C;AAC9C,2DAAuD;AACvD,mDAAqD;AAErD,MAAa,KAAK;IAchB,YAAY,MAAmB;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,6BAAe,CAAC,MAAM,CAAC,CAAC;QAE1C,uBAAuB;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,qBAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,kCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,IAAI,aAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,GAAG,IAAI,sCAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,IAAI,iBAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,0BAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,IAAI,wBAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAnDD,sBAmDC;AAED,iBAAiB;AACjB,kBAAe,KAAK,CAAC;AAErB,gBAAgB;AAChB,0CAAwB;AACxB,mDAAsD;AAA7C,8GAAA,eAAe,OAAA;AACxB,yCAAiD;AAAxC,qGAAA,aAAa,OAAA;AACtB,iDAAgD;AAAvC,oGAAA,QAAQ,OAAA;AACjB,mDAAkD;AAAzC,sGAAA,SAAS,OAAA;AAClB,iEAA+D;AAAtD,mHAAA,eAAe,OAAA;AACxB,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,2CAA0C;AAAjC,8FAAA,KAAK,OAAA;AACd,qEAAmE;AAA1D,uHAAA,iBAAiB,OAAA;AAC1B,uDAAsD;AAA7C,0GAAA,WAAW,OAAA;AACpB,+CAA8C;AAArC,kGAAA,OAAO,OAAA;AAChB,yDAAuD;AAA9C,2GAAA,WAAW,OAAA;AACpB,iDAAqD;AAA5C,yGAAA,aAAa,OAAA;AACtB,0CAAwB"}
@@ -0,0 +1,96 @@
1
+ import { SipayResource } from './base';
2
+ export interface SalesWebhookEvent {
3
+ sipay_status: string;
4
+ order_no: string;
5
+ invoice_id: string;
6
+ status_code: string;
7
+ status_description: string;
8
+ sipay_payment_method: string;
9
+ credit_card_no: string;
10
+ transaction_type: 'Auth' | 'Pre-Authorization';
11
+ payment_status: '0' | '1';
12
+ payment_method: '1' | '2' | '3';
13
+ error_code: string;
14
+ error: string;
15
+ status: string;
16
+ hash_key: string;
17
+ }
18
+ export interface RecurringWebhookEvent {
19
+ merchant_key: string;
20
+ invoice_id: string;
21
+ order_id: string;
22
+ product_price: number;
23
+ plan_code: string;
24
+ recurring_number: string;
25
+ status: string;
26
+ attempts: string;
27
+ action_date: string;
28
+ }
29
+ export interface RefundWebhookEvent {
30
+ invoice_id: string;
31
+ order_id: string;
32
+ amount: number;
33
+ status: string;
34
+ hash_key: string;
35
+ }
36
+ export interface WebhookValidationResult {
37
+ isValid: boolean;
38
+ status?: string;
39
+ total?: number;
40
+ invoiceId?: string;
41
+ orderId?: number;
42
+ currencyCode?: string;
43
+ error?: string;
44
+ }
45
+ /**
46
+ * Webhooks resource for handling Sipay webhook events
47
+ * Provides methods to validate and parse webhook notifications
48
+ *
49
+ * Uses the existing validateHashKey utility from utils for hash validation,
50
+ * which provides full AES-256-CBC decryption compatible with PHP SDK
51
+ */
52
+ export declare class SipayWebhooks extends SipayResource {
53
+ /**
54
+ * Validate webhook hash key to ensure request authenticity
55
+ * Uses the existing validateHashKey utility function
56
+ */
57
+ validateHashKey(hashKey: string, secretKey: string): WebhookValidationResult;
58
+ /**
59
+ * Parse sales webhook payload
60
+ */
61
+ parseSalesWebhook(payload: any): SalesWebhookEvent;
62
+ /**
63
+ * Parse recurring webhook payload
64
+ */
65
+ parseRecurringWebhook(payload: any): RecurringWebhookEvent;
66
+ /**
67
+ * Parse refund webhook payload
68
+ */
69
+ parseRefundWebhook(payload: any): RefundWebhookEvent;
70
+ /**
71
+ * Verify sales webhook - validates hash and parses event
72
+ */
73
+ verifySalesWebhook(payload: any, appSecret: string): {
74
+ isValid: boolean;
75
+ event?: SalesWebhookEvent;
76
+ validation?: WebhookValidationResult;
77
+ error?: string;
78
+ };
79
+ /**
80
+ * Check if payment was successful based on webhook data
81
+ */
82
+ isPaymentSuccessful(event: SalesWebhookEvent): boolean;
83
+ /**
84
+ * Check if payment was pre-authorized (needs confirmation)
85
+ */
86
+ isPaymentPreAuthorized(event: SalesWebhookEvent): boolean;
87
+ /**
88
+ * Check if payment failed
89
+ */
90
+ isPaymentFailed(event: SalesWebhookEvent): boolean;
91
+ /**
92
+ * Get human-readable payment status
93
+ */
94
+ getPaymentStatusDescription(event: SalesWebhookEvent): string;
95
+ }
96
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/resources/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGvC,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,mBAAmB,CAAC;IAC/C,cAAc,EAAE,GAAG,GAAG,GAAG,CAAC;IAC1B,cAAc,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,qBAAa,aAAc,SAAQ,aAAa;IAC9C;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,uBAAuB;IA8B5E;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,iBAAiB;IAmBlD;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,qBAAqB;IAc1D;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,kBAAkB;IAUpD;;OAEG;IACH,kBAAkB,CAChB,OAAO,EAAE,GAAG,EACZ,SAAS,EAAE,MAAM,GAChB;QACD,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;QAC1B,UAAU,CAAC,EAAE,uBAAuB,CAAC;QACrC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAwBD;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAItD;;OAEG;IACH,sBAAsB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAIzD;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAIlD;;OAEG;IACH,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;CAa9D"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SipayWebhooks = void 0;
4
+ const base_1 = require("./base");
5
+ const utils_1 = require("../utils");
6
+ /**
7
+ * Webhooks resource for handling Sipay webhook events
8
+ * Provides methods to validate and parse webhook notifications
9
+ *
10
+ * Uses the existing validateHashKey utility from utils for hash validation,
11
+ * which provides full AES-256-CBC decryption compatible with PHP SDK
12
+ */
13
+ class SipayWebhooks extends base_1.SipayResource {
14
+ /**
15
+ * Validate webhook hash key to ensure request authenticity
16
+ * Uses the existing validateHashKey utility function
17
+ */
18
+ validateHashKey(hashKey, secretKey) {
19
+ try {
20
+ if (!hashKey) {
21
+ return { isValid: false, error: 'Hash key is required' };
22
+ }
23
+ // Use the existing validateHashKey function from utils
24
+ const [status, total, invoiceId, orderId, currencyCode] = (0, utils_1.validateHashKey)(hashKey, secretKey);
25
+ // If we got valid data back, consider it a successful validation
26
+ const isValid = status !== '' || total !== 0 || invoiceId !== '' || orderId !== 0 || currencyCode !== '';
27
+ return {
28
+ isValid,
29
+ status,
30
+ total,
31
+ invoiceId,
32
+ orderId,
33
+ currencyCode,
34
+ error: isValid ? undefined : 'Hash validation failed',
35
+ };
36
+ }
37
+ catch (error) {
38
+ return {
39
+ isValid: false,
40
+ error: `Hash validation error: ${error.message}`,
41
+ };
42
+ }
43
+ }
44
+ /**
45
+ * Parse sales webhook payload
46
+ */
47
+ parseSalesWebhook(payload) {
48
+ return {
49
+ sipay_status: payload.sipay_status || '',
50
+ order_no: payload.order_no || '',
51
+ invoice_id: payload.invoice_id || '',
52
+ status_code: payload.status_code || '',
53
+ status_description: payload.status_description || '',
54
+ sipay_payment_method: payload.sipay_payment_method || '',
55
+ credit_card_no: payload.credit_card_no || '',
56
+ transaction_type: payload.transaction_type || 'Auth',
57
+ payment_status: payload.payment_status || '0',
58
+ payment_method: payload.payment_method || '1',
59
+ error_code: payload.error_code || '',
60
+ error: payload.error || '',
61
+ status: payload.status || '',
62
+ hash_key: payload.hash_key || '',
63
+ };
64
+ }
65
+ /**
66
+ * Parse recurring webhook payload
67
+ */
68
+ parseRecurringWebhook(payload) {
69
+ return {
70
+ merchant_key: payload.merchant_key || '',
71
+ invoice_id: payload.invoice_id || '',
72
+ order_id: payload.order_id || '',
73
+ product_price: parseFloat(payload.product_price) || 0,
74
+ plan_code: payload.plan_code || '',
75
+ recurring_number: payload.recurring_number || '',
76
+ status: payload.status || '',
77
+ attempts: payload.attempts || '',
78
+ action_date: payload.action_date || '',
79
+ };
80
+ }
81
+ /**
82
+ * Parse refund webhook payload
83
+ */
84
+ parseRefundWebhook(payload) {
85
+ return {
86
+ invoice_id: payload.invoice_id || '',
87
+ order_id: payload.order_id || '',
88
+ amount: parseFloat(payload.amount) || 0,
89
+ status: payload.status || '',
90
+ hash_key: payload.hash_key || '',
91
+ };
92
+ }
93
+ /**
94
+ * Verify sales webhook - validates hash and parses event
95
+ */
96
+ verifySalesWebhook(payload, appSecret) {
97
+ try {
98
+ const event = this.parseSalesWebhook(payload);
99
+ if (!event.hash_key) {
100
+ return { isValid: false, error: 'Missing hash key in webhook payload' };
101
+ }
102
+ const validation = this.validateHashKey(event.hash_key, appSecret);
103
+ return {
104
+ isValid: validation.isValid,
105
+ event: validation.isValid ? event : undefined,
106
+ validation,
107
+ error: validation.error,
108
+ };
109
+ }
110
+ catch (error) {
111
+ return {
112
+ isValid: false,
113
+ error: `Webhook verification failed: ${error.message}`,
114
+ };
115
+ }
116
+ }
117
+ /**
118
+ * Check if payment was successful based on webhook data
119
+ */
120
+ isPaymentSuccessful(event) {
121
+ return event.payment_status === '1' && event.status_code === '100';
122
+ }
123
+ /**
124
+ * Check if payment was pre-authorized (needs confirmation)
125
+ */
126
+ isPaymentPreAuthorized(event) {
127
+ return event.payment_status === '1' && event.transaction_type === 'Pre-Authorization';
128
+ }
129
+ /**
130
+ * Check if payment failed
131
+ */
132
+ isPaymentFailed(event) {
133
+ return event.payment_status === '0';
134
+ }
135
+ /**
136
+ * Get human-readable payment status
137
+ */
138
+ getPaymentStatusDescription(event) {
139
+ if (this.isPaymentSuccessful(event)) {
140
+ return event.transaction_type === 'Pre-Authorization'
141
+ ? 'Payment pre-authorized successfully - requires confirmation'
142
+ : 'Payment completed successfully';
143
+ }
144
+ if (this.isPaymentFailed(event)) {
145
+ return `Payment failed: ${event.status_description}`;
146
+ }
147
+ return `Payment status: ${event.status_description}`;
148
+ }
149
+ }
150
+ exports.SipayWebhooks = SipayWebhooks;
151
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/resources/webhooks.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.1.2",
3
+ "version": "1.1.3",
4
4
  "description": "Node.js TypeScript SDK for Sipay payment gateway",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",