@crediblemark/buayar 0.1.7 → 0.1.9
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 +56 -175
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +15 -101
- package/dist/index.mjs +15 -101
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -3,26 +3,41 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@crediblemark/buayar)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
**`@crediblemark/buayar`** adalah Unified Payment Gateway SDK untuk Node.js dan TypeScript yang dirancang untuk mempermudah integrasi berbagai gerbang pembayaran (Payment Gateway)
|
|
6
|
+
**`@crediblemark/buayar`** adalah Unified Payment Gateway SDK untuk Node.js dan TypeScript yang dirancang untuk mempermudah integrasi berbagai gerbang pembayaran (Payment Gateway) di Indonesia menggunakan satu struktur API yang seragam.
|
|
7
7
|
|
|
8
|
-
Dengan SDK ini, Anda cukup menulis kode satu kali menggunakan struktur API yang konsisten untuk mengelola pembuatan
|
|
8
|
+
Dengan SDK ini, Anda cukup menulis kode satu kali menggunakan struktur API yang konsisten untuk mengelola pembuatan transaksi, pengecekan status transaksi, query metode pembayaran, serta verifikasi callback webhook dari berbagai penyedia layanan payment gateway.
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
## 🚀 Fitur Utama
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
- 🔄 **Unified API**: Satu antarmuka (interface) terpadu untuk semua provider payment gateway.
|
|
15
|
-
- ⚡ **Direct Payment Support**: Otomatis mendeteksi `paymentMethod` dan beralih ke Direct Inquiry API
|
|
16
|
-
- 🏷️ **Pre-Categorization (Accordion Ready)**: Menyediakan pengelompokan pembayaran bawaan (`Virtual Account`, `QRIS`, `E-Wallet`, `Retail / Gerai`, `Lainnya`) langsung dari API response untuk memudahkan implementasi UI accordion.
|
|
15
|
+
- ⚡ **Direct Payment Support**: Otomatis mendeteksi `paymentMethod` dan beralih ke Direct Inquiry API Duitku atau Core API Midtrans untuk mengembalikan `vaNumber`, `qrString` (EMVCo), dan `paymentCode` secara instan tanpa redirect eksternal.
|
|
16
|
+
- 🏷️ **Pre-Categorization (Accordion Ready)**: Menyediakan pengelompokan pembayaran bawaan (`Virtual Account`, `QRIS`, `E-Wallet`, `Retail / Gerai`, `Kartu Kredit`, `Paylater / Cicilan`, `Lainnya`) langsung dari API response untuk memudahkan implementasi UI accordion.
|
|
17
17
|
- 🎨 **Headless SDK Philosophy**: Dirancang murni sebagai core logic & data manager tanpa overhead UI/styling. Memberikan kebebasan penuh bagi pengembang untuk mendesain UI/Tailwind/dark mode di tingkat aplikasi.
|
|
18
18
|
- 🛡️ **Tipe Data Kuat (TypeScript)**: Dilengkapi dengan deklarasi tipe data lengkap untuk mencegah *runtime error*.
|
|
19
|
-
- 🇮🇩 **Dukungan Lokal**: Siap digunakan untuk transaksi di Indonesia (seperti Duitku).
|
|
20
19
|
- ⚙️ **Modular & Dapat Diperluas**: Memungkinkan penambahan provider baru dengan mewarisi kelas base yang disediakan.
|
|
21
|
-
- 🔒 **Otomatisasi Signature**: Keamanan transaksi terjamin dengan pembuatan *hash* signature (MD5, SHA-256) otomatis secara internal.
|
|
22
|
-
|
|
20
|
+
- 🔒 **Otomatisasi Signature**: Keamanan transaksi terjamin dengan pembuatan *hash* signature (MD5, SHA-256, SHA-512) otomatis secara internal.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 📦 Provider yang Didukung
|
|
25
|
+
|
|
26
|
+
SDK ini mendukung beberapa provider payment gateway terkemuka di Indonesia. Silakan merujuk ke dokumentasi detail untuk masing-masing provider:
|
|
27
|
+
|
|
28
|
+
* 🏛️ **[Integrasi Duitku (docs/duitku.md)](file:///media/rasyiqi/PROJECT/credibuild-project/buayar/docs/duitku.md)**
|
|
29
|
+
* Mendukung Redirect Checkout & Direct Inquiry (VA, QRIS, Retail Code langsung).
|
|
30
|
+
* Verifikasi callback otomatis (signature MD5).
|
|
31
|
+
* Penelusuran status transaksi & query metode pembayaran dinamis.
|
|
32
|
+
|
|
33
|
+
* 🏛️ **[Integrasi Midtrans (docs/midtrans.md)](file:///media/rasyiqi/PROJECT/credibuild-project/buayar/docs/midtrans.md)**
|
|
34
|
+
* Mendukung Snap API (Redirect Checkout) & Core API (Direct Charge VA, QRIS, E-Wallet, Retail, Kartu Kredit, Paylater).
|
|
35
|
+
* Verifikasi callback otomatis (signature SHA-512).
|
|
36
|
+
* Dilengkapi ekstensi `MidtransClient` untuk fitur transaksi pasca-bayar (refund, cancel, subscription recurring, balance check, payment link, gopay tokenization, invoicing).
|
|
37
|
+
|
|
23
38
|
---
|
|
24
39
|
|
|
25
|
-
##
|
|
40
|
+
## ⚙️ Instalasi
|
|
26
41
|
|
|
27
42
|
Instal package menggunakan manajer paket pilihan Anda:
|
|
28
43
|
|
|
@@ -40,6 +55,23 @@ yarn add @crediblemark/buayar
|
|
|
40
55
|
pnpm add @crediblemark/buayar
|
|
41
56
|
```
|
|
42
57
|
|
|
58
|
+
### Instalasi dari GitHub Packages (Alternatif)
|
|
59
|
+
|
|
60
|
+
Package ini juga tersedia di [GitHub Packages](https://github.com/crediblemark-official/Buayar/packages). Buat file `.npmrc` di root project Anda:
|
|
61
|
+
|
|
62
|
+
```ini
|
|
63
|
+
@crediblemark:registry=https://npm.pkg.github.com/
|
|
64
|
+
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Kemudian install seperti biasa:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
bun add @crediblemark/buayar
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
> **Catatan:** Anda memerlukan GitHub Personal Access Token (PAT) dengan scope `read:packages` yang di-set sebagai environment variable `GITHUB_TOKEN`.
|
|
74
|
+
|
|
43
75
|
---
|
|
44
76
|
|
|
45
77
|
## 🗺️ Alur Proses Pembayaran
|
|
@@ -50,15 +82,15 @@ sequenceDiagram
|
|
|
50
82
|
actor Customer as 👤 Pelanggan
|
|
51
83
|
participant App as 💻 Aplikasi Anda (Backend)
|
|
52
84
|
participant SDK as 💳 @crediblemark/buayar
|
|
53
|
-
participant PG as 🏛️ Payment Gateway (
|
|
85
|
+
participant PG as 🏛️ Payment Gateway (Duitku / Midtrans)
|
|
54
86
|
|
|
55
87
|
Customer->>App: 1. Checkout Order
|
|
56
88
|
App->>SDK: 2. createInvoice(provider, params, config)
|
|
57
|
-
SDK->>SDK: 3.
|
|
58
|
-
SDK->>PG: 4. Inquiry Request (API)
|
|
59
|
-
PG-->>SDK: 5. Kembalikan Payment URL
|
|
89
|
+
SDK->>SDK: 3. signature Generation & Calculation
|
|
90
|
+
SDK->>PG: 4. Inquiry / Charge Request (API)
|
|
91
|
+
PG-->>SDK: 5. Kembalikan Payment URL / VA / QRIS / Ref
|
|
60
92
|
SDK-->>App: 6. Response (InvoiceResponse)
|
|
61
|
-
App-->>Customer: 7. Redirect ke
|
|
93
|
+
App-->>Customer: 7. Tampilkan Detail VA/QRIS atau Redirect ke Payment URL
|
|
62
94
|
Customer->>PG: 8. Selesaikan Pembayaran
|
|
63
95
|
PG->>App: 9. Webhook Callback (Notifikasi Pembayaran)
|
|
64
96
|
App->>SDK: 10. verifyCallback(provider, body, config)
|
|
@@ -68,135 +100,6 @@ sequenceDiagram
|
|
|
68
100
|
|
|
69
101
|
---
|
|
70
102
|
|
|
71
|
-
## 🛠️ Integrasi & Penggunaan
|
|
72
|
-
|
|
73
|
-
### 1. Inisialisasi & Membuat Transaksi (Invoice)
|
|
74
|
-
|
|
75
|
-
Berikut adalah contoh pembuatan transaksi menggunakan provider **Duitku**:
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
import { paymentManager } from "@crediblemark/buayar";
|
|
79
|
-
|
|
80
|
-
const providerName = "duitku";
|
|
81
|
-
|
|
82
|
-
// Konfigurasi Kredensial Provider
|
|
83
|
-
const providerConfig = {
|
|
84
|
-
merchantCode: "DXXXX", // Merchant Code dari Duitku
|
|
85
|
-
apiKey: "xxxxxxxxxxxxxxxx", // API Key / Merchant Key Anda
|
|
86
|
-
sandbox: true, // Set true untuk development / testing
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// Parameter Invoice / Pembayaran
|
|
90
|
-
const invoiceParams = {
|
|
91
|
-
orderId: "ORDER-100249",
|
|
92
|
-
amount: 150000, // Nominal transaksi (Rupiah)
|
|
93
|
-
productDetails: "Pembelian Template Landing Page Premium",
|
|
94
|
-
customer: {
|
|
95
|
-
name: "Rasyiqi Crediblemark",
|
|
96
|
-
email: "rasyiqi@crediblemark.com",
|
|
97
|
-
phone: "081234567890", // Opsional
|
|
98
|
-
},
|
|
99
|
-
returnUrl: "https://situsbisnis.com/payment/success",
|
|
100
|
-
callbackUrl: "https://api.situsbisnis.com/v1/payment/callback",
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
async function handleCheckout() {
|
|
104
|
-
try {
|
|
105
|
-
const result = await paymentManager.createInvoice(
|
|
106
|
-
providerName,
|
|
107
|
-
invoiceParams,
|
|
108
|
-
providerConfig
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
if (result.success) {
|
|
112
|
-
console.log("Invoice Berhasil Dibuat! 🎉");
|
|
113
|
-
console.log("URL Pembayaran:", result.paymentUrl);
|
|
114
|
-
console.log("Referensi Gateway:", result.reference);
|
|
115
|
-
|
|
116
|
-
// Redirect pelanggan ke paymentUrl
|
|
117
|
-
// response.redirect(result.paymentUrl);
|
|
118
|
-
} else {
|
|
119
|
-
console.error("Gagal membuat invoice:", result.error);
|
|
120
|
-
}
|
|
121
|
-
} catch (error) {
|
|
122
|
-
console.error("Terjadi kesalahan:", error);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
handleCheckout();
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
### 2. Verifikasi Callback / Webhook Notifikasi
|
|
130
|
-
|
|
131
|
-
Gunakan fungsi ini di endpoint API callback/webhook untuk memastikan data notifikasi yang dikirim oleh Payment Gateway valid dan tidak dimanipulasi:
|
|
132
|
-
|
|
133
|
-
```typescript
|
|
134
|
-
import { paymentManager } from "@crediblemark/buayar";
|
|
135
|
-
|
|
136
|
-
// Endpoint API Webhook Handler
|
|
137
|
-
async function handlePaymentCallback(req: any, res: any) {
|
|
138
|
-
const providerName = "duitku";
|
|
139
|
-
const callbackPayload = req.body; // Payload POST dari gateway
|
|
140
|
-
|
|
141
|
-
const providerConfig = {
|
|
142
|
-
merchantCode: "DXXXX",
|
|
143
|
-
apiKey: "xxxxxxxxxxxxxxxx",
|
|
144
|
-
sandbox: true,
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
try {
|
|
148
|
-
const verification = await paymentManager.verifyCallback(
|
|
149
|
-
providerName,
|
|
150
|
-
callbackPayload,
|
|
151
|
-
providerConfig
|
|
152
|
-
);
|
|
153
|
-
|
|
154
|
-
if (verification.isValid) {
|
|
155
|
-
console.log(`Signature valid untuk Order: ${verification.orderId}`);
|
|
156
|
-
|
|
157
|
-
if (verification.status === "paid") {
|
|
158
|
-
console.log("Status: PEMBAYARAN SELESAI & LUNAS! ✅");
|
|
159
|
-
// Update database Anda: ubah status order menjadi LUNAS
|
|
160
|
-
} else if (verification.status === "failed") {
|
|
161
|
-
console.log("Status: PEMBAYARAN GAGAL ❌");
|
|
162
|
-
// Update database: ubah status order menjadi GAGAL
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
// Kirim respon sukses ke Payment Gateway (Duitku meminta respon plaintext OK)
|
|
166
|
-
res.status(200).send("OK");
|
|
167
|
-
} else {
|
|
168
|
-
console.warn("Peringatan: Signature callback tidak valid! Potensi manipulasi data.");
|
|
169
|
-
res.status(400).send("Bad Signature");
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
console.error("Gagal memproses callback:", error);
|
|
173
|
-
res.status(500).send("Internal Server Error");
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## 🗂️ Referensi API
|
|
181
|
-
|
|
182
|
-
### `PaymentManager`
|
|
183
|
-
|
|
184
|
-
#### `createInvoice(providerName, params, config)`
|
|
185
|
-
Membuat transaksi baru ke gerbang pembayaran tertentu.
|
|
186
|
-
- **`providerName`**: `string` - Nama provider payment gateway (contoh: `'duitku'`).
|
|
187
|
-
- **`params`**: `CreateInvoiceParams` - Data invoice dan detail pelanggan.
|
|
188
|
-
- **`config`**: `ProviderConfig` - Kredensial merchant dan API key.
|
|
189
|
-
- **Return**: `Promise<InvoiceResponse>`
|
|
190
|
-
|
|
191
|
-
#### `verifyCallback(providerName, body, config)`
|
|
192
|
-
Memvalidasi signature webhook callback dari payment gateway.
|
|
193
|
-
- **`providerName`**: `string` - Nama provider payment gateway (contoh: `'duitku'`).
|
|
194
|
-
- **`body`**: `any` - Payload callback mentah dari request body.
|
|
195
|
-
- **`config`**: `ProviderConfig` - Kredensial merchant dan API key.
|
|
196
|
-
- **Return**: `Promise<VerifyCallbackResult>`
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
103
|
## 📐 Spesifikasi Interface (TypeScript)
|
|
201
104
|
|
|
202
105
|
### `CreateInvoiceParams`
|
|
@@ -212,6 +115,8 @@ interface CreateInvoiceParams {
|
|
|
212
115
|
};
|
|
213
116
|
returnUrl: string;
|
|
214
117
|
callbackUrl: string;
|
|
118
|
+
paymentMethod?: string; // Opsional: Kode pembayaran untuk direct charge (contoh: "BCA", "bca_va", "qris")
|
|
119
|
+
providerParams?: any; // Opsional: Parameter tambahan spesifik provider
|
|
215
120
|
}
|
|
216
121
|
```
|
|
217
122
|
|
|
@@ -219,14 +124,14 @@ interface CreateInvoiceParams {
|
|
|
219
124
|
```typescript
|
|
220
125
|
interface InvoiceResponse {
|
|
221
126
|
success: boolean;
|
|
222
|
-
paymentUrl?: string;
|
|
223
|
-
reference?: string;
|
|
224
|
-
vaNumber?: string; // Nomor Virtual Account
|
|
225
|
-
qrString?: string; //
|
|
226
|
-
qrCodeUrl?: string; //
|
|
127
|
+
paymentUrl?: string; // URL checkout halaman pembayaran (jika menggunakan redirect)
|
|
128
|
+
reference?: string; // ID Referensi transaksi / token Snap dari gateway
|
|
129
|
+
vaNumber?: string; // Nomor Virtual Account jika menggunakan VA instan
|
|
130
|
+
qrString?: string; // Data string QRIS mentah (EMVCo) untuk scan QR langsung
|
|
131
|
+
qrCodeUrl?: string; // URL gambar QR Code
|
|
227
132
|
paymentCode?: string; // Kode pembayaran retail (Indomaret/Alfamart)
|
|
228
|
-
rawResponse: any;
|
|
229
|
-
error?: string;
|
|
133
|
+
rawResponse: any; // Payload respons mentah dari API gateway
|
|
134
|
+
error?: string; // Pesan kegagalan jika success = false
|
|
230
135
|
}
|
|
231
136
|
```
|
|
232
137
|
|
|
@@ -237,36 +142,12 @@ interface PaymentMethod {
|
|
|
237
142
|
paymentName: string;
|
|
238
143
|
paymentImage: string;
|
|
239
144
|
totalFee: string;
|
|
240
|
-
category: "Virtual Account" | "QRIS" | "E-Wallet" | "Retail / Gerai" | "Lainnya";
|
|
241
|
-
}
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### `VerifyCallbackResult`
|
|
245
|
-
```typescript
|
|
246
|
-
interface VerifyCallbackResult {
|
|
247
|
-
isValid: boolean;
|
|
248
|
-
orderId: string;
|
|
249
|
-
amount: number;
|
|
250
|
-
status: "paid" | "pending" | "failed";
|
|
251
|
-
rawPayload: any;
|
|
145
|
+
category: "Virtual Account" | "QRIS" | "E-Wallet" | "Retail / Gerai" | "Kartu Kredit" | "Paylater / Cicilan" | "Lainnya";
|
|
252
146
|
}
|
|
253
147
|
```
|
|
254
148
|
|
|
255
149
|
---
|
|
256
150
|
|
|
257
|
-
## 🛠️ Utilitas Tambahan
|
|
258
|
-
|
|
259
|
-
### `getPaymentMethodCategory(code, name)`
|
|
260
|
-
Mengkategorikan kode dan nama metode pembayaran Duitku ke kategori terstandarisasi untuk UI Accordion.
|
|
261
|
-
```typescript
|
|
262
|
-
import { getPaymentMethodCategory } from "@crediblemark/buayar";
|
|
263
|
-
|
|
264
|
-
const cat = getPaymentMethodCategory("BT", "Permata VA");
|
|
265
|
-
// Output: "Virtual Account"
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
---
|
|
269
|
-
|
|
270
151
|
## 📄 Lisensi
|
|
271
152
|
|
|
272
153
|
Proyek ini dilisensikan di bawah **MIT License**. Hak Cipta © 2026 Rasyiqi Crediblemark.
|
package/dist/index.d.mts
CHANGED
|
@@ -102,7 +102,7 @@ declare class MidtransClient {
|
|
|
102
102
|
sandbox: boolean;
|
|
103
103
|
} | ProviderConfig);
|
|
104
104
|
private getApiBaseUrl;
|
|
105
|
-
|
|
105
|
+
request(method: "GET" | "POST" | "PATCH" | "DELETE", path: string, body: any): Promise<any>;
|
|
106
106
|
cancelTransaction(orderId: string): Promise<any>;
|
|
107
107
|
refundTransaction(orderId: string, payload: {
|
|
108
108
|
refund_key?: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -102,7 +102,7 @@ declare class MidtransClient {
|
|
|
102
102
|
sandbox: boolean;
|
|
103
103
|
} | ProviderConfig);
|
|
104
104
|
private getApiBaseUrl;
|
|
105
|
-
|
|
105
|
+
request(method: "GET" | "POST" | "PATCH" | "DELETE", path: string, body: any): Promise<any>;
|
|
106
106
|
cancelTransaction(orderId: string): Promise<any>;
|
|
107
107
|
refundTransaction(orderId: string, payload: {
|
|
108
108
|
refund_key?: string;
|
package/dist/index.js
CHANGED
|
@@ -611,29 +611,8 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
611
611
|
};
|
|
612
612
|
}
|
|
613
613
|
try {
|
|
614
|
-
const
|
|
615
|
-
const
|
|
616
|
-
method: "POST",
|
|
617
|
-
headers: {
|
|
618
|
-
"Content-Type": "application/json",
|
|
619
|
-
"Accept": "application/json",
|
|
620
|
-
"Authorization": authHeader
|
|
621
|
-
},
|
|
622
|
-
body: JSON.stringify(payload2)
|
|
623
|
-
});
|
|
624
|
-
const text = await response.text();
|
|
625
|
-
let data = null;
|
|
626
|
-
try {
|
|
627
|
-
data = JSON.parse(text);
|
|
628
|
-
} catch (e) {
|
|
629
|
-
}
|
|
630
|
-
if (!response.ok || !data) {
|
|
631
|
-
return {
|
|
632
|
-
success: false,
|
|
633
|
-
rawResponse: data || text,
|
|
634
|
-
error: data?.status_message || `HTTP error! Status: ${response.status} - ${text}`
|
|
635
|
-
};
|
|
636
|
-
}
|
|
614
|
+
const client = new MidtransClient(config);
|
|
615
|
+
const data = await client.request("POST", "/charge", payload2);
|
|
637
616
|
if (data.status_code === "201" || data.status_code === "200") {
|
|
638
617
|
const res = {
|
|
639
618
|
success: true,
|
|
@@ -701,29 +680,8 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
701
680
|
...params.providerParams
|
|
702
681
|
};
|
|
703
682
|
try {
|
|
704
|
-
const
|
|
705
|
-
const
|
|
706
|
-
method: "POST",
|
|
707
|
-
headers: {
|
|
708
|
-
"Content-Type": "application/json",
|
|
709
|
-
"Accept": "application/json",
|
|
710
|
-
"Authorization": authHeader
|
|
711
|
-
},
|
|
712
|
-
body: JSON.stringify(payload)
|
|
713
|
-
});
|
|
714
|
-
const text = await response.text();
|
|
715
|
-
let data = null;
|
|
716
|
-
try {
|
|
717
|
-
data = JSON.parse(text);
|
|
718
|
-
} catch (e) {
|
|
719
|
-
}
|
|
720
|
-
if (!response.ok || !data) {
|
|
721
|
-
return {
|
|
722
|
-
success: false,
|
|
723
|
-
rawResponse: data || text,
|
|
724
|
-
error: data?.error_messages?.[0] || `HTTP error! Status: ${response.status} - ${text}`
|
|
725
|
-
};
|
|
726
|
-
}
|
|
683
|
+
const client = new MidtransClient(config);
|
|
684
|
+
const data = await client.request("POST", url, payload);
|
|
727
685
|
if (data.token) {
|
|
728
686
|
return {
|
|
729
687
|
success: true,
|
|
@@ -951,37 +909,9 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
951
909
|
}
|
|
952
910
|
async checkTransaction(params, config) {
|
|
953
911
|
const { merchantOrderId } = params;
|
|
954
|
-
const { apiKey, sandbox } = config;
|
|
955
|
-
const url = `${this.getApiBaseUrl(sandbox)}/${merchantOrderId}/status`;
|
|
956
912
|
try {
|
|
957
|
-
const
|
|
958
|
-
const
|
|
959
|
-
method: "GET",
|
|
960
|
-
headers: {
|
|
961
|
-
"Content-Type": "application/json",
|
|
962
|
-
"Accept": "application/json",
|
|
963
|
-
"Authorization": authHeader
|
|
964
|
-
}
|
|
965
|
-
});
|
|
966
|
-
const text = await response.text();
|
|
967
|
-
let data = null;
|
|
968
|
-
try {
|
|
969
|
-
data = JSON.parse(text);
|
|
970
|
-
} catch (e) {
|
|
971
|
-
}
|
|
972
|
-
if (!response.ok || !data) {
|
|
973
|
-
return {
|
|
974
|
-
success: false,
|
|
975
|
-
orderId: merchantOrderId,
|
|
976
|
-
reference: "",
|
|
977
|
-
amount: 0,
|
|
978
|
-
statusCode: "",
|
|
979
|
-
status: "failed",
|
|
980
|
-
statusMessage: `HTTP error! Status: ${response.status}`,
|
|
981
|
-
error: `HTTP ${response.status} - ${text}`,
|
|
982
|
-
rawResponse: data || text
|
|
983
|
-
};
|
|
984
|
-
}
|
|
913
|
+
const client = new MidtransClient(config);
|
|
914
|
+
const data = await client.request("GET", `/${merchantOrderId}/status`, null);
|
|
985
915
|
const transactionStatus = data.transaction_status || "";
|
|
986
916
|
const fraudStatus = data.fraud_status || "";
|
|
987
917
|
let status = "pending";
|
|
@@ -1029,17 +959,20 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
1029
959
|
return new MidtransClient(config);
|
|
1030
960
|
}
|
|
1031
961
|
async probePaymentMethods(config) {
|
|
1032
|
-
const { apiKey, sandbox } = config;
|
|
1033
|
-
const baseUrl = sandbox ? "https://api.sandbox.midtrans.com/v2" : "https://api.midtrans.com/v2";
|
|
1034
|
-
const auth = Buffer.from(apiKey + ":").toString("base64");
|
|
1035
962
|
const probePayloads = {
|
|
1036
963
|
qris: { payment_type: "qris", qris: { acquirer: "gopay" } },
|
|
1037
964
|
gopay: { payment_type: "gopay", gopay: { enable_callback: true, callback_url: "https://example.com" } },
|
|
1038
965
|
shopeepay: { payment_type: "shopeepay", shopeepay: { callback_url: "https://example.com" } },
|
|
966
|
+
ovo: { payment_type: "ovo", ovo: { phone: "081234567890" } },
|
|
967
|
+
dana: { payment_type: "dana" },
|
|
968
|
+
linkaja: { payment_type: "linkaja" },
|
|
1039
969
|
bca: { payment_type: "bank_transfer", bank_transfer: { bank: "bca" } },
|
|
1040
970
|
bni: { payment_type: "bank_transfer", bank_transfer: { bank: "bni" } },
|
|
1041
971
|
bri: { payment_type: "bank_transfer", bank_transfer: { bank: "bri" } },
|
|
1042
972
|
cimb: { payment_type: "bank_transfer", bank_transfer: { bank: "cimb" } },
|
|
973
|
+
danamon: { payment_type: "bank_transfer", bank_transfer: { bank: "danamon" } },
|
|
974
|
+
bsi: { payment_type: "bank_transfer", bank_transfer: { bank: "bsi" } },
|
|
975
|
+
seabank: { payment_type: "bank_transfer", bank_transfer: { bank: "seabank" } },
|
|
1043
976
|
mandiri: { payment_type: "echannel", echannel: { bill_info1: "Payment", bill_info2: "Probe" } },
|
|
1044
977
|
permata: { payment_type: "permata" },
|
|
1045
978
|
alfamart: { payment_type: "cstore", cstore: { store: "alfamart", message: "Probe" } },
|
|
@@ -1051,6 +984,7 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
1051
984
|
}
|
|
1052
985
|
};
|
|
1053
986
|
const enabled = [];
|
|
987
|
+
const client = new MidtransClient(config);
|
|
1054
988
|
for (const [methodId, specificPayload] of Object.entries(probePayloads)) {
|
|
1055
989
|
try {
|
|
1056
990
|
const probeOrderId = `PROBE-${methodId}-${Date.now()}`;
|
|
@@ -1060,31 +994,11 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
1060
994
|
item_details: [{ id: probeOrderId, name: "Probe", price: 15e3, quantity: 1 }],
|
|
1061
995
|
customer_details: { first_name: "Probe", email: "probe@test.com" }
|
|
1062
996
|
};
|
|
1063
|
-
const
|
|
1064
|
-
method: "POST",
|
|
1065
|
-
headers: {
|
|
1066
|
-
"Content-Type": "application/json",
|
|
1067
|
-
"Accept": "application/json",
|
|
1068
|
-
"Authorization": `Basic ${auth}`
|
|
1069
|
-
},
|
|
1070
|
-
body: JSON.stringify(probeBody)
|
|
1071
|
-
});
|
|
1072
|
-
const text = await res.text();
|
|
1073
|
-
let result = null;
|
|
1074
|
-
try {
|
|
1075
|
-
result = JSON.parse(text);
|
|
1076
|
-
} catch (e) {
|
|
1077
|
-
}
|
|
997
|
+
const result = await client.request("POST", "/charge", probeBody);
|
|
1078
998
|
if (result && ["200", "201", "202"].includes(result.status_code)) {
|
|
1079
999
|
enabled.push(methodId);
|
|
1080
1000
|
try {
|
|
1081
|
-
await
|
|
1082
|
-
method: "POST",
|
|
1083
|
-
headers: {
|
|
1084
|
-
"Accept": "application/json",
|
|
1085
|
-
"Authorization": `Basic ${auth}`
|
|
1086
|
-
}
|
|
1087
|
-
});
|
|
1001
|
+
await client.cancelTransaction(probeOrderId);
|
|
1088
1002
|
} catch (e) {
|
|
1089
1003
|
}
|
|
1090
1004
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -569,29 +569,8 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
569
569
|
};
|
|
570
570
|
}
|
|
571
571
|
try {
|
|
572
|
-
const
|
|
573
|
-
const
|
|
574
|
-
method: "POST",
|
|
575
|
-
headers: {
|
|
576
|
-
"Content-Type": "application/json",
|
|
577
|
-
"Accept": "application/json",
|
|
578
|
-
"Authorization": authHeader
|
|
579
|
-
},
|
|
580
|
-
body: JSON.stringify(payload2)
|
|
581
|
-
});
|
|
582
|
-
const text = await response.text();
|
|
583
|
-
let data = null;
|
|
584
|
-
try {
|
|
585
|
-
data = JSON.parse(text);
|
|
586
|
-
} catch (e) {
|
|
587
|
-
}
|
|
588
|
-
if (!response.ok || !data) {
|
|
589
|
-
return {
|
|
590
|
-
success: false,
|
|
591
|
-
rawResponse: data || text,
|
|
592
|
-
error: data?.status_message || `HTTP error! Status: ${response.status} - ${text}`
|
|
593
|
-
};
|
|
594
|
-
}
|
|
572
|
+
const client = new MidtransClient(config);
|
|
573
|
+
const data = await client.request("POST", "/charge", payload2);
|
|
595
574
|
if (data.status_code === "201" || data.status_code === "200") {
|
|
596
575
|
const res = {
|
|
597
576
|
success: true,
|
|
@@ -659,29 +638,8 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
659
638
|
...params.providerParams
|
|
660
639
|
};
|
|
661
640
|
try {
|
|
662
|
-
const
|
|
663
|
-
const
|
|
664
|
-
method: "POST",
|
|
665
|
-
headers: {
|
|
666
|
-
"Content-Type": "application/json",
|
|
667
|
-
"Accept": "application/json",
|
|
668
|
-
"Authorization": authHeader
|
|
669
|
-
},
|
|
670
|
-
body: JSON.stringify(payload)
|
|
671
|
-
});
|
|
672
|
-
const text = await response.text();
|
|
673
|
-
let data = null;
|
|
674
|
-
try {
|
|
675
|
-
data = JSON.parse(text);
|
|
676
|
-
} catch (e) {
|
|
677
|
-
}
|
|
678
|
-
if (!response.ok || !data) {
|
|
679
|
-
return {
|
|
680
|
-
success: false,
|
|
681
|
-
rawResponse: data || text,
|
|
682
|
-
error: data?.error_messages?.[0] || `HTTP error! Status: ${response.status} - ${text}`
|
|
683
|
-
};
|
|
684
|
-
}
|
|
641
|
+
const client = new MidtransClient(config);
|
|
642
|
+
const data = await client.request("POST", url, payload);
|
|
685
643
|
if (data.token) {
|
|
686
644
|
return {
|
|
687
645
|
success: true,
|
|
@@ -909,37 +867,9 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
909
867
|
}
|
|
910
868
|
async checkTransaction(params, config) {
|
|
911
869
|
const { merchantOrderId } = params;
|
|
912
|
-
const { apiKey, sandbox } = config;
|
|
913
|
-
const url = `${this.getApiBaseUrl(sandbox)}/${merchantOrderId}/status`;
|
|
914
870
|
try {
|
|
915
|
-
const
|
|
916
|
-
const
|
|
917
|
-
method: "GET",
|
|
918
|
-
headers: {
|
|
919
|
-
"Content-Type": "application/json",
|
|
920
|
-
"Accept": "application/json",
|
|
921
|
-
"Authorization": authHeader
|
|
922
|
-
}
|
|
923
|
-
});
|
|
924
|
-
const text = await response.text();
|
|
925
|
-
let data = null;
|
|
926
|
-
try {
|
|
927
|
-
data = JSON.parse(text);
|
|
928
|
-
} catch (e) {
|
|
929
|
-
}
|
|
930
|
-
if (!response.ok || !data) {
|
|
931
|
-
return {
|
|
932
|
-
success: false,
|
|
933
|
-
orderId: merchantOrderId,
|
|
934
|
-
reference: "",
|
|
935
|
-
amount: 0,
|
|
936
|
-
statusCode: "",
|
|
937
|
-
status: "failed",
|
|
938
|
-
statusMessage: `HTTP error! Status: ${response.status}`,
|
|
939
|
-
error: `HTTP ${response.status} - ${text}`,
|
|
940
|
-
rawResponse: data || text
|
|
941
|
-
};
|
|
942
|
-
}
|
|
871
|
+
const client = new MidtransClient(config);
|
|
872
|
+
const data = await client.request("GET", `/${merchantOrderId}/status`, null);
|
|
943
873
|
const transactionStatus = data.transaction_status || "";
|
|
944
874
|
const fraudStatus = data.fraud_status || "";
|
|
945
875
|
let status = "pending";
|
|
@@ -987,17 +917,20 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
987
917
|
return new MidtransClient(config);
|
|
988
918
|
}
|
|
989
919
|
async probePaymentMethods(config) {
|
|
990
|
-
const { apiKey, sandbox } = config;
|
|
991
|
-
const baseUrl = sandbox ? "https://api.sandbox.midtrans.com/v2" : "https://api.midtrans.com/v2";
|
|
992
|
-
const auth = Buffer.from(apiKey + ":").toString("base64");
|
|
993
920
|
const probePayloads = {
|
|
994
921
|
qris: { payment_type: "qris", qris: { acquirer: "gopay" } },
|
|
995
922
|
gopay: { payment_type: "gopay", gopay: { enable_callback: true, callback_url: "https://example.com" } },
|
|
996
923
|
shopeepay: { payment_type: "shopeepay", shopeepay: { callback_url: "https://example.com" } },
|
|
924
|
+
ovo: { payment_type: "ovo", ovo: { phone: "081234567890" } },
|
|
925
|
+
dana: { payment_type: "dana" },
|
|
926
|
+
linkaja: { payment_type: "linkaja" },
|
|
997
927
|
bca: { payment_type: "bank_transfer", bank_transfer: { bank: "bca" } },
|
|
998
928
|
bni: { payment_type: "bank_transfer", bank_transfer: { bank: "bni" } },
|
|
999
929
|
bri: { payment_type: "bank_transfer", bank_transfer: { bank: "bri" } },
|
|
1000
930
|
cimb: { payment_type: "bank_transfer", bank_transfer: { bank: "cimb" } },
|
|
931
|
+
danamon: { payment_type: "bank_transfer", bank_transfer: { bank: "danamon" } },
|
|
932
|
+
bsi: { payment_type: "bank_transfer", bank_transfer: { bank: "bsi" } },
|
|
933
|
+
seabank: { payment_type: "bank_transfer", bank_transfer: { bank: "seabank" } },
|
|
1001
934
|
mandiri: { payment_type: "echannel", echannel: { bill_info1: "Payment", bill_info2: "Probe" } },
|
|
1002
935
|
permata: { payment_type: "permata" },
|
|
1003
936
|
alfamart: { payment_type: "cstore", cstore: { store: "alfamart", message: "Probe" } },
|
|
@@ -1009,6 +942,7 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
1009
942
|
}
|
|
1010
943
|
};
|
|
1011
944
|
const enabled = [];
|
|
945
|
+
const client = new MidtransClient(config);
|
|
1012
946
|
for (const [methodId, specificPayload] of Object.entries(probePayloads)) {
|
|
1013
947
|
try {
|
|
1014
948
|
const probeOrderId = `PROBE-${methodId}-${Date.now()}`;
|
|
@@ -1018,31 +952,11 @@ var MidtransProvider = class extends BasePaymentProvider {
|
|
|
1018
952
|
item_details: [{ id: probeOrderId, name: "Probe", price: 15e3, quantity: 1 }],
|
|
1019
953
|
customer_details: { first_name: "Probe", email: "probe@test.com" }
|
|
1020
954
|
};
|
|
1021
|
-
const
|
|
1022
|
-
method: "POST",
|
|
1023
|
-
headers: {
|
|
1024
|
-
"Content-Type": "application/json",
|
|
1025
|
-
"Accept": "application/json",
|
|
1026
|
-
"Authorization": `Basic ${auth}`
|
|
1027
|
-
},
|
|
1028
|
-
body: JSON.stringify(probeBody)
|
|
1029
|
-
});
|
|
1030
|
-
const text = await res.text();
|
|
1031
|
-
let result = null;
|
|
1032
|
-
try {
|
|
1033
|
-
result = JSON.parse(text);
|
|
1034
|
-
} catch (e) {
|
|
1035
|
-
}
|
|
955
|
+
const result = await client.request("POST", "/charge", probeBody);
|
|
1036
956
|
if (result && ["200", "201", "202"].includes(result.status_code)) {
|
|
1037
957
|
enabled.push(methodId);
|
|
1038
958
|
try {
|
|
1039
|
-
await
|
|
1040
|
-
method: "POST",
|
|
1041
|
-
headers: {
|
|
1042
|
-
"Accept": "application/json",
|
|
1043
|
-
"Authorization": `Basic ${auth}`
|
|
1044
|
-
}
|
|
1045
|
-
});
|
|
959
|
+
await client.cancelTransaction(probeOrderId);
|
|
1046
960
|
} catch (e) {
|
|
1047
961
|
}
|
|
1048
962
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@crediblemark/buayar",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Unified Payment Gateway SDK for Node.js and TypeScript supporting multiple providers",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"package.json",
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/crediblemark-official/Buayar.git"
|
|
24
|
+
},
|
|
21
25
|
"license": "MIT",
|
|
22
26
|
"scripts": {
|
|
23
27
|
"build": "tsup src/index.ts --format cjs,esm --dts",
|