UNPKG

@alsharie/kuraimiepay

Version:

TypeScript Node.js SDK for integrating with Kuraimi Bank E-Pay API for suppliers.

159 lines (118 loc) 6.63 kB
# Kuraimi Bank E-Pay SDK for Node.js (TypeScript) A TypeScript Node.js client library for integrating with the Kuraimi Bank E-Pay API. This SDK helps you (the Supplier) call Kuraimi Bank's APIs for E-Payment and Reversals. ## ❗ Crucial Pre-Integration Step: Supplier's Web API **Before you can successfully use the E-Payment features facilitated by this SDK (and by Kuraimi Bank's system), your system MUST expose a "Verify Customer details API".** As per Section 13 of the "Supplier Integration Guide and Technical Specification": * **Purpose:** Kuraimi Bank's E-Pay system will call this API (hosted by you, the supplier) to verify customer details registered on your platform. * **Your Responsibility:** 1. You need to develop and host an HTTP POST endpoint. 2. This endpoint will receive customer details (e.g., `SCustID`, `MobileNo`, `Email`, `CustomerZone`) from Kuraimi Bank. 3. Your API must validate these details against your customer database. 4. Your API must respond in the format specified in the Kuraimi Bank documentation , including a `Code` ("1" for success, others for failure) and the `SCustID` if verified. 5. You must provide Kuraimi Bank with: * The URL (Endpoint) for both UAT and Production environments. * Username and Password for Basic Authentication that Kuraimi Bank will use to call your API. * **Impact:** If this supplier-hosted API is not implemented, not reachable, or does not function correctly, customer verification will fail, and subsequent E-Payment transactions initiated via Kuraimi Bank's applications (KJ, Mfloos) for your services may not be possible. **This SDK (`@alsharie/kuraimiepay`) helps you call Kuraimi Bank's APIs. It does NOT implement the API that Kuraimi Bank calls on your system.** Ensure this separate integration requirement is met with Kuraimi Bank. ## Features (of this SDK) * Easy-to-use client for E-Payment and Reversal transactions (calling Kuraimi Bank). * Strongly typed interfaces for requests and responses. * Handles Basic Authentication for calls *to* Kuraimi Bank. * Automatic Base64 encoding for `PINPASS`. * Configurable for UAT and Production environments. * Uses `axios` for HTTP requests. * Written in TypeScript, compiled to JavaScript. ## Prerequisites (for using this SDK) * **Completion of the "Supplier's Web API" integration (see section above).** * Node.js (v14 or higher recommended) * TypeScript (v4.5 or higher recommended) * API Credentials (Username and Password) for *your supplier account* to call Kuraimi Bank's E-Pay APIs (provided by Kuraimi Bank). * UAT and Production Base URLs for Kuraimi Bank's E-Pay APIs. The UAT URL is included based on the document; the Production URL will need to be supplied during client initialization. ## Installation ```bash npm install @alsharie/kuraimiepay # or yarn add @alsharie/kuraimiepay ``` ## Usage ### 1. Initialize the Client ```typescript import KuraimiEPayClient from '@alsharie/kuraimiepay'; const apiClient = new KuraimiEPayClient({ username: 'YOUR_SUPPLIER_USERNAME', // Provided by Kuraimi Bank password: 'YOUR_SUPPLIER_PASSWORD', // Provided by Kuraimi Bank environment: 'UAT', // 'UAT' or 'PROD' // baseUrl: 'https://your-custom-or-prod-base-url.com' // Optional: if PROD URL is known or to override default }); ``` ### 2. Send an E-Payment Transaction ```typescript async function makePayment() { const paymentDetails: SendPaymentPayload = { SCustID: 'SCUST98765', REFNO: `TS_PAY${Date.now()}`, // Ensure this is unique AMOUNT: 150.75, MRCHNTNAME: 'My Online Store TS', PINPASS: '1234', // Customer's PIN }; try { const response: ApiResponse = await apiClient.sendPayment(paymentDetails); console.log('Payment Response:', response); if (response.CODE === 1 && response.ResultSet?.PH_REF_NO) { console.log('Payment successful! Bank Ref:', response.ResultSet.PH_REF_NO); } else { console.error(`Payment failed: ${response.MESSAGE} (Code: ${response.CODE})`); } } catch (error) { const apiError = error as ApiError; console.error('Error during payment:', apiError.data || apiError.message || apiError); if (apiError.statusCode) console.error('Status Code:', apiError.statusCode); } } makePayment(); ``` ### 3. Reverse an E-Payment Transaction ```typescript import { ReversePaymentPayload } from '@alsharie/kuraimiepay'; // Import additional types as needed async function reverseExistingPayment() { const reversalDetails: ReversePaymentPayload = { SCustID: 'SCUST98765', REFNO: 'TS_PAY1678886660000', // The REFNO of the transaction you want to reverse }; try { const response: ApiResponse = await apiClient.reversePayment(reversalDetails); console.log('Reversal Response:', response); if (response.CODE === 1) { console.log('Reversal request processed successfully.'); } else { console.error(`Reversal failed: ${response.MESSAGE} (Code: ${response.CODE})`); } } catch (error) { const apiError = error as ApiError; console.error('Error during reversal:', apiError.data || apiError.message || apiError); if (apiError.statusCode) console.error('Status Code:', apiError.statusCode); } } reverseExistingPayment(); ``` ## API Reference (Types) Key types are exported from the main module: * `KuraimiEPayClientOptions` * `SendPaymentPayload` * `ReversePaymentPayload` * `ApiResponse<T = ResultSet | null>` * `ApiError` * `ResultSet` Refer to the source code in `src/index.ts` for detailed type definitions. ## Error Handling The SDK methods return Promises. If an API call fails or a network error occurs, the Promise will be rejected with an `ApiError` object. This object typically includes: * `message` (string): A summary of the error. * `statusCode` (number, optional): The HTTP status code, if available. * `data` (ApiErrorResponseData, optional): The response body from the API, if available (this usually contains `CODE`, `MESSAGE`, `MESSAGEDESC` from Kuraimi Bank). * `originalError` (AxiosError | Error, optional): The underlying error object. Always wrap API calls in `try...catch` blocks. ## Contributing Contributions are welcome! Please open an issue or submit a pull request. ## License MIT