pec-payment-sdk 1.1.1

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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.fa.md +212 -0
  3. package/README.md +212 -0
  4. package/dist/cjs/PecClient.d.ts +28 -0
  5. package/dist/cjs/PecClient.d.ts.map +1 -0
  6. package/dist/cjs/PecClient.js +218 -0
  7. package/dist/cjs/constants.d.ts +13 -0
  8. package/dist/cjs/constants.d.ts.map +1 -0
  9. package/dist/cjs/constants.js +15 -0
  10. package/dist/cjs/errors.d.ts +14 -0
  11. package/dist/cjs/errors.d.ts.map +1 -0
  12. package/dist/cjs/errors.js +28 -0
  13. package/dist/cjs/index.d.ts +6 -0
  14. package/dist/cjs/index.d.ts.map +1 -0
  15. package/dist/cjs/index.js +30 -0
  16. package/dist/cjs/soapClient.d.ts +6 -0
  17. package/dist/cjs/soapClient.d.ts.map +1 -0
  18. package/dist/cjs/soapClient.js +44 -0
  19. package/dist/cjs/types.d.ts +122 -0
  20. package/dist/cjs/types.d.ts.map +1 -0
  21. package/dist/cjs/types.js +2 -0
  22. package/dist/cjs/utils.d.ts +43 -0
  23. package/dist/cjs/utils.d.ts.map +1 -0
  24. package/dist/cjs/utils.js +162 -0
  25. package/dist/esm/PecClient.d.ts +28 -0
  26. package/dist/esm/PecClient.d.ts.map +1 -0
  27. package/dist/esm/PecClient.js +211 -0
  28. package/dist/esm/constants.d.ts +13 -0
  29. package/dist/esm/constants.d.ts.map +1 -0
  30. package/dist/esm/constants.js +12 -0
  31. package/dist/esm/errors.d.ts +14 -0
  32. package/dist/esm/errors.d.ts.map +1 -0
  33. package/dist/esm/errors.js +22 -0
  34. package/dist/esm/index.d.ts +6 -0
  35. package/dist/esm/index.d.ts.map +1 -0
  36. package/dist/esm/index.js +4 -0
  37. package/dist/esm/package.json +3 -0
  38. package/dist/esm/soapClient.d.ts +6 -0
  39. package/dist/esm/soapClient.d.ts.map +1 -0
  40. package/dist/esm/soapClient.js +36 -0
  41. package/dist/esm/types.d.ts +122 -0
  42. package/dist/esm/types.d.ts.map +1 -0
  43. package/dist/esm/types.js +1 -0
  44. package/dist/esm/utils.d.ts +43 -0
  45. package/dist/esm/utils.d.ts.map +1 -0
  46. package/dist/esm/utils.js +144 -0
  47. package/package.json +62 -0
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PecClient = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const constants_js_1 = require("./constants.js");
9
+ const errors_js_1 = require("./errors.js");
10
+ const soapClient_js_1 = require("./soapClient.js");
11
+ const utils_js_1 = require("./utils.js");
12
+ class PecClient {
13
+ constructor(options) {
14
+ if (!options?.loginAccount?.trim()) {
15
+ throw new errors_js_1.PecValidationError('loginAccount is required');
16
+ }
17
+ this.loginAccount = options.loginAccount;
18
+ this.defaultCallbackUrl = options.callbackUrl;
19
+ }
20
+ /** Starts a standard sale payment and returns a token plus redirect URL. */
21
+ async requestPayment(input) {
22
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
23
+ const currency = input.currency ?? 'toman';
24
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.SALE, 'SalePaymentRequestAsync', {
25
+ requestData: {
26
+ LoginAccount: this.loginAccount,
27
+ Amount: (0, utils_js_1.toRials)(input.amount, currency),
28
+ OrderId: input.orderId,
29
+ CallBackUrl: callbackUrl,
30
+ AdditionalData: input.additionalData ?? '',
31
+ Originator: input.originator ?? '',
32
+ },
33
+ });
34
+ const payload = result?.SalePaymentRequestResult ?? {};
35
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
36
+ }
37
+ /** Starts an online multiplexed sale (تسهیم آنلاین). */
38
+ async requestMultiplexedPayment(input) {
39
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
40
+ const currency = input.currency ?? 'toman';
41
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.MULTIPLEXED_SALE, 'MultiplexedSaleWithIBANPaymentRequestAsync', {
42
+ requestData: {
43
+ LoginAccount: this.loginAccount,
44
+ Amount: (0, utils_js_1.toRials)(input.amount, currency),
45
+ OrderId: input.orderId,
46
+ CallBackUrl: callbackUrl,
47
+ AdditionalData: '',
48
+ Originator: input.originator ?? '',
49
+ MultiplexedAccounts: {
50
+ MultiplexedAccount: (0, utils_js_1.mapMultiplexedAccounts)(input.accounts, currency),
51
+ },
52
+ },
53
+ });
54
+ const payload = result?.MultiplexedSaleWithIBANPaymentRequestResult ?? {};
55
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
56
+ }
57
+ /** Starts a government-ID sale (شناسه حساب دولتی). */
58
+ async requestGovernmentPayment(input) {
59
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
60
+ const currency = input.currency ?? 'toman';
61
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.GOVERNMENT_SALE, 'SalePaymentRequestAsync', {
62
+ requestData: {
63
+ LoginAccount: this.loginAccount,
64
+ Amount: (0, utils_js_1.toRials)(input.amount, currency),
65
+ OrderId: input.orderId,
66
+ CallBackUrl: callbackUrl,
67
+ AdditionalData: `GOVId=${input.govId}`,
68
+ Originator: input.originator ?? '',
69
+ },
70
+ });
71
+ const payload = result?.SalePaymentRequestResult ?? {};
72
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
73
+ }
74
+ /** Starts a government sale with multiplexed IBAN accounts. */
75
+ async requestGovernmentMultiplexedPayment(input) {
76
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
77
+ const currency = input.currency ?? 'toman';
78
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.GOVERNMENT_SALE, 'GovSaleWithMultiIbanPaymentRequestSW2Async', {
79
+ requestData: {
80
+ LoginAccount: this.loginAccount,
81
+ Amount: (0, utils_js_1.toRials)(input.amount, currency),
82
+ OrderId: input.orderId,
83
+ CallBackUrl: callbackUrl,
84
+ AdditionalData: `GOVId=${input.govId}`,
85
+ Originator: input.originator ?? '',
86
+ MultiplexedAccounts: {
87
+ MultiplexedAccount: (0, utils_js_1.mapMultiplexedAccounts)(input.accounts, currency),
88
+ },
89
+ },
90
+ });
91
+ const payload = result?.GovSaleWithMultiIbanPaymentRequestSW2Result ?? {};
92
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
93
+ }
94
+ /** Starts a bill payment request. */
95
+ async requestBillPayment(input) {
96
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
97
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.BILL, 'BillPaymentRequestAsync', {
98
+ requestData: {
99
+ LoginAccount: this.loginAccount,
100
+ BillId: input.billId,
101
+ PayId: input.payId,
102
+ OrderId: input.orderId,
103
+ Amount: '',
104
+ CallBackUrl: callbackUrl,
105
+ AdditionalData: input.additionalData ?? '',
106
+ Originator: input.originator ?? '',
107
+ },
108
+ });
109
+ const payload = result?.BillPaymentRequestResult ?? {};
110
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
111
+ }
112
+ /** Retrieves bill details before payment. */
113
+ async getBillInfo(input) {
114
+ if (!input.billId?.trim() || !input.payId?.trim()) {
115
+ throw new errors_js_1.PecValidationError('billId and payId are required');
116
+ }
117
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.BILL, 'GetBillInfoAsync', {
118
+ billId: input.billId,
119
+ payId: input.payId,
120
+ });
121
+ const payload = result?.GetBillInfoResult ?? {};
122
+ return (0, utils_js_1.normalizeBillInfoResult)(payload);
123
+ }
124
+ /** Starts a mobile top-up/charge request. */
125
+ async requestMobileTopup(input) {
126
+ const callbackUrl = this.resolveCallbackUrl(input.callbackUrl);
127
+ const currency = input.currency ?? 'toman';
128
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.MOBILE_TOPUP, 'TopupChargeRequestAsync', {
129
+ requestData: {
130
+ LoginAccount: this.loginAccount,
131
+ OrderId: input.orderId,
132
+ ChargeMobileNumber: input.chargeMobileNumber,
133
+ RequesterMobileNumber: input.requesterMobileNumber,
134
+ TopupType: input.topupType,
135
+ Amount: (0, utils_js_1.toRials)(input.amount, currency),
136
+ CallBackUrl: callbackUrl,
137
+ AdditionalData: input.additionalData ?? '',
138
+ Originator: input.originator ?? '',
139
+ },
140
+ });
141
+ const payload = result?.TopupChargeRequestResult ?? {};
142
+ return (0, utils_js_1.buildPaymentTokenResult)(payload.Status, payload.Token, payload.Message);
143
+ }
144
+ /** Confirms/settles a successful payment using its token. */
145
+ async confirmPayment(input) {
146
+ if (input.token === undefined || input.token === null || input.token === '') {
147
+ throw new errors_js_1.PecValidationError('token is required');
148
+ }
149
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.CONFIRM, 'ConfirmPaymentAsync', {
150
+ requestData: {
151
+ LoginAccount: this.loginAccount,
152
+ Token: input.token,
153
+ },
154
+ });
155
+ const payload = result?.ConfirmPaymentResult ?? {};
156
+ return {
157
+ status: (0, utils_js_1.normalizeSoapNumber)(payload.Status),
158
+ token: (0, utils_js_1.normalizeSoapField)(payload.Token),
159
+ cardNumberMasked: (0, utils_js_1.normalizeSoapField)(payload.CardNumberMasked),
160
+ rrn: (0, utils_js_1.normalizeSoapField)(payload.RRN),
161
+ };
162
+ }
163
+ /** Reverses a payment. Works only within the bank's allowed time window. */
164
+ async reversePayment(input) {
165
+ if (input.token === undefined || input.token === null || input.token === '') {
166
+ throw new errors_js_1.PecValidationError('token is required');
167
+ }
168
+ const result = await (0, soapClient_js_1.callSoapMethod)(constants_js_1.WSDL.REVERSAL, 'ReversalRequestAsync', {
169
+ requestData: {
170
+ LoginAccount: this.loginAccount,
171
+ Token: input.token,
172
+ },
173
+ });
174
+ const payload = result?.ReversalRequestResult ?? {};
175
+ return {
176
+ status: (0, utils_js_1.normalizeSoapNumber)(payload.Status),
177
+ token: (0, utils_js_1.normalizeSoapField)(payload.Token),
178
+ message: (0, utils_js_1.normalizeSoapField)(payload.Message),
179
+ };
180
+ }
181
+ /** Fetches sale transactions from PEC reporting REST API. */
182
+ async getSaleReport(input) {
183
+ if (!input.username?.trim() || !input.password?.trim()) {
184
+ throw new errors_js_1.PecValidationError('username and password are required');
185
+ }
186
+ (0, utils_js_1.validateSaleReportDateRange)(input.fromDate, input.toDate);
187
+ const authToken = Buffer.from(`${input.username}|${input.password}`).toString('base64');
188
+ try {
189
+ const response = await axios_1.default.post(constants_js_1.REPORT_API_URL, {
190
+ FromDate: input.fromDate,
191
+ ToDate: input.toDate,
192
+ RRN: input.rrn ?? '',
193
+ OrderId: input.orderId ?? '',
194
+ Token: input.token ?? '',
195
+ }, {
196
+ headers: {
197
+ 'Content-Type': 'application/json',
198
+ Authorization: `Basic ${authToken}`,
199
+ },
200
+ });
201
+ return response.data;
202
+ }
203
+ catch (error) {
204
+ throw new errors_js_1.PecTransportError('Failed to fetch sale report', error);
205
+ }
206
+ }
207
+ resolveCallbackUrl(callbackUrl) {
208
+ const resolved = callbackUrl ?? this.defaultCallbackUrl;
209
+ if (!resolved) {
210
+ throw new errors_js_1.PecValidationError('callbackUrl is required');
211
+ }
212
+ if (!(0, utils_js_1.isValidUrl)(resolved)) {
213
+ throw new errors_js_1.PecValidationError('callbackUrl must be a valid HTTP or HTTPS URL');
214
+ }
215
+ return resolved;
216
+ }
217
+ }
218
+ exports.PecClient = PecClient;
@@ -0,0 +1,13 @@
1
+ export declare const WSDL: {
2
+ readonly SALE: "https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?WSDL";
3
+ readonly CONFIRM: "https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?WSDL";
4
+ readonly REVERSAL: "https://pec.shaparak.ir/NewIPGServices/Reverse/ReversalService.asmx?WSDL";
5
+ readonly MULTIPLEXED_SALE: "https://pec.shaparak.ir/NewIPGServices/MultiplexedSale/OnlineMultiplexedSalePaymentService.asmx?WSDL";
6
+ readonly GOVERNMENT_SALE: "https://pec.shaparak.ir/NewIPGServices/Sale/GovermentIdSaleServiceSW2.asmx?WSDL";
7
+ readonly BILL: "https://pec.shaparak.ir/NewIPGServices/Bill/BillService.asmx?WSDL";
8
+ readonly MOBILE_TOPUP: "https://pec.shaparak.ir/NewIPGServices/SimCharge/TopupChargeService.asmx?WSDL";
9
+ };
10
+ export declare const PAYMENT_PAGE_BASE = "https://pec.shaparak.ir/NewIPG/?Token=";
11
+ export declare const REPORT_API_URL = "https://pgwservices.pec.ir/api/PGWReport/GetSaleReport";
12
+ export declare const PEC_SUCCESS_STATUS = 0;
13
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI;;;;;;;;CAUP,CAAC;AAEX,eAAO,MAAM,iBAAiB,2CAA2C,CAAC;AAE1E,eAAO,MAAM,cAAc,2DAA2D,CAAC;AAEvF,eAAO,MAAM,kBAAkB,IAAI,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PEC_SUCCESS_STATUS = exports.REPORT_API_URL = exports.PAYMENT_PAGE_BASE = exports.WSDL = void 0;
4
+ exports.WSDL = {
5
+ SALE: 'https://pec.shaparak.ir/NewIPGServices/Sale/SaleService.asmx?WSDL',
6
+ CONFIRM: 'https://pec.shaparak.ir/NewIPGServices/Confirm/ConfirmService.asmx?WSDL',
7
+ REVERSAL: 'https://pec.shaparak.ir/NewIPGServices/Reverse/ReversalService.asmx?WSDL',
8
+ MULTIPLEXED_SALE: 'https://pec.shaparak.ir/NewIPGServices/MultiplexedSale/OnlineMultiplexedSalePaymentService.asmx?WSDL',
9
+ GOVERNMENT_SALE: 'https://pec.shaparak.ir/NewIPGServices/Sale/GovermentIdSaleServiceSW2.asmx?WSDL',
10
+ BILL: 'https://pec.shaparak.ir/NewIPGServices/Bill/BillService.asmx?WSDL',
11
+ MOBILE_TOPUP: 'https://pec.shaparak.ir/NewIPGServices/SimCharge/TopupChargeService.asmx?WSDL',
12
+ };
13
+ exports.PAYMENT_PAGE_BASE = 'https://pec.shaparak.ir/NewIPG/?Token=';
14
+ exports.REPORT_API_URL = 'https://pgwservices.pec.ir/api/PGWReport/GetSaleReport';
15
+ exports.PEC_SUCCESS_STATUS = 0;
@@ -0,0 +1,14 @@
1
+ export declare class PecError extends Error {
2
+ readonly status: number;
3
+ readonly pecMessage?: string;
4
+ readonly cause?: unknown;
5
+ constructor(message: string, status: number, pecMessage?: string, cause?: unknown);
6
+ }
7
+ export declare class PecValidationError extends Error {
8
+ constructor(message: string);
9
+ }
10
+ export declare class PecTransportError extends Error {
11
+ readonly cause?: unknown;
12
+ constructor(message: string, cause?: unknown);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAOlF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAK7C"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PecTransportError = exports.PecValidationError = exports.PecError = void 0;
4
+ class PecError extends Error {
5
+ constructor(message, status, pecMessage, cause) {
6
+ super(message);
7
+ this.name = 'PecError';
8
+ this.status = status;
9
+ this.pecMessage = pecMessage;
10
+ this.cause = cause;
11
+ }
12
+ }
13
+ exports.PecError = PecError;
14
+ class PecValidationError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = 'PecValidationError';
18
+ }
19
+ }
20
+ exports.PecValidationError = PecValidationError;
21
+ class PecTransportError extends Error {
22
+ constructor(message, cause) {
23
+ super(message);
24
+ this.name = 'PecTransportError';
25
+ this.cause = cause;
26
+ }
27
+ }
28
+ exports.PecTransportError = PecTransportError;
@@ -0,0 +1,6 @@
1
+ export { PecClient } from './PecClient.js';
2
+ export { PecError, PecTransportError, PecValidationError } from './errors.js';
3
+ export { PAYMENT_PAGE_BASE, PEC_SUCCESS_STATUS, REPORT_API_URL, WSDL } from './constants.js';
4
+ export { generateOrderId, getPaymentPageUrl, isSuccessStatus, isValidHttpsUrl, isValidUrl, mapMultiplexedAccounts, normalizeBillInfoResult, normalizeSoapField, normalizeSoapNumber, parseCallback, shouldConfirmPayment, toRials, validateAmount, validateMultiplexedAccounts, validateSaleReportDateRange, } from './utils.js';
5
+ export type { BillInfoResult, CallbackPayload, ConfirmPaymentInput, ConfirmPaymentResult, Currency, GetBillInfoInput, GetSaleReportInput, GetSaleReportResult, MultiplexedAccount, OrderId, PaymentTokenResult, PecClientOptions, RequestBillPaymentInput, RequestGovernmentMultiplexedPaymentInput, RequestGovernmentPaymentInput, RequestMobileTopupInput, RequestMultiplexedPaymentInput, RequestPaymentInput, ReversePaymentInput, ReversePaymentResult, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,UAAU,EACV,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,2BAA2B,EAC3B,2BAA2B,GAC5B,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,wCAAwC,EACxC,6BAA6B,EAC7B,uBAAuB,EACvB,8BAA8B,EAC9B,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSaleReportDateRange = exports.validateMultiplexedAccounts = exports.validateAmount = exports.toRials = exports.shouldConfirmPayment = exports.parseCallback = exports.normalizeSoapNumber = exports.normalizeSoapField = exports.normalizeBillInfoResult = exports.mapMultiplexedAccounts = exports.isValidUrl = exports.isValidHttpsUrl = exports.isSuccessStatus = exports.getPaymentPageUrl = exports.generateOrderId = exports.WSDL = exports.REPORT_API_URL = exports.PEC_SUCCESS_STATUS = exports.PAYMENT_PAGE_BASE = exports.PecValidationError = exports.PecTransportError = exports.PecError = exports.PecClient = void 0;
4
+ var PecClient_js_1 = require("./PecClient.js");
5
+ Object.defineProperty(exports, "PecClient", { enumerable: true, get: function () { return PecClient_js_1.PecClient; } });
6
+ var errors_js_1 = require("./errors.js");
7
+ Object.defineProperty(exports, "PecError", { enumerable: true, get: function () { return errors_js_1.PecError; } });
8
+ Object.defineProperty(exports, "PecTransportError", { enumerable: true, get: function () { return errors_js_1.PecTransportError; } });
9
+ Object.defineProperty(exports, "PecValidationError", { enumerable: true, get: function () { return errors_js_1.PecValidationError; } });
10
+ var constants_js_1 = require("./constants.js");
11
+ Object.defineProperty(exports, "PAYMENT_PAGE_BASE", { enumerable: true, get: function () { return constants_js_1.PAYMENT_PAGE_BASE; } });
12
+ Object.defineProperty(exports, "PEC_SUCCESS_STATUS", { enumerable: true, get: function () { return constants_js_1.PEC_SUCCESS_STATUS; } });
13
+ Object.defineProperty(exports, "REPORT_API_URL", { enumerable: true, get: function () { return constants_js_1.REPORT_API_URL; } });
14
+ Object.defineProperty(exports, "WSDL", { enumerable: true, get: function () { return constants_js_1.WSDL; } });
15
+ var utils_js_1 = require("./utils.js");
16
+ Object.defineProperty(exports, "generateOrderId", { enumerable: true, get: function () { return utils_js_1.generateOrderId; } });
17
+ Object.defineProperty(exports, "getPaymentPageUrl", { enumerable: true, get: function () { return utils_js_1.getPaymentPageUrl; } });
18
+ Object.defineProperty(exports, "isSuccessStatus", { enumerable: true, get: function () { return utils_js_1.isSuccessStatus; } });
19
+ Object.defineProperty(exports, "isValidHttpsUrl", { enumerable: true, get: function () { return utils_js_1.isValidHttpsUrl; } });
20
+ Object.defineProperty(exports, "isValidUrl", { enumerable: true, get: function () { return utils_js_1.isValidUrl; } });
21
+ Object.defineProperty(exports, "mapMultiplexedAccounts", { enumerable: true, get: function () { return utils_js_1.mapMultiplexedAccounts; } });
22
+ Object.defineProperty(exports, "normalizeBillInfoResult", { enumerable: true, get: function () { return utils_js_1.normalizeBillInfoResult; } });
23
+ Object.defineProperty(exports, "normalizeSoapField", { enumerable: true, get: function () { return utils_js_1.normalizeSoapField; } });
24
+ Object.defineProperty(exports, "normalizeSoapNumber", { enumerable: true, get: function () { return utils_js_1.normalizeSoapNumber; } });
25
+ Object.defineProperty(exports, "parseCallback", { enumerable: true, get: function () { return utils_js_1.parseCallback; } });
26
+ Object.defineProperty(exports, "shouldConfirmPayment", { enumerable: true, get: function () { return utils_js_1.shouldConfirmPayment; } });
27
+ Object.defineProperty(exports, "toRials", { enumerable: true, get: function () { return utils_js_1.toRials; } });
28
+ Object.defineProperty(exports, "validateAmount", { enumerable: true, get: function () { return utils_js_1.validateAmount; } });
29
+ Object.defineProperty(exports, "validateMultiplexedAccounts", { enumerable: true, get: function () { return utils_js_1.validateMultiplexedAccounts; } });
30
+ Object.defineProperty(exports, "validateSaleReportDateRange", { enumerable: true, get: function () { return utils_js_1.validateSaleReportDateRange; } });
@@ -0,0 +1,6 @@
1
+ import soap from 'soap';
2
+ export declare function getSoapClient(wsdlUrl: string): Promise<soap.Client>;
3
+ export declare function callSoapMethod<T>(wsdlUrl: string, methodName: string, args: Record<string, unknown>): Promise<T>;
4
+ /** Clears cached SOAP clients (useful in tests). */
5
+ export declare function clearSoapClientCache(): void;
6
+ //# sourceMappingURL=soapClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"soapClient.d.ts","sourceRoot":"","sources":["../../src/soapClient.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAWzE;AAED,wBAAsB,cAAc,CAAC,CAAC,EACpC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAqBZ;AAED,oDAAoD;AACpD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSoapClient = getSoapClient;
7
+ exports.callSoapMethod = callSoapMethod;
8
+ exports.clearSoapClientCache = clearSoapClientCache;
9
+ const soap_1 = __importDefault(require("soap"));
10
+ const errors_js_1 = require("./errors.js");
11
+ const clientCache = new Map();
12
+ async function getSoapClient(wsdlUrl) {
13
+ let cached = clientCache.get(wsdlUrl);
14
+ if (!cached) {
15
+ cached = soap_1.default.createClientAsync(wsdlUrl).catch((error) => {
16
+ clientCache.delete(wsdlUrl);
17
+ throw new errors_js_1.PecTransportError(`Failed to create SOAP client for ${wsdlUrl}`, error);
18
+ });
19
+ clientCache.set(wsdlUrl, cached);
20
+ }
21
+ return cached;
22
+ }
23
+ async function callSoapMethod(wsdlUrl, methodName, args) {
24
+ try {
25
+ const client = await getSoapClient(wsdlUrl);
26
+ const method = client[methodName];
27
+ if (typeof method !== 'function') {
28
+ throw new errors_js_1.PecTransportError(`SOAP method "${methodName}" was not found in ${wsdlUrl}`);
29
+ }
30
+ const asyncMethod = method;
31
+ const [result] = await asyncMethod.call(client, args);
32
+ return result;
33
+ }
34
+ catch (error) {
35
+ if (error instanceof errors_js_1.PecTransportError) {
36
+ throw error;
37
+ }
38
+ throw new errors_js_1.PecTransportError(`SOAP call "${methodName}" failed`, error);
39
+ }
40
+ }
41
+ /** Clears cached SOAP clients (useful in tests). */
42
+ function clearSoapClientCache() {
43
+ clientCache.clear();
44
+ }
@@ -0,0 +1,122 @@
1
+ export type Currency = 'rial' | 'toman';
2
+ export type OrderId = string | number;
3
+ export interface PecClientOptions {
4
+ /** Merchant terminal PIN (`LoginAccount` in PEC SOAP requests). */
5
+ loginAccount: string;
6
+ /** Default callback URL when not provided per request. */
7
+ callbackUrl?: string;
8
+ }
9
+ export interface RequestPaymentInput {
10
+ /** Amount in the unit specified by `currency`. Converted to Rials before sending to PEC. */
11
+ amount: number;
12
+ orderId: OrderId;
13
+ currency?: Currency;
14
+ callbackUrl?: string;
15
+ additionalData?: string;
16
+ originator?: string;
17
+ }
18
+ export interface PaymentTokenResult {
19
+ status: number;
20
+ message: string;
21
+ token: string;
22
+ paymentUrl?: string;
23
+ }
24
+ export interface ConfirmPaymentInput {
25
+ token: string | number;
26
+ }
27
+ export interface ConfirmPaymentResult {
28
+ status: number;
29
+ token: string;
30
+ cardNumberMasked: string;
31
+ rrn: string;
32
+ }
33
+ export interface ReversePaymentInput {
34
+ token: string | number;
35
+ }
36
+ export interface ReversePaymentResult {
37
+ status: number;
38
+ message: string;
39
+ token: string;
40
+ }
41
+ export interface MultiplexedAccount {
42
+ amount: number;
43
+ iban: string;
44
+ payId: string;
45
+ }
46
+ export interface RequestMultiplexedPaymentInput {
47
+ amount: number;
48
+ orderId: OrderId;
49
+ accounts: MultiplexedAccount[];
50
+ currency?: Currency;
51
+ callbackUrl?: string;
52
+ originator?: string;
53
+ }
54
+ export interface RequestGovernmentPaymentInput {
55
+ amount: number;
56
+ orderId: OrderId;
57
+ govId: string;
58
+ currency?: Currency;
59
+ callbackUrl?: string;
60
+ originator?: string;
61
+ }
62
+ export interface RequestGovernmentMultiplexedPaymentInput {
63
+ amount: number;
64
+ orderId: OrderId;
65
+ govId: string;
66
+ accounts: MultiplexedAccount[];
67
+ currency?: Currency;
68
+ callbackUrl?: string;
69
+ originator?: string;
70
+ }
71
+ export interface RequestBillPaymentInput {
72
+ orderId: OrderId;
73
+ billId: string;
74
+ payId: string;
75
+ callbackUrl?: string;
76
+ additionalData?: string;
77
+ originator?: string;
78
+ }
79
+ export interface GetBillInfoInput {
80
+ billId: string;
81
+ payId: string;
82
+ }
83
+ export interface BillInfoResult {
84
+ status: number;
85
+ message: string;
86
+ amount: string;
87
+ billId: string;
88
+ payId: string;
89
+ }
90
+ export interface RequestMobileTopupInput {
91
+ orderId: OrderId;
92
+ chargeMobileNumber: string;
93
+ requesterMobileNumber: string;
94
+ topupType: string | number;
95
+ amount: number;
96
+ currency?: Currency;
97
+ callbackUrl?: string;
98
+ additionalData?: string;
99
+ originator?: string;
100
+ }
101
+ export interface GetSaleReportInput {
102
+ username: string;
103
+ password: string;
104
+ fromDate: string;
105
+ toDate: string;
106
+ rrn?: string;
107
+ orderId?: OrderId;
108
+ token?: string | number;
109
+ }
110
+ export interface GetSaleReportResult {
111
+ [key: string]: unknown;
112
+ }
113
+ /** Fields POSTed by PEC to the merchant callback URL after payment. */
114
+ export interface CallbackPayload {
115
+ token: string;
116
+ status: number;
117
+ orderId: string;
118
+ terminalNo: string;
119
+ amount: string;
120
+ rrn: string;
121
+ }
122
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,43 @@
1
+ import type { CallbackPayload, Currency, MultiplexedAccount } from './types.js';
2
+ /** Converts an amount to Rials for PEC API requests. */
3
+ export declare function toRials(amount: number, currency?: Currency): number;
4
+ /** Ensures amount is a positive finite number. */
5
+ export declare function validateAmount(amount: number): void;
6
+ export declare function getPaymentPageUrl(token: string | number): string;
7
+ export declare function isSuccessStatus(status: number | string): boolean;
8
+ /** Returns true when the bank callback indicates a successful payment worth confirming. */
9
+ export declare function shouldConfirmPayment(callback: CallbackPayload): boolean;
10
+ export declare function generateOrderId(): string;
11
+ /** Validates callback URLs (HTTP for local dev, HTTPS for production). */
12
+ export declare function isValidUrl(url: string): boolean;
13
+ /** @deprecated Use {@link isValidUrl} instead. */
14
+ export declare function isValidHttpsUrl(url: string): boolean;
15
+ /**
16
+ * Parses the bank callback payload (PEC POSTs to your callback URL).
17
+ * Pass `req.body` for POST callbacks; merge `req.query` if your route uses GET.
18
+ */
19
+ export declare function parseCallback(body: Record<string, unknown>): CallbackPayload;
20
+ export declare function normalizeSoapField(value: unknown): string;
21
+ export declare function normalizeSoapNumber(value: unknown): number;
22
+ export declare function buildPaymentTokenResult(status: unknown, token: unknown, message: unknown): {
23
+ status: number;
24
+ token: string;
25
+ message: string;
26
+ paymentUrl?: string;
27
+ };
28
+ export declare function mapMultiplexedAccounts(accounts: MultiplexedAccount[], currency?: Currency): Array<{
29
+ Amount: number;
30
+ IBAN: string;
31
+ PayId: string;
32
+ }>;
33
+ export declare function validateMultiplexedAccounts(accounts: MultiplexedAccount[]): void;
34
+ /** Validates sale report date range (max 30 days, end after start). */
35
+ export declare function validateSaleReportDateRange(fromDate: string, toDate: string): void;
36
+ export declare function normalizeBillInfoResult(payload: Record<string, unknown>): {
37
+ status: number;
38
+ message: string;
39
+ amount: string;
40
+ billId: string;
41
+ payId: string;
42
+ };
43
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAMhF,wDAAwD;AACxD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAkB,GAAG,MAAM,CAG5E;AAED,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAEhE;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAEvE;AAED,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU/C;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAoBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAS5E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE1D;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACf;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAgBzE;AAED,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,QAAQ,GAAE,QAAkB,GAC3B,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAQxD;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAchF;AAED,uEAAuE;AACvE,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAelF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAQA"}