@crediblemark/buayar 0.1.7 → 0.1.8

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 CHANGED
@@ -3,26 +3,41 @@
3
3
  [![npm version](https://img.shields.io/npm/v/@crediblemark/buayar.svg?style=flat-square&color=amber)](https://www.npmjs.com/package/@crediblemark/buayar)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](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) dengan satu struktur API yang seragam.
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 invoice/transaksi serta verifikasi callback webhook dari berbagai penyedia layanan payment gateway.
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 (v2/inquiry) Duitku 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`, `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
- ## 📦 Instalasi
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 (e.g. Duitku)
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. Kalkulasi & Generate Signature
58
- SDK->>PG: 4. Inquiry Request (API)
59
- PG-->>SDK: 5. Kembalikan Payment URL & Ref
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 Halaman Pembayaran (Payment URL)
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 (untuk metode Bank VA)
225
- qrString?: string; // EMVCo QRIS payload mentah (untuk scan langsung)
226
- qrCodeUrl?: string; // Image URL QRIS dari Duitku
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
- private request;
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
- private request;
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 authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
615
- const response = await fetch(url2, {
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 authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
705
- const response = await fetch(url, {
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 authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
958
- const response = await fetch(url, {
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,9 +959,6 @@ 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" } },
@@ -1051,6 +978,7 @@ var MidtransProvider = class extends BasePaymentProvider {
1051
978
  }
1052
979
  };
1053
980
  const enabled = [];
981
+ const client = new MidtransClient(config);
1054
982
  for (const [methodId, specificPayload] of Object.entries(probePayloads)) {
1055
983
  try {
1056
984
  const probeOrderId = `PROBE-${methodId}-${Date.now()}`;
@@ -1060,31 +988,11 @@ var MidtransProvider = class extends BasePaymentProvider {
1060
988
  item_details: [{ id: probeOrderId, name: "Probe", price: 15e3, quantity: 1 }],
1061
989
  customer_details: { first_name: "Probe", email: "probe@test.com" }
1062
990
  };
1063
- const res = await fetch(`${baseUrl}/charge`, {
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
- }
991
+ const result = await client.request("POST", "/charge", probeBody);
1078
992
  if (result && ["200", "201", "202"].includes(result.status_code)) {
1079
993
  enabled.push(methodId);
1080
994
  try {
1081
- await fetch(`${baseUrl}/${probeOrderId}/cancel`, {
1082
- method: "POST",
1083
- headers: {
1084
- "Accept": "application/json",
1085
- "Authorization": `Basic ${auth}`
1086
- }
1087
- });
995
+ await client.cancelTransaction(probeOrderId);
1088
996
  } catch (e) {
1089
997
  }
1090
998
  }
package/dist/index.mjs CHANGED
@@ -569,29 +569,8 @@ var MidtransProvider = class extends BasePaymentProvider {
569
569
  };
570
570
  }
571
571
  try {
572
- const authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
573
- const response = await fetch(url2, {
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 authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
663
- const response = await fetch(url, {
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 authHeader = `Basic ${Buffer.from(apiKey + ":").toString("base64")}`;
916
- const response = await fetch(url, {
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,9 +917,6 @@ 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" } },
@@ -1009,6 +936,7 @@ var MidtransProvider = class extends BasePaymentProvider {
1009
936
  }
1010
937
  };
1011
938
  const enabled = [];
939
+ const client = new MidtransClient(config);
1012
940
  for (const [methodId, specificPayload] of Object.entries(probePayloads)) {
1013
941
  try {
1014
942
  const probeOrderId = `PROBE-${methodId}-${Date.now()}`;
@@ -1018,31 +946,11 @@ var MidtransProvider = class extends BasePaymentProvider {
1018
946
  item_details: [{ id: probeOrderId, name: "Probe", price: 15e3, quantity: 1 }],
1019
947
  customer_details: { first_name: "Probe", email: "probe@test.com" }
1020
948
  };
1021
- const res = await fetch(`${baseUrl}/charge`, {
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
- }
949
+ const result = await client.request("POST", "/charge", probeBody);
1036
950
  if (result && ["200", "201", "202"].includes(result.status_code)) {
1037
951
  enabled.push(methodId);
1038
952
  try {
1039
- await fetch(`${baseUrl}/${probeOrderId}/cancel`, {
1040
- method: "POST",
1041
- headers: {
1042
- "Accept": "application/json",
1043
- "Authorization": `Basic ${auth}`
1044
- }
1045
- });
953
+ await client.cancelTransaction(probeOrderId);
1046
954
  } catch (e) {
1047
955
  }
1048
956
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crediblemark/buayar",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
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",