@obhco/pay 0.0.0-stage → 0.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/README.md +203 -2
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/gateways/digipay.d.ts +36 -0
- package/dist/gateways/digipay.d.ts.map +1 -0
- package/dist/gateways/digipay.js +489 -0
- package/dist/gateways/digipay.js.map +1 -0
- package/dist/gateways/index.d.ts +5 -0
- package/dist/gateways/index.d.ts.map +1 -0
- package/dist/gateways/index.js +5 -0
- package/dist/gateways/index.js.map +1 -0
- package/dist/gateways/mellat-constants.d.ts +3 -0
- package/dist/gateways/mellat-constants.d.ts.map +1 -0
- package/dist/gateways/mellat-constants.js +3 -0
- package/dist/gateways/mellat-constants.js.map +1 -0
- package/dist/gateways/mellat.d.ts +30 -0
- package/dist/gateways/mellat.d.ts.map +1 -0
- package/dist/gateways/mellat.js +397 -0
- package/dist/gateways/mellat.js.map +1 -0
- package/dist/gateways/sadad.d.ts +43 -0
- package/dist/gateways/sadad.d.ts.map +1 -0
- package/dist/gateways/sadad.js +541 -0
- package/dist/gateways/sadad.js.map +1 -0
- package/dist/gateways/zarinpal.d.ts +21 -0
- package/dist/gateways/zarinpal.d.ts.map +1 -0
- package/dist/gateways/zarinpal.js +312 -0
- package/dist/gateways/zarinpal.js.map +1 -0
- package/dist/http.d.ts +31 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +101 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/pay.d.ts +114 -0
- package/dist/pay.d.ts.map +1 -0
- package/dist/pay.js +427 -0
- package/dist/pay.js.map +1 -0
- package/dist/report.d.ts +71 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +106 -0
- package/dist/report.js.map +1 -0
- package/dist/store.d.ts +420 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +68 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/package.json +34 -4
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { PaymentProviderError, } from "../types.js";
|
|
3
|
+
export const DIGIPAY_PROVIDER_CODE = "digipay";
|
|
4
|
+
export const DIGIPAY_PROVIDER_NAME = "Digipay (Installments / BNPL)";
|
|
5
|
+
const DEFAULT_DIGIPAY_BASE_URL = "https://api.mydigipay.com/digipay/api";
|
|
6
|
+
const DIGIPAY_TIMEOUT_MS = 15_000;
|
|
7
|
+
const DIGIPAY_VERSION_HEADER = "2022-02-02";
|
|
8
|
+
/** `type=11` covers every payment tool on the Unified Payment Gateway (UPG). */
|
|
9
|
+
const DIGIPAY_UPG_TICKET_TYPE = 11;
|
|
10
|
+
/**
|
|
11
|
+
* Purchase `type` values Digipay posts back in the payment result and expects
|
|
12
|
+
* again on `purchases/verify?type=`.
|
|
13
|
+
*/
|
|
14
|
+
export const DIGIPAY_PURCHASE_TYPES = {
|
|
15
|
+
0: "IPG",
|
|
16
|
+
5: "CREDIT",
|
|
17
|
+
11: "WALLET",
|
|
18
|
+
13: "BNPL",
|
|
19
|
+
24: "CREDIT-CARD",
|
|
20
|
+
};
|
|
21
|
+
/** Business error codes from the Digipay UPG guide (HTTP 422 bodies). */
|
|
22
|
+
export const DIGIPAY_RESULT_CODES = {
|
|
23
|
+
0: { message: "Operation succeeded.", retryable: false },
|
|
24
|
+
1054: { message: "Input data is incorrect.", retryable: false },
|
|
25
|
+
9000: { message: "Purchase was not found.", retryable: false },
|
|
26
|
+
9001: { message: "Payment token is invalid.", retryable: false },
|
|
27
|
+
9003: { message: "Purchase has expired.", retryable: false },
|
|
28
|
+
9004: { message: "Purchase is still in progress.", retryable: true },
|
|
29
|
+
9005: { message: "Purchase cannot be paid.", retryable: false },
|
|
30
|
+
9006: {
|
|
31
|
+
message: "Could not communicate with the payment gateway.",
|
|
32
|
+
retryable: true,
|
|
33
|
+
},
|
|
34
|
+
9007: { message: "Purchase was not completed.", retryable: false },
|
|
35
|
+
9008: {
|
|
36
|
+
message: "This purchase was already registered with different data.",
|
|
37
|
+
retryable: false,
|
|
38
|
+
},
|
|
39
|
+
9009: {
|
|
40
|
+
message: "The purchase verification window has passed.",
|
|
41
|
+
retryable: false,
|
|
42
|
+
},
|
|
43
|
+
9010: { message: "Purchase verification failed.", retryable: false },
|
|
44
|
+
9011: {
|
|
45
|
+
message: "Purchase verification result is unknown.",
|
|
46
|
+
retryable: true,
|
|
47
|
+
},
|
|
48
|
+
9012: {
|
|
49
|
+
message: "Purchase state is not valid for this request.",
|
|
50
|
+
retryable: false,
|
|
51
|
+
},
|
|
52
|
+
9030: {
|
|
53
|
+
message: "A mobile number is required for registered users.",
|
|
54
|
+
retryable: false,
|
|
55
|
+
},
|
|
56
|
+
9031: {
|
|
57
|
+
message: "A ticket cannot be issued for this user.",
|
|
58
|
+
retryable: false,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export function describeDigipayCode(code, fallback) {
|
|
62
|
+
if (fallback && fallback.trim()) {
|
|
63
|
+
return fallback.trim();
|
|
64
|
+
}
|
|
65
|
+
if (code !== null && code !== undefined && DIGIPAY_RESULT_CODES[code]) {
|
|
66
|
+
return DIGIPAY_RESULT_CODES[code].message;
|
|
67
|
+
}
|
|
68
|
+
return code !== null && code !== undefined
|
|
69
|
+
? `Digipay result code ${code}`
|
|
70
|
+
: "Unspecified gateway response";
|
|
71
|
+
}
|
|
72
|
+
function maskIdentifier(value) {
|
|
73
|
+
const trimmed = value?.trim();
|
|
74
|
+
if (!trimmed) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
if (trimmed.length <= 4) {
|
|
78
|
+
return "****";
|
|
79
|
+
}
|
|
80
|
+
return `${trimmed.slice(0, 2)}${"*".repeat(Math.min(6, trimmed.length - 4))}${trimmed.slice(-2)}`;
|
|
81
|
+
}
|
|
82
|
+
function readBaseUrl() {
|
|
83
|
+
return (process.env.DIGIPAY_BASE_URL?.trim() || DEFAULT_DIGIPAY_BASE_URL).replace(/\/+$/, "");
|
|
84
|
+
}
|
|
85
|
+
export function getDigipayConfigStatus() {
|
|
86
|
+
const username = process.env.DIGIPAY_USERNAME?.trim();
|
|
87
|
+
const password = process.env.DIGIPAY_PASSWORD?.trim();
|
|
88
|
+
const clientId = process.env.DIGIPAY_CLIENT_ID?.trim();
|
|
89
|
+
return {
|
|
90
|
+
providerCode: DIGIPAY_PROVIDER_CODE,
|
|
91
|
+
providerName: DIGIPAY_PROVIDER_NAME,
|
|
92
|
+
baseUrl: readBaseUrl(),
|
|
93
|
+
liveConfigured: Boolean(username && password && readBasicAuthorization()),
|
|
94
|
+
usernameMasked: maskIdentifier(username),
|
|
95
|
+
clientIdMasked: maskIdentifier(clientId),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* The OAuth client's Basic authorization header. Digipay issues it ready-made
|
|
100
|
+
* (DIGIPAY_AUTHORIZATION, used as is); otherwise it is built from
|
|
101
|
+
* DIGIPAY_CLIENT_ID and DIGIPAY_CLIENT_SECRET.
|
|
102
|
+
*/
|
|
103
|
+
function readBasicAuthorization() {
|
|
104
|
+
const authorization = process.env.DIGIPAY_AUTHORIZATION?.trim();
|
|
105
|
+
if (authorization) {
|
|
106
|
+
return /^basic\s/i.test(authorization)
|
|
107
|
+
? authorization
|
|
108
|
+
: `Basic ${authorization}`;
|
|
109
|
+
}
|
|
110
|
+
const clientId = process.env.DIGIPAY_CLIENT_ID?.trim();
|
|
111
|
+
const clientSecret = process.env.DIGIPAY_CLIENT_SECRET?.trim();
|
|
112
|
+
return clientId && clientSecret
|
|
113
|
+
? `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`
|
|
114
|
+
: null;
|
|
115
|
+
}
|
|
116
|
+
function getLiveCredentials() {
|
|
117
|
+
const username = process.env.DIGIPAY_USERNAME?.trim();
|
|
118
|
+
const password = process.env.DIGIPAY_PASSWORD?.trim();
|
|
119
|
+
const authorization = readBasicAuthorization();
|
|
120
|
+
if (!username || !password || !authorization) {
|
|
121
|
+
throw new PaymentProviderError("DIGIPAY_CREDENTIALS_MISSING", "Digipay credentials (DIGIPAY_USERNAME, DIGIPAY_PASSWORD, and DIGIPAY_AUTHORIZATION or DIGIPAY_CLIENT_ID + DIGIPAY_CLIENT_SECRET) are not configured in server environment variables.");
|
|
122
|
+
}
|
|
123
|
+
return { username, password, authorization, baseUrl: readBaseUrl() };
|
|
124
|
+
}
|
|
125
|
+
async function digipayFetch(url, init) {
|
|
126
|
+
const controller = new AbortController();
|
|
127
|
+
const timeout = setTimeout(() => controller.abort(), DIGIPAY_TIMEOUT_MS);
|
|
128
|
+
try {
|
|
129
|
+
return await fetch(url, { ...init, signal: controller.signal });
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
clearTimeout(timeout);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
let cachedAccessToken = null;
|
|
136
|
+
/** Test hook: forget the cached OAuth access token. */
|
|
137
|
+
export function resetDigipayTokenCache() {
|
|
138
|
+
cachedAccessToken = null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Logs in with the merchant's username/password (`grant_type=password`) and
|
|
142
|
+
* caches the bearer token until shortly before `expires_in` elapses.
|
|
143
|
+
*/
|
|
144
|
+
async function getAccessToken(forceRefresh = false) {
|
|
145
|
+
if (!forceRefresh &&
|
|
146
|
+
cachedAccessToken &&
|
|
147
|
+
cachedAccessToken.expiresAt > Date.now()) {
|
|
148
|
+
return cachedAccessToken.value;
|
|
149
|
+
}
|
|
150
|
+
const { username, password, authorization, baseUrl } = getLiveCredentials();
|
|
151
|
+
// The token endpoint is a standard OAuth password grant: URL-encoded form.
|
|
152
|
+
const form = new URLSearchParams();
|
|
153
|
+
form.set("username", username);
|
|
154
|
+
form.set("password", password);
|
|
155
|
+
form.set("grant_type", "password");
|
|
156
|
+
let response;
|
|
157
|
+
try {
|
|
158
|
+
response = await digipayFetch(`${baseUrl}/oauth/token`, {
|
|
159
|
+
method: "POST",
|
|
160
|
+
headers: {
|
|
161
|
+
Accept: "application/json",
|
|
162
|
+
Authorization: authorization,
|
|
163
|
+
},
|
|
164
|
+
body: form,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
throw new PaymentProviderError("DIGIPAY_NETWORK_ERROR", "Could not reach the Digipay login endpoint.");
|
|
169
|
+
}
|
|
170
|
+
if (!response.ok) {
|
|
171
|
+
throw new PaymentProviderError("DIGIPAY_AUTH_FAILED", `Digipay login failed with HTTP ${response.status}.`);
|
|
172
|
+
}
|
|
173
|
+
const data = (await response.json().catch(() => null));
|
|
174
|
+
if (!data?.access_token) {
|
|
175
|
+
throw new PaymentProviderError("DIGIPAY_INVALID_RESPONSE", "Digipay login did not return an access token.");
|
|
176
|
+
}
|
|
177
|
+
const lifetimeSeconds = Math.max(30, Number(data.expires_in ?? 300));
|
|
178
|
+
cachedAccessToken = {
|
|
179
|
+
value: data.access_token,
|
|
180
|
+
expiresAt: Date.now() + (lifetimeSeconds - 30) * 1000,
|
|
181
|
+
};
|
|
182
|
+
return data.access_token;
|
|
183
|
+
}
|
|
184
|
+
async function authorizedPost(path, body) {
|
|
185
|
+
const { baseUrl } = getLiveCredentials();
|
|
186
|
+
const send = async (token) => digipayFetch(`${baseUrl}${path}`, {
|
|
187
|
+
method: "POST",
|
|
188
|
+
headers: {
|
|
189
|
+
Accept: "application/json",
|
|
190
|
+
"Content-Type": "application/json; charset=UTF-8",
|
|
191
|
+
Agent: "WEB",
|
|
192
|
+
"Digipay-Version": DIGIPAY_VERSION_HEADER,
|
|
193
|
+
Authorization: `Bearer ${token}`,
|
|
194
|
+
},
|
|
195
|
+
body: JSON.stringify(body),
|
|
196
|
+
});
|
|
197
|
+
let response = await send(await getAccessToken());
|
|
198
|
+
// An expired or revoked token returns 401; log in again once.
|
|
199
|
+
if (response.status === 401) {
|
|
200
|
+
response = await send(await getAccessToken(true));
|
|
201
|
+
}
|
|
202
|
+
return response;
|
|
203
|
+
}
|
|
204
|
+
export function normalizeIranianMobile(value) {
|
|
205
|
+
const digits = value
|
|
206
|
+
?.trim()
|
|
207
|
+
.replace(/[۰-۹]/g, (d) => String("۰۱۲۳۴۵۶۷۸۹".indexOf(d)))
|
|
208
|
+
.replace(/[\s-]/g, "");
|
|
209
|
+
if (!digits) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
const local = digits.startsWith("+98")
|
|
213
|
+
? `0${digits.slice(3)}`
|
|
214
|
+
: digits.startsWith("0098")
|
|
215
|
+
? `0${digits.slice(4)}`
|
|
216
|
+
: digits.startsWith("98") && digits.length === 12
|
|
217
|
+
? `0${digits.slice(2)}`
|
|
218
|
+
: digits;
|
|
219
|
+
return /^09\d{9}$/.test(local) ? local : null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Digipay keys tickets by `providerId` across the whole merchant account,
|
|
223
|
+
* which other services share, so OBH's order number alone can clash with an
|
|
224
|
+
* existing ticket. OBH sends it with an `obh-` prefix and accepts both forms
|
|
225
|
+
* back.
|
|
226
|
+
*/
|
|
227
|
+
export function toDigipayProviderId(gatewayOrderId) {
|
|
228
|
+
return `obh-${gatewayOrderId}`;
|
|
229
|
+
}
|
|
230
|
+
export function fromDigipayProviderId(value) {
|
|
231
|
+
return value?.replace(/^obh-/i, "") ?? null;
|
|
232
|
+
}
|
|
233
|
+
function readString(value) {
|
|
234
|
+
return value === undefined || value === null || value === ""
|
|
235
|
+
? null
|
|
236
|
+
: String(value);
|
|
237
|
+
}
|
|
238
|
+
export const digipayPaymentAdapter = {
|
|
239
|
+
code: DIGIPAY_PROVIDER_CODE,
|
|
240
|
+
descriptor: {
|
|
241
|
+
code: DIGIPAY_PROVIDER_CODE,
|
|
242
|
+
name: DIGIPAY_PROVIDER_NAME,
|
|
243
|
+
displayName: "خرید اقساطی با دیجیپی",
|
|
244
|
+
description: "Buy now and pay later in installments with Digipay credit, or pay with a Digipay wallet or bank card.",
|
|
245
|
+
kind: "installment",
|
|
246
|
+
requiresCustomerMobile: true,
|
|
247
|
+
minAmount: null,
|
|
248
|
+
},
|
|
249
|
+
isConfigured() {
|
|
250
|
+
return getDigipayConfigStatus().liveConfigured;
|
|
251
|
+
},
|
|
252
|
+
async createCheckoutSession(input) {
|
|
253
|
+
if (input.currency !== "IRR") {
|
|
254
|
+
throw new PaymentProviderError("CURRENCY_NOT_SUPPORTED", "Digipay only supports IRR.");
|
|
255
|
+
}
|
|
256
|
+
if (!/^[1-9]\d{0,17}$/.test(input.amount)) {
|
|
257
|
+
throw new PaymentProviderError("INVALID_AMOUNT", "Digipay requires a positive whole Rial integer amount.");
|
|
258
|
+
}
|
|
259
|
+
const cellNumber = normalizeIranianMobile(input.customerMobile);
|
|
260
|
+
if (!cellNumber) {
|
|
261
|
+
throw new PaymentProviderError("CUSTOMER_MOBILE_REQUIRED", "Digipay requires the customer's mobile number (09xxxxxxxxx).");
|
|
262
|
+
}
|
|
263
|
+
// A basket is mandatory for credit and BNPL purchases. OBH services sell
|
|
264
|
+
// services, so each purchase is described as a single service item.
|
|
265
|
+
// Digipay expects the merchant's own username as seller and supplier.
|
|
266
|
+
const merchantUsername = getLiveCredentials().username;
|
|
267
|
+
const requestBody = {
|
|
268
|
+
amount: Number(input.amount),
|
|
269
|
+
cellNumber,
|
|
270
|
+
providerId: toDigipayProviderId(input.gatewayOrderId),
|
|
271
|
+
callbackUrl: input.callbackUrl,
|
|
272
|
+
basketDetailsDto: {
|
|
273
|
+
basketId: input.paymentReference,
|
|
274
|
+
items: [
|
|
275
|
+
{
|
|
276
|
+
sellerId: merchantUsername,
|
|
277
|
+
supplierId: merchantUsername,
|
|
278
|
+
productCode: input.serviceSlug,
|
|
279
|
+
brand: input.serviceSlug,
|
|
280
|
+
productType: 3,
|
|
281
|
+
count: 1,
|
|
282
|
+
categoryId: input.serviceSlug,
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
let response;
|
|
288
|
+
try {
|
|
289
|
+
response = await authorizedPost(`/tickets/business?type=${DIGIPAY_UPG_TICKET_TYPE}`, requestBody);
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (error instanceof PaymentProviderError) {
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
throw new PaymentProviderError("DIGIPAY_NETWORK_ERROR", "Could not reach the Digipay ticket endpoint.");
|
|
296
|
+
}
|
|
297
|
+
const data = (await response
|
|
298
|
+
.json()
|
|
299
|
+
.catch(() => null));
|
|
300
|
+
if (!data) {
|
|
301
|
+
throw new PaymentProviderError("DIGIPAY_INVALID_RESPONSE", `Digipay ticket request returned non-JSON status ${response.status}.`);
|
|
302
|
+
}
|
|
303
|
+
const resultCode = Number(data.result?.status ?? -1);
|
|
304
|
+
const description = describeDigipayCode(resultCode, data.result?.message);
|
|
305
|
+
if (!response.ok || resultCode !== 0 || !data.ticket || !data.redirectUrl) {
|
|
306
|
+
throw new PaymentProviderError(`DIGIPAY_RES_${resultCode}`, description, resultCode);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
providerSessionId: data.ticket,
|
|
310
|
+
providerReference: null,
|
|
311
|
+
checkoutUrl: data.redirectUrl,
|
|
312
|
+
expiresAt: new Date(Date.now() + 15 * 60 * 1000),
|
|
313
|
+
resultCode: 0,
|
|
314
|
+
resultMessage: description,
|
|
315
|
+
};
|
|
316
|
+
},
|
|
317
|
+
/**
|
|
318
|
+
* `payload` is the POST body Digipay sent to the callback URL: `result`,
|
|
319
|
+
* `trackingCode`, `providerId`, `amount`, `type`, and optional `rrn`.
|
|
320
|
+
*/
|
|
321
|
+
async verifyPayment(input) {
|
|
322
|
+
const payload = input.payload ?? {};
|
|
323
|
+
const ticket = input.providerSessionId;
|
|
324
|
+
const trackingCode = readString(payload.trackingCode) ?? input.providerReference;
|
|
325
|
+
const callbackResult = readString(payload.result)?.toUpperCase() ?? null;
|
|
326
|
+
const purchaseType = payload.type !== undefined && payload.type !== null
|
|
327
|
+
? Number(payload.type)
|
|
328
|
+
: null;
|
|
329
|
+
const callbackProviderId = fromDigipayProviderId(readString(payload.providerId));
|
|
330
|
+
const callbackAmount = readString(payload.amount);
|
|
331
|
+
const pending = (resultCode, resultMessage) => ({
|
|
332
|
+
status: "PENDING",
|
|
333
|
+
providerReference: trackingCode ?? ticket ?? "",
|
|
334
|
+
traceNumber: null,
|
|
335
|
+
maskedCardNumber: null,
|
|
336
|
+
resultCode,
|
|
337
|
+
resultMessage,
|
|
338
|
+
verifiedAmount: null,
|
|
339
|
+
verifiedOrderId: null,
|
|
340
|
+
verifiedAt: null,
|
|
341
|
+
failureReason: null,
|
|
342
|
+
metadata: {
|
|
343
|
+
adapter: DIGIPAY_PROVIDER_CODE,
|
|
344
|
+
trackingCode,
|
|
345
|
+
type: purchaseType,
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
const failed = (resultCode, reason, extra = {}) => ({
|
|
349
|
+
status: "FAILED",
|
|
350
|
+
providerReference: trackingCode ??
|
|
351
|
+
`fail_${randomUUID().replaceAll("-", "").slice(0, 12)}`,
|
|
352
|
+
traceNumber: null,
|
|
353
|
+
maskedCardNumber: null,
|
|
354
|
+
resultCode,
|
|
355
|
+
resultMessage: reason,
|
|
356
|
+
verifiedAmount: callbackAmount,
|
|
357
|
+
verifiedOrderId: callbackProviderId,
|
|
358
|
+
verifiedAt: new Date(),
|
|
359
|
+
failureReason: reason,
|
|
360
|
+
metadata: {
|
|
361
|
+
adapter: DIGIPAY_PROVIDER_CODE,
|
|
362
|
+
trackingCode,
|
|
363
|
+
type: purchaseType,
|
|
364
|
+
...extra,
|
|
365
|
+
},
|
|
366
|
+
});
|
|
367
|
+
if (!callbackResult) {
|
|
368
|
+
return pending(-1, "Awaiting Digipay payment result.");
|
|
369
|
+
}
|
|
370
|
+
if (callbackResult !== "SUCCESS") {
|
|
371
|
+
return failed(9007, "پرداخت دیجیپی ناموفق بود یا توسط کاربر لغو شد.");
|
|
372
|
+
}
|
|
373
|
+
if (!trackingCode || purchaseType === null || Number.isNaN(purchaseType)) {
|
|
374
|
+
return failed(1054, "Digipay callback is missing trackingCode or purchase type.");
|
|
375
|
+
}
|
|
376
|
+
// Per the UPG guide, check amount and providerId from the callback
|
|
377
|
+
// against our own record before calling Verify.
|
|
378
|
+
if (input.gatewayOrderId &&
|
|
379
|
+
callbackProviderId &&
|
|
380
|
+
callbackProviderId !== input.gatewayOrderId) {
|
|
381
|
+
return failed(1054, "Digipay callback providerId did not match.", {
|
|
382
|
+
expectedOrderId: input.gatewayOrderId,
|
|
383
|
+
callbackProviderId,
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
if (input.expectedAmount &&
|
|
387
|
+
callbackAmount &&
|
|
388
|
+
callbackAmount !== input.expectedAmount) {
|
|
389
|
+
return failed(1054, "Digipay callback amount did not match.", {
|
|
390
|
+
expectedAmount: input.expectedAmount,
|
|
391
|
+
callbackAmount,
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
let response;
|
|
395
|
+
try {
|
|
396
|
+
response = await authorizedPost(`/purchases/verify?type=${purchaseType}`, {
|
|
397
|
+
trackingCode,
|
|
398
|
+
providerId: toDigipayProviderId(input.gatewayOrderId ?? callbackProviderId ?? ""),
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
// A network failure is not proof of failure; keep PENDING and retry.
|
|
403
|
+
return pending(9011, "Temporary communication failure during Digipay verify; retry pending.");
|
|
404
|
+
}
|
|
405
|
+
const data = (await response
|
|
406
|
+
.json()
|
|
407
|
+
.catch(() => null));
|
|
408
|
+
if (!data) {
|
|
409
|
+
return pending(9011, `Digipay verify returned non-JSON status ${response.status}.`);
|
|
410
|
+
}
|
|
411
|
+
const resultCode = Number(data.result?.status ?? -1);
|
|
412
|
+
const description = describeDigipayCode(resultCode, data.result?.message);
|
|
413
|
+
if (response.status >= 500 || DIGIPAY_RESULT_CODES[resultCode]?.retryable) {
|
|
414
|
+
return pending(resultCode, description);
|
|
415
|
+
}
|
|
416
|
+
if (!response.ok || resultCode !== 0) {
|
|
417
|
+
return failed(resultCode, description);
|
|
418
|
+
}
|
|
419
|
+
const verifiedAmount = readString(data.amount);
|
|
420
|
+
const verifiedOrderId = fromDigipayProviderId(readString(data.providerId));
|
|
421
|
+
if (input.gatewayOrderId &&
|
|
422
|
+
verifiedOrderId &&
|
|
423
|
+
verifiedOrderId !== input.gatewayOrderId) {
|
|
424
|
+
return failed(resultCode, "Verified providerId did not match.", {
|
|
425
|
+
expectedOrderId: input.gatewayOrderId,
|
|
426
|
+
verifiedOrderId,
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
if (input.expectedAmount &&
|
|
430
|
+
verifiedAmount &&
|
|
431
|
+
verifiedAmount !== input.expectedAmount) {
|
|
432
|
+
return failed(resultCode, "Verified amount did not match.", {
|
|
433
|
+
expectedAmount: input.expectedAmount,
|
|
434
|
+
verifiedAmount,
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
status: "COMPLETED",
|
|
439
|
+
providerReference: readString(data.trackingCode) ?? trackingCode,
|
|
440
|
+
traceNumber: readString(data.rrn),
|
|
441
|
+
maskedCardNumber: readString(data.maskedPan),
|
|
442
|
+
resultCode,
|
|
443
|
+
resultMessage: description,
|
|
444
|
+
verifiedAmount,
|
|
445
|
+
verifiedOrderId,
|
|
446
|
+
verifiedAt: new Date(),
|
|
447
|
+
failureReason: null,
|
|
448
|
+
metadata: {
|
|
449
|
+
adapter: DIGIPAY_PROVIDER_CODE,
|
|
450
|
+
trackingCode,
|
|
451
|
+
type: purchaseType,
|
|
452
|
+
purchaseType: DIGIPAY_PURCHASE_TYPES[purchaseType] ?? null,
|
|
453
|
+
paymentGateway: data.paymentGateway ?? null,
|
|
454
|
+
pspName: data.pspName ?? null,
|
|
455
|
+
fpName: data.fpName ?? null,
|
|
456
|
+
additionalInfo: data.additionalInfo ?? null,
|
|
457
|
+
},
|
|
458
|
+
};
|
|
459
|
+
},
|
|
460
|
+
parseCallback(payload) {
|
|
461
|
+
const rawProviderId = payload.providerId?.trim() || null;
|
|
462
|
+
const orderId = fromDigipayProviderId(rawProviderId);
|
|
463
|
+
const result = payload.result?.trim().toUpperCase() ?? "";
|
|
464
|
+
const succeeded = result === "SUCCESS";
|
|
465
|
+
const trackingCode = payload.trackingCode?.trim() || null;
|
|
466
|
+
return {
|
|
467
|
+
sessionId: null,
|
|
468
|
+
gatewayOrderId: orderId && /^\d+$/.test(orderId) ? orderId : null,
|
|
469
|
+
outcome: succeeded ? "verify" : "failed",
|
|
470
|
+
resultCode: succeeded ? 0 : 9007,
|
|
471
|
+
resultText: succeeded
|
|
472
|
+
? "Digipay reported SUCCESS; awaiting verify."
|
|
473
|
+
: "پرداخت دیجیپی ناموفق بود یا توسط کاربر لغو شد.",
|
|
474
|
+
providerReference: trackingCode,
|
|
475
|
+
maskedCardNumber: null,
|
|
476
|
+
payload: {
|
|
477
|
+
result,
|
|
478
|
+
trackingCode,
|
|
479
|
+
providerId: rawProviderId,
|
|
480
|
+
amount: payload.amount?.trim() || null,
|
|
481
|
+
type: payload.type?.trim() || null,
|
|
482
|
+
rrn: payload.rrn?.trim() || null,
|
|
483
|
+
psp: payload.psp?.trim() || null,
|
|
484
|
+
isCredit: payload.isCredit?.trim() || null,
|
|
485
|
+
},
|
|
486
|
+
};
|
|
487
|
+
},
|
|
488
|
+
};
|
|
489
|
+
//# sourceMappingURL=digipay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digipay.js","sourceRoot":"","sources":["../../src/gateways/digipay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { digipayPaymentAdapter, DIGIPAY_PROVIDER_CODE } from "./digipay.js";
|
|
2
|
+
export { mellatPaymentAdapter, MELLAT_PROVIDER_CODE } from "./mellat.js";
|
|
3
|
+
export { sadadPaymentAdapter, SADAD_PROVIDER_CODE } from "./sadad.js";
|
|
4
|
+
export { zarinpalPaymentAdapter, ZARINPAL_PROVIDER_CODE } from "./zarinpal.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateways/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { digipayPaymentAdapter, DIGIPAY_PROVIDER_CODE } from "./digipay.js";
|
|
2
|
+
export { mellatPaymentAdapter, MELLAT_PROVIDER_CODE } from "./mellat.js";
|
|
3
|
+
export { sadadPaymentAdapter, SADAD_PROVIDER_CODE } from "./sadad.js";
|
|
4
|
+
export { zarinpalPaymentAdapter, ZARINPAL_PROVIDER_CODE } from "./zarinpal.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gateways/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mellat-constants.d.ts","sourceRoot":"","sources":["../../src/gateways/mellat-constants.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,eAAO,MAAM,mBAAmB,uDACsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mellat-constants.js","sourceRoot":"","sources":["../../src/gateways/mellat-constants.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAC9B,oDAAoD,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type PaymentGatewayAdapter } from "../types.js";
|
|
2
|
+
export declare const MELLAT_PROVIDER_CODE = "mellat";
|
|
3
|
+
export declare const MELLAT_PROVIDER_NAME = "Mellat (Behpardakht)";
|
|
4
|
+
import { MELLAT_STARTPAY_URL } from "./mellat-constants.js";
|
|
5
|
+
export { MELLAT_STARTPAY_URL };
|
|
6
|
+
/** Response codes from the Behpardakht IPG guide v1.29. */
|
|
7
|
+
export declare const MELLAT_RESULT_CODES: Record<number, {
|
|
8
|
+
message: string;
|
|
9
|
+
retryable: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function describeMellatCode(code: number | null | undefined): string;
|
|
12
|
+
export type MellatConfigStatus = {
|
|
13
|
+
providerCode: typeof MELLAT_PROVIDER_CODE;
|
|
14
|
+
providerName: typeof MELLAT_PROVIDER_NAME;
|
|
15
|
+
liveConfigured: boolean;
|
|
16
|
+
terminalIdMasked: string | null;
|
|
17
|
+
usernameMasked: string | null;
|
|
18
|
+
relayed: boolean;
|
|
19
|
+
};
|
|
20
|
+
export declare function getMellatConfigStatus(): MellatConfigStatus;
|
|
21
|
+
export declare function buildMellatEnvelope(operation: string, fields: Array<[string, string]>): string;
|
|
22
|
+
/** Reads the single `<return>` string every Behpardakht operation returns. */
|
|
23
|
+
export declare function parseMellatReturn(xml: string): string | null;
|
|
24
|
+
/** `localDate` (YYYYMMDD) and `localTime` (HHMMSS) in Tehran time. */
|
|
25
|
+
export declare function mellatLocalDateTime(now?: Date): {
|
|
26
|
+
localDate: string;
|
|
27
|
+
localTime: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const mellatPaymentAdapter: PaymentGatewayAdapter;
|
|
30
|
+
//# sourceMappingURL=mellat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mellat.d.ts","sourceRoot":"","sources":["../../src/gateways/mellat.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,qBAAqB,EAG3B,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,oBAAoB,WAAW,CAAA;AAC5C,eAAO,MAAM,oBAAoB,yBAAyB,CAAA;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE3D,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAK9B,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,MAAM,EACN;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAqCxC,CAAA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,UAOjE;AA+BD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,OAAO,oBAAoB,CAAA;IACzC,YAAY,EAAE,OAAO,oBAAoB,CAAA;IACzC,cAAc,EAAE,OAAO,CAAA;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAA;AAaD,wBAAgB,qBAAqB,IAAI,kBAAkB,CAS1D;AAqBD,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,UAMhC;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,iBAG5C;AAkDD,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,GAAG,OAAa;;;EAmBnD;AAaD,eAAO,MAAM,oBAAoB,EAAE,qBAsQlC,CAAA"}
|