@muhammedaksam/sipay-node 1.0.6 → 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.
- package/README.md +100 -0
- package/dist/esm/index.js +15 -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 +28 -2
- 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 +40 -35
- 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 +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -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 +20 -6
- package/dist/resources/payments.d.ts.map +1 -1
- package/dist/resources/payments.js +27 -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 +12 -3
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +80 -38
- 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 +1 -1
package/README.md
CHANGED
|
@@ -16,6 +16,7 @@ An unofficial Node.js TypeScript SDK for the Sipay payment gateway.
|
|
|
16
16
|
- 🔄 Recurring payments
|
|
17
17
|
- 🏷️ Branded payment solutions
|
|
18
18
|
- 📊 Commission information
|
|
19
|
+
- 🏷️ Status code management with detailed error handling
|
|
19
20
|
- 🛡️ Type-safe with TypeScript
|
|
20
21
|
- ✅ Input validation
|
|
21
22
|
- 🔒 Secure payment processing
|
|
@@ -302,6 +303,105 @@ interface SipayApiResponse<T = any> {
|
|
|
302
303
|
}
|
|
303
304
|
```
|
|
304
305
|
|
|
306
|
+
## Status Code Management
|
|
307
|
+
|
|
308
|
+
The SDK provides comprehensive status code utilities to help you handle different payment scenarios effectively.
|
|
309
|
+
|
|
310
|
+
### Available Status Codes
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
import { SipayStatusCode, getStatusCodeInfo, getSuggestedAction } from '@muhammedaksam/sipay-node';
|
|
314
|
+
|
|
315
|
+
// Status code enums
|
|
316
|
+
SipayStatusCode.SUCCESSFUL; // 100 - Payment successful
|
|
317
|
+
SipayStatusCode.BASIC_VALIDATION; // 1 - Basic validation error
|
|
318
|
+
SipayStatusCode.INVALID_CREDENTIALS; // 30 - Authentication failed
|
|
319
|
+
SipayStatusCode.ORDER_FAILED; // 41 - Payment failed
|
|
320
|
+
SipayStatusCode.CREDIT_CARD_BLOCKED; // 44 - Card blocked
|
|
321
|
+
SipayStatusCode.REFUND_FAILED; // 49 - Refund error
|
|
322
|
+
SipayStatusCode.FOREIGN_CARDS_NOT_ALLOWED; // 76 - Foreign cards not allowed
|
|
323
|
+
// ... and 50+ more status codes
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Status Code Utilities
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
import {
|
|
330
|
+
getStatusCodeInfo,
|
|
331
|
+
getSuggestedAction,
|
|
332
|
+
StatusCodeGroups,
|
|
333
|
+
isStatusInGroup,
|
|
334
|
+
} from '@muhammedaksam/sipay-node';
|
|
335
|
+
|
|
336
|
+
// Get detailed information about a status code
|
|
337
|
+
const info = getStatusCodeInfo(response.status_code);
|
|
338
|
+
console.log(info.description); // Human-readable description
|
|
339
|
+
console.log(info.category); // 'success', 'validation_error', 'payment_error', etc.
|
|
340
|
+
console.log(info.isRetryable); // Whether the error can be retried
|
|
341
|
+
console.log(info.httpEquivalent); // HTTP status equivalent (if applicable)
|
|
342
|
+
|
|
343
|
+
// Get actionable suggestions
|
|
344
|
+
const suggestion = getSuggestedAction(response.status_code);
|
|
345
|
+
console.log(suggestion); // "Check payment details and try with different parameters"
|
|
346
|
+
|
|
347
|
+
// Use predefined groups for easy error handling
|
|
348
|
+
if (isStatusInGroup(response.status_code, StatusCodeGroups.VALIDATION_ERRORS)) {
|
|
349
|
+
console.log('Please fix the validation errors in your request');
|
|
350
|
+
} else if (isStatusInGroup(response.status_code, StatusCodeGroups.CARD_ERRORS)) {
|
|
351
|
+
console.log('Please try with a different card');
|
|
352
|
+
}
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### Enhanced Error Handling
|
|
356
|
+
|
|
357
|
+
```typescript
|
|
358
|
+
import { SipayStatusCode, getStatusCodeInfo } from '@muhammedaksam/sipay-node';
|
|
359
|
+
|
|
360
|
+
try {
|
|
361
|
+
const response = await sipay.payments.pay2D(paymentData);
|
|
362
|
+
|
|
363
|
+
if (response.status_code === SipayStatusCode.SUCCESSFUL) {
|
|
364
|
+
console.log('✅ Payment successful!');
|
|
365
|
+
console.log('Order ID:', response.data?.order_id);
|
|
366
|
+
} else {
|
|
367
|
+
// Handle non-success responses with detailed status information
|
|
368
|
+
const statusInfo = getStatusCodeInfo(response.status_code);
|
|
369
|
+
|
|
370
|
+
console.log('❌ Payment failed:');
|
|
371
|
+
console.log('Status Code:', statusInfo.code);
|
|
372
|
+
console.log('Description:', statusInfo.description);
|
|
373
|
+
console.log('Category:', statusInfo.category);
|
|
374
|
+
|
|
375
|
+
// Handle retryable errors
|
|
376
|
+
if (statusInfo.isRetryable) {
|
|
377
|
+
console.log('🔄 This error is retryable - you can try again after a delay');
|
|
378
|
+
// Implement retry logic here
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
} catch (error) {
|
|
382
|
+
// SDK errors now include enhanced status information
|
|
383
|
+
if (error.status_code) {
|
|
384
|
+
const statusInfo = getStatusCodeInfo(error.status_code);
|
|
385
|
+
console.log('Error category:', statusInfo.category);
|
|
386
|
+
console.log('Suggested action:', getSuggestedAction(error.status_code));
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### Status Categories
|
|
392
|
+
|
|
393
|
+
The SDK categorizes status codes for easier error handling:
|
|
394
|
+
|
|
395
|
+
- **Success**: `100`, `101`, `112` - Transaction completed successfully
|
|
396
|
+
- **Validation Errors**: `1`, `12`, `13`, `32`, `33`, `85`, `108`, `404` - Request validation issues
|
|
397
|
+
- **Authentication Errors**: `30`, `34`, `79`, `87` - Credential or permission issues
|
|
398
|
+
- **Payment Errors**: `41`, `43`, `49`, `31`, `69`, `105` - Payment processing failures
|
|
399
|
+
- **Merchant Errors**: `14`, `37`, `38`, `44`, `45-48`, `80`, `106` - Merchant configuration issues
|
|
400
|
+
- **Card Errors**: `44`, `60`, `70`, `76`, `77`, `86`, `88-89` - Card-related problems
|
|
401
|
+
- **Hash Errors**: `68`, `90-97` - Hash key validation failures
|
|
402
|
+
- **Recurring Errors**: `55`, `71`, `73` - Recurring payment issues
|
|
403
|
+
- **Retryable Errors**: `3`, `49`, `69`, `117` - Temporary errors that can be retried
|
|
404
|
+
|
|
305
405
|
## Development
|
|
306
406
|
|
|
307
407
|
```bash
|
package/dist/esm/index.js
CHANGED
|
@@ -3,6 +3,11 @@ import { Payments } from './resources/payments';
|
|
|
3
3
|
import { Recurring } from './resources/recurring';
|
|
4
4
|
import { BrandedSolution } from './resources/branded-solution';
|
|
5
5
|
import { Commissions } from './resources/commissions';
|
|
6
|
+
import { Cards } from './resources/cards';
|
|
7
|
+
import { PaymentCompletion } from './resources/payment-completion';
|
|
8
|
+
import { Marketplace } from './resources/marketplace';
|
|
9
|
+
import { Cashout } from './resources/cashout';
|
|
10
|
+
import { SubMerchant } from './resources/sub-merchant';
|
|
6
11
|
export class Sipay {
|
|
7
12
|
constructor(config) {
|
|
8
13
|
this.client = new SipayHttpClient(config);
|
|
@@ -11,6 +16,11 @@ export class Sipay {
|
|
|
11
16
|
this.recurring = new Recurring(this.client);
|
|
12
17
|
this.brandedSolution = new BrandedSolution(this.client);
|
|
13
18
|
this.commissions = new Commissions(this.client);
|
|
19
|
+
this.cards = new Cards(this.client);
|
|
20
|
+
this.paymentCompletion = new PaymentCompletion(this.client);
|
|
21
|
+
this.marketplace = new Marketplace(this.client);
|
|
22
|
+
this.cashout = new Cashout(this.client);
|
|
23
|
+
this.subMerchant = new SubMerchant(this.client);
|
|
14
24
|
}
|
|
15
25
|
/**
|
|
16
26
|
* Manually authenticate with Sipay API
|
|
@@ -42,5 +52,10 @@ export { Payments } from './resources/payments';
|
|
|
42
52
|
export { Recurring } from './resources/recurring';
|
|
43
53
|
export { BrandedSolution } from './resources/branded-solution';
|
|
44
54
|
export { Commissions } from './resources/commissions';
|
|
55
|
+
export { Cards } from './resources/cards';
|
|
56
|
+
export { PaymentCompletion } from './resources/payment-completion';
|
|
57
|
+
export { Marketplace } from './resources/marketplace';
|
|
58
|
+
export { Cashout } from './resources/cashout';
|
|
59
|
+
export { SubMerchant } from './resources/sub-merchant';
|
|
45
60
|
export * from './utils';
|
|
46
61
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -7,12 +7,5 @@ export class BrandedSolution extends SipayResource {
|
|
|
7
7
|
const data = this.addMerchantKey(linkData);
|
|
8
8
|
return this.post('/purchase/link', data, options);
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
11
|
-
* Check the status of a branded payment
|
|
12
|
-
*/
|
|
13
|
-
async checkStatus(statusData, options) {
|
|
14
|
-
const data = this.addMerchantKey(statusData);
|
|
15
|
-
return this.post('/purchase/status', data, options);
|
|
16
|
-
}
|
|
17
10
|
}
|
|
18
11
|
//# sourceMappingURL=branded-solution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"branded-solution.js","sourceRoot":"","sources":["../../../src/resources/branded-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"branded-solution.js","sourceRoot":"","sources":["../../../src/resources/branded-solution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGvC,MAAM,OAAO,eAAgB,SAAQ,aAAa;IAChD;;OAEG;IACH,KAAK,CAAC,iBAAiB,CACrB,QAAsD,EACtD,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CAIF"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
import { generateHashKey, generatePaymentHashKey } from '../utils';
|
|
3
|
+
export class Cards extends SipayResource {
|
|
4
|
+
/**
|
|
5
|
+
* Save a credit card for future use
|
|
6
|
+
*/
|
|
7
|
+
async saveCard(cardData, options) {
|
|
8
|
+
const data = this.addMerchantKey(cardData);
|
|
9
|
+
// Generate hash key for save card
|
|
10
|
+
// Hash format: merchant_key|customer_number|card_holder_name|card_number|expiry_month|expiry_year
|
|
11
|
+
const hashParts = [
|
|
12
|
+
data.merchant_key,
|
|
13
|
+
data.customer_number,
|
|
14
|
+
data.cc_holder_name,
|
|
15
|
+
data.cc_no,
|
|
16
|
+
data.expiry_month,
|
|
17
|
+
data.expiry_year,
|
|
18
|
+
];
|
|
19
|
+
data.hash_key = generateHashKey(hashParts, this.client['config'].appSecret);
|
|
20
|
+
return this.post('/api/saveCard', data, options);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get saved card tokens for a customer
|
|
24
|
+
*/
|
|
25
|
+
async getCardTokens(customerData, options) {
|
|
26
|
+
const data = this.addMerchantKey(customerData);
|
|
27
|
+
return this.get('/api/getCardTokens', data, options);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Edit a saved card
|
|
31
|
+
*/
|
|
32
|
+
async editCard(cardData, options) {
|
|
33
|
+
const data = this.addMerchantKey(cardData);
|
|
34
|
+
// Generate hash key for edit card
|
|
35
|
+
// Hash format: merchant_key|customer_number|card_token
|
|
36
|
+
const hashParts = [data.merchant_key, data.customer_number, data.card_token];
|
|
37
|
+
data.hash_key = generateHashKey(hashParts, this.client['config'].appSecret);
|
|
38
|
+
return this.post('/api/editCard', data, options);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Delete a saved card
|
|
42
|
+
*/
|
|
43
|
+
async deleteCard(cardData, options) {
|
|
44
|
+
const data = this.addMerchantKey(cardData);
|
|
45
|
+
// Generate hash key for delete card
|
|
46
|
+
// Hash format: merchant_key|customer_number|card_token
|
|
47
|
+
const hashParts = [data.merchant_key, data.customer_number, data.card_token];
|
|
48
|
+
data.hash_key = generateHashKey(hashParts, this.client['config'].appSecret);
|
|
49
|
+
return this.post('/api/deleteCard', data, options);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Pay using a saved card token (3D Secure)
|
|
53
|
+
*/
|
|
54
|
+
async payByCardToken(paymentData, options) {
|
|
55
|
+
const data = this.addMerchantKey(paymentData);
|
|
56
|
+
// Generate hash key for card token payment
|
|
57
|
+
// Hash format: total|installments_number|currency_code|merchant_key|invoice_id
|
|
58
|
+
const hashKey = generatePaymentHashKey(data.total, data.installments_number || 1, data.currency_code, data.merchant_key, data.invoice_id, this.client['config'].appSecret);
|
|
59
|
+
data.hash_key = hashKey;
|
|
60
|
+
return this.post('/api/payByCardToken', data, options);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Pay using a saved card token (Non-Secure/2D)
|
|
64
|
+
*/
|
|
65
|
+
async payByCardTokenNonSecure(paymentData, options) {
|
|
66
|
+
const data = this.addMerchantKey(paymentData);
|
|
67
|
+
// Generate hash key for non-secure card token payment
|
|
68
|
+
// Hash format: total|installments_number|currency_code|merchant_key|invoice_id
|
|
69
|
+
const hashKey = generatePaymentHashKey(data.total, data.installments_number || 1, data.currency_code, data.merchant_key, data.invoice_id, this.client['config'].appSecret);
|
|
70
|
+
data.hash_key = hashKey;
|
|
71
|
+
return this.post('/api/payByCardTokenNonSecure', data, options);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=cards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.js","sourceRoot":"","sources":["../../../src/resources/cards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
export class Cashout extends SipayResource {
|
|
3
|
+
/**
|
|
4
|
+
* Initiate a cashout to bank account
|
|
5
|
+
* Note: This endpoint requires Bearer token authentication and uses a different request structure
|
|
6
|
+
* Hash generation format is not documented in the API spec - requires investigation
|
|
7
|
+
*/
|
|
8
|
+
async toBank(cashoutData, options) {
|
|
9
|
+
const data = this.addMerchantKey(cashoutData);
|
|
10
|
+
// TODO: Implement hash generation for cashout endpoint
|
|
11
|
+
// The API spec shows hash_key is required but doesn't provide hash generation examples
|
|
12
|
+
// Hash format needs to be determined - possibly based on merchant_key + invoice_id + amount
|
|
13
|
+
data.hash_key = 'TODO_IMPLEMENT_CASHOUT_HASH_GENERATION';
|
|
14
|
+
return this.post('/api/cashout/tobank', data, options);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=cashout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cashout.js","sourceRoot":"","sources":["../../../src/resources/cashout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAqBvC,MAAM,OAAO,OAAQ,SAAQ,aAAa;IACxC;;;;OAIG;IACH,KAAK,CAAC,MAAM,CACV,WAAoE,EACpE,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAyB,CAAC;QAEtE,uDAAuD;QACvD,uFAAuF;QACvF,4FAA4F;QAC5F,IAAI,CAAC,QAAQ,GAAG,wCAAwC,CAAC;QAEzD,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
import { generatePaymentHashKey } from '../utils';
|
|
3
|
+
export class Marketplace extends SipayResource {
|
|
4
|
+
/**
|
|
5
|
+
* Make a marketplace payment (non-secure/2D)
|
|
6
|
+
*/
|
|
7
|
+
async pay2D(paymentData, options) {
|
|
8
|
+
const data = this.addMerchantKey(paymentData);
|
|
9
|
+
// Generate hash key for marketplace payment
|
|
10
|
+
// Hash format: total|installments_number|currency_code|merchant_key|invoice_id
|
|
11
|
+
const hashKey = generatePaymentHashKey(data.total, data.installments_number || 1, data.currency_code, data.merchant_key, data.invoice_id, this.client['config'].appSecret);
|
|
12
|
+
data.hash_key = hashKey;
|
|
13
|
+
return this.post('/api/marketplace/sale/pay/smart/non-secure', data, options);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Make a marketplace payment with 3D Secure
|
|
17
|
+
*/
|
|
18
|
+
async pay3D(paymentData, options) {
|
|
19
|
+
const data = this.addMerchantKey(paymentData);
|
|
20
|
+
return this.post('/api/marketplace/sale/pay/smart/secure', data, options);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Refund a marketplace payment
|
|
24
|
+
*/
|
|
25
|
+
async refund(refundData, options) {
|
|
26
|
+
const data = this.addMerchantKey(refundData);
|
|
27
|
+
return this.post('/ccpayment/api/marketplace/sale/refund', data, options);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check status of a marketplace payment
|
|
31
|
+
*/
|
|
32
|
+
async checkStatus(statusData, options) {
|
|
33
|
+
const data = this.addMerchantKey(statusData);
|
|
34
|
+
return this.post('/ccpayment/api/marketplace/sale/check/status', data, options);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get settlements information
|
|
38
|
+
*/
|
|
39
|
+
async getSettlements(settlementsData, options) {
|
|
40
|
+
const data = this.addMerchantKey(settlementsData);
|
|
41
|
+
return this.post('/ccpayment/api/settlements', data, options);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Approve a marketplace transaction
|
|
45
|
+
*/
|
|
46
|
+
async approveTransaction(approveData, options) {
|
|
47
|
+
const data = this.addMerchantKey(approveData);
|
|
48
|
+
return this.post('/ccpayment/api/marketplace/sale/transaction/approve', data, options);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process payout to sub merchants
|
|
52
|
+
*/
|
|
53
|
+
async payout(payoutData, options) {
|
|
54
|
+
const data = this.addMerchantKey(payoutData);
|
|
55
|
+
return this.post('/ccpayment/api/marketplace/sub-merchant/payout', data, options);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../../src/resources/marketplace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAWvC,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AA8DlD,MAAM,OAAO,WAAY,SAAQ,aAAa;IAC5C;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,WAAsE,EACtE,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAA2B,CAAC;QAExE,4CAA4C;QAC5C,+EAA+E;QAC/E,MAAM,OAAO,GAAG,sBAAsB,CACpC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,mBAAmB,IAAI,CAAC,EAC7B,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAChC,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,OAAO,IAAI,CAAC,IAAI,CAAC,4CAA4C,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CACT,WAAyD,EACzD,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,UAA0D,EAC1D,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,wCAAwC,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,UAA0D,EAC1D,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,8CAA8C,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAClB,eAAyD,EACzD,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACtB,WAA4D,EAC5D,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,qDAAqD,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,UAA0D,EAC1D,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,gDAAgD,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC;CACF"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
import * as crypto from 'crypto';
|
|
3
|
+
const { createHash, createCipheriv } = crypto;
|
|
4
|
+
export class PaymentCompletion extends SipayResource {
|
|
5
|
+
/**
|
|
6
|
+
* Complete or cancel a 3D payment transaction
|
|
7
|
+
* This is used for merchant 3D model where payment completion is done by merchant
|
|
8
|
+
*/
|
|
9
|
+
async completePayment(completionData, options) {
|
|
10
|
+
const data = this.addMerchantKey(completionData);
|
|
11
|
+
// Generate hash key using the payment completion format
|
|
12
|
+
// Hash format: merchant_key|invoice_id|order_id|status
|
|
13
|
+
const hashKey = this.generatePaymentCompletionHashKey(this.client['config'].merchantKey, data.invoice_id, data.order_id, data.status, this.client['config'].appSecret);
|
|
14
|
+
data.hash_key = hashKey;
|
|
15
|
+
return this.post('/payment/complete', data, options);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate hash key for payment completion (using official method)
|
|
19
|
+
*/
|
|
20
|
+
generatePaymentCompletionHashKey(merchantKey, invoiceId, orderId, status, appSecret) {
|
|
21
|
+
try {
|
|
22
|
+
const data = merchantKey + '|' + invoiceId + '|' + orderId + '|' + status;
|
|
23
|
+
const iv = createHash('sha1').update(String(Math.random())).digest('hex').slice(0, 16);
|
|
24
|
+
const password = createHash('sha1').update(appSecret).digest('hex');
|
|
25
|
+
const salt = createHash('sha1').update(String(Math.random())).digest('hex').slice(0, 4);
|
|
26
|
+
const saltWithPassword = createHash('sha256')
|
|
27
|
+
.update(password + salt)
|
|
28
|
+
.digest('hex')
|
|
29
|
+
.slice(0, 32);
|
|
30
|
+
const cipher = createCipheriv('aes-256-cbc', saltWithPassword, iv);
|
|
31
|
+
let encrypted = cipher.update(data, 'binary', 'base64');
|
|
32
|
+
encrypted += cipher.final('base64');
|
|
33
|
+
const msgBundle = iv + ':' + salt + ':' + encrypted;
|
|
34
|
+
return msgBundle.replace(/\//g, '__');
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new Error(`Payment completion hash key generation failed: ${error}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=payment-completion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment-completion.js","sourceRoot":"","sources":["../../../src/resources/payment-completion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;AAU9C,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAClD;;;OAGG;IACH,KAAK,CAAC,eAAe,CACnB,cAAyE,EACzE,OAAwB;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAA2B,CAAC;QAE3E,wDAAwD;QACxD,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,gCAAgC,CACnD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EACjC,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAChC,CAAC;QAEF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACK,gCAAgC,CACtC,WAAmB,EACnB,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,SAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,WAAW,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC;YAE1E,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEvF,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEpE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAExF,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC;iBAC1C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;iBACvB,MAAM,CAAC,KAAK,CAAC;iBACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAEhB,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAEnE,IAAI,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACxD,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEpC,MAAM,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,SAAS,CAAC;YAEpD,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { SipayResource } from './base';
|
|
2
|
-
import { generatePaymentHashKey, generateStatusHashKey } from '../utils';
|
|
2
|
+
import { generatePaymentHashKey, generateStatusHashKey, generateConfirmPaymentHashKey, } from '../utils';
|
|
3
3
|
export class Payments extends SipayResource {
|
|
4
4
|
/**
|
|
5
5
|
* Make a 2D payment (without 3D Secure authentication)
|
|
6
6
|
*/
|
|
7
7
|
async pay2D(paymentData, options) {
|
|
8
8
|
const data = this.addMerchantKey(paymentData);
|
|
9
|
-
// Generate hash key for payment
|
|
9
|
+
// Generate hash key for payment verification
|
|
10
10
|
const hashKey = generatePaymentHashKey(data.total, data.installments_number || 1, data.currency_code, this.client['config'].merchantKey, data.invoice_id, this.client['config'].appSecret);
|
|
11
11
|
data.hash_key = hashKey;
|
|
12
12
|
return this.post('/api/paySmart2D', data, options);
|
|
@@ -39,6 +39,17 @@ export class Payments extends SipayResource {
|
|
|
39
39
|
data.hash_key = hashKey;
|
|
40
40
|
return this.post('/api/checkstatus', data, options);
|
|
41
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* Confirm a pre-authorization payment
|
|
44
|
+
*/
|
|
45
|
+
async confirmPayment(confirmData, options) {
|
|
46
|
+
const data = this.addMerchantKey(confirmData);
|
|
47
|
+
// Generate hash key for payment confirmation
|
|
48
|
+
// Hash format: merchant_key|invoice_id|status
|
|
49
|
+
const hashKey = generateConfirmPaymentHashKey(data.merchant_key, data.invoice_id, data.status, this.client['config'].appSecret);
|
|
50
|
+
data.hash_key = hashKey;
|
|
51
|
+
return this.post('/api/confirmPayment', data, options);
|
|
52
|
+
}
|
|
42
53
|
/**
|
|
43
54
|
* Refund a payment
|
|
44
55
|
*/
|
|
@@ -46,6 +57,21 @@ export class Payments extends SipayResource {
|
|
|
46
57
|
const data = this.addMerchantKey(refundData);
|
|
47
58
|
return this.post('/api/refund', data, options);
|
|
48
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Get merchant active installments
|
|
62
|
+
* Note: This endpoint uses Bearer token authentication
|
|
63
|
+
*/
|
|
64
|
+
async getInstallments(options) {
|
|
65
|
+
// This endpoint doesn't require request body, only headers with Bearer token
|
|
66
|
+
return this.post('/api/installments', {}, options);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get authentication token
|
|
70
|
+
* Used for Bearer token authentication in certain endpoints
|
|
71
|
+
*/
|
|
72
|
+
async getToken(tokenData, options) {
|
|
73
|
+
return this.post('/api/token', tokenData, options);
|
|
74
|
+
}
|
|
49
75
|
/**
|
|
50
76
|
* Legacy 2D payment method (maintains compatibility)
|
|
51
77
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../../src/resources/payments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"payments.js","sourceRoot":"","sources":["../../../src/resources/payments.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
1
|
import { SipayResource } from './base';
|
|
2
|
+
// Note: Recurring payment functionality is handled through the regular payment endpoints
|
|
3
|
+
// by including recurring parameters (recurring_payment_number, recurring_payment_cycle,
|
|
4
|
+
// recurring_payment_interval, recurring_web_hook_key) in the payment request.
|
|
5
|
+
// See the Payment2DRequest and Payment3DRequest interfaces for these parameters.
|
|
2
6
|
export class Recurring extends SipayResource {
|
|
3
|
-
/**
|
|
4
|
-
* Query recurring payment information
|
|
5
|
-
*/
|
|
6
|
-
async query(queryData, options) {
|
|
7
|
-
return this.post('/api/QueryRecurring', queryData, options);
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Process a recurring payment plan
|
|
11
|
-
*/
|
|
12
|
-
async processPlan(planData, options) {
|
|
13
|
-
return this.post('/api/recurring/plan/process', planData, options);
|
|
14
|
-
}
|
|
15
7
|
}
|
|
16
8
|
//# sourceMappingURL=recurring.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recurring.js","sourceRoot":"","sources":["../../../src/resources/recurring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"recurring.js","sourceRoot":"","sources":["../../../src/resources/recurring.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,yFAAyF;AACzF,wFAAwF;AACxF,8EAA8E;AAC9E,iFAAiF;AAEjF,MAAM,OAAO,SAAU,SAAQ,aAAa;CAK3C"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { SipayResource } from './base';
|
|
2
|
+
import { generateHashKey } from '../utils';
|
|
3
|
+
export class SubMerchant extends SipayResource {
|
|
4
|
+
/**
|
|
5
|
+
* Add a new standard sub merchant
|
|
6
|
+
*/
|
|
7
|
+
async add(subMerchantData, options) {
|
|
8
|
+
const data = this.addMerchantKey(subMerchantData);
|
|
9
|
+
return this.post('/api/sub-merchant/add', data, options);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Edit a standard sub merchant
|
|
13
|
+
*/
|
|
14
|
+
async edit(editData, options) {
|
|
15
|
+
const data = this.addMerchantKey(editData);
|
|
16
|
+
return this.post('/api/sub-merchant/edit', data, options);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Delete a standard sub merchant
|
|
20
|
+
*/
|
|
21
|
+
async delete(deleteData, options) {
|
|
22
|
+
const data = this.addMerchantKey(deleteData);
|
|
23
|
+
return this.post('/api/sub-merchant/delete', data, options);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* List all standard sub merchants
|
|
27
|
+
*/
|
|
28
|
+
async list(listData, options) {
|
|
29
|
+
const data = this.addMerchantKey(listData || {});
|
|
30
|
+
return this.post('/api/sub-merchant/list', data, options);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Add a new sub merchant PF (Physical Person)
|
|
34
|
+
*/
|
|
35
|
+
async addPF(subMerchantData, options) {
|
|
36
|
+
const data = this.addMerchantKey(subMerchantData);
|
|
37
|
+
return this.post('/api/addSubMerchantPF', data, options);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Delete a sub merchant PF
|
|
41
|
+
*/
|
|
42
|
+
async deletePF(deleteData, options) {
|
|
43
|
+
const data = this.addMerchantKey(deleteData);
|
|
44
|
+
return this.post('/api/deleteSubMerchantPF', data, options);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* View details of a sub merchant PF
|
|
48
|
+
*/
|
|
49
|
+
async viewPF(viewData, options) {
|
|
50
|
+
const data = this.addMerchantKey(viewData);
|
|
51
|
+
return this.post('/api/subMerchantPF/view', data, options);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* List all sub merchants PF
|
|
55
|
+
*/
|
|
56
|
+
async listPF(listData, options) {
|
|
57
|
+
const data = this.addMerchantKey(listData || {});
|
|
58
|
+
return this.post('/api/listSubMerchantPF', data, options);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Make payout to sub merchants
|
|
62
|
+
* Hash format: sub_merchant_id|currency_code|amount for each payout item
|
|
63
|
+
*/
|
|
64
|
+
async payout(payoutData, options) {
|
|
65
|
+
const data = this.addMerchantKey(payoutData);
|
|
66
|
+
// Generate hash key for payout
|
|
67
|
+
// According to the spec: $data = $submerchant.'|'.$currency_code.'|'.$amount;
|
|
68
|
+
// We need to generate hash for the first payout item (or combined if multiple)
|
|
69
|
+
if (data.payout_data && data.payout_data.length > 0) {
|
|
70
|
+
const firstPayout = data.payout_data[0];
|
|
71
|
+
const hashParts = [
|
|
72
|
+
firstPayout.sub_merchant_id,
|
|
73
|
+
firstPayout.currency_code,
|
|
74
|
+
firstPayout.amount,
|
|
75
|
+
];
|
|
76
|
+
data.hash_key = generateHashKey(hashParts, this.client['config'].appSecret);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw new Error('Payout data is required');
|
|
80
|
+
}
|
|
81
|
+
return this.post('/ccpayment/api/marketplace/sub-merchant/payout', data, options);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=sub-merchant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sub-merchant.js","sourceRoot":"","sources":["../../../src/resources/sub-merchant.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/types/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AA+iBA,sBAAsB;AACtB,cAAc,gBAAgB,CAAC"}
|