1. Go to this page and download the library: Download ghanem/basata library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ghanem / basata example snippets
use Ghanem\Basata\Facades\Basata;
// Get all categories
$categories = Basata::getCategoryList();
// Get category service list
$categoryServices = Basata::getCategoryServiceList();
// Get the provider list (spec 5.1 takes no filter — the old $categoryId
// argument was accepted and silently ignored, and is gone in this release)
$providers = Basata::getProviderList();
// Get all services
$services = Basata::getServiceList();
// Get service input/output parameters
$inputParams = Basata::getServiceInputParameterList();
$outputParams = Basata::getServiceOutputParameterList();
// Transaction inquiry — account_number and service_id are
// BasataValidationException (code 1008) instead of silently defaulting.
$inquiry = Basata::transactionInquiry([
'account_number' => '12345',
'service_id' => 10,
'input_parameter_list' => [
['key' => 'phone', 'value' => '0912345678'],
],
]);
// Transaction payment — account_number, service_id, external_id, amount,
// total_amount and quantity are all transaction by external ID
$transaction = Basata::getTransaction('order-001', 'external_id');
use Ghanem\Basata\Enums\OperationStatus;
Basata::confirmPrepaidCardRecharge(
paymentTransactionId: $payment['data']['transaction_id'],
status: OperationStatus::Success, // or OperationStatus::Fail
);
// Get account info
$account = Basata::getAccountInfo();
// Get bills amount (performs an inquiry and returns the amount).
// Unlike transactionInquiry(), getBillsAmount() does NOT auto-fill
// service_version from getProviderList() — pass it yourself, or it throws
// BasataValidationException (code 1008).
$bills = Basata::getBillsAmount([
'service_version' => 0,
'service_id' => 10,
'account_number' => '12345',
]);
// Calculate service charge for an amount
$result = Basata::calculateServiceCharge([
'service_id' => 10,
'amount' => 100,
]);
// Returns: ['service_id' => 10, 'amount' => 100, 'service_charge' => 5, 'total_amount' => 105]
// Reverse calculate (from total amount back to base amount)
$result = Basata::calculateServiceChargeReverse([
'service_id' => 10,
'amount' => 105, // total amount including charge
]);
// Returns: ['service_id' => 10, 'amount' => 95.45, 'service_charge' => 9.55, 'total_amount' => 105]
use Ghanem\Basata\DTOs\ApiResponse;
use Ghanem\Basata\DTOs\TransactionResult;
use Ghanem\Basata\DTOs\ServiceChargeResult;
// API response DTO
$response = Basata::getCategoryListDto(); // returns ApiResponse
$response->success; // bool
$response->data; // array
$response->statusCode; // int
$response->get('categories.0.name'); // dot notation access
// Transaction DTO
$tx = Basata::getTransactionDto(123); // returns TransactionResult
$tx->transactionId; // int|string|null — the spec types transaction_id as a
// String, so it is passed through verbatim (never cast)
$tx->amount; // ?float
$tx->serviceCharge; // ?float
$tx->totalAmount; // ?float
$tx->raw; // the full `data` block
// GetTransactionDetails / GetTransactionByExternalId nest the record under
// `data.transaction_details` (a Transaction Detail, PDF 4.10) while
// TransactionInquiry / TransactionPayment return their fields flat in `data`.
// TransactionResult reads the nested record first and falls back to the flat
// level, so both shapes populate the same DTO. A Transaction Detail carries no
// transaction_id or service_charge, so those are null for the report actions —
// read the rest of the detail (status, provider_name, details_list, …) off
// `$tx->raw['transaction_details']`.
$inquiry = Basata::transactionInquiryDto($data); // TransactionResult
$payment = Basata::transactionPaymentDto($data); // TransactionResult
// Service charge DTO
$charge = Basata::calculateServiceChargeDto([
'service_id' => 10,
'amount' => 100,
]); // returns ServiceChargeResult
$charge->serviceId; // int
$charge->amount; // float
$charge->serviceCharge; // float
$charge->totalAmount; // float
use Ghanem\Basata\Exceptions\BasataException;
use Ghanem\Basata\Exceptions\BasataInsufficientBalanceException;
try {
Basata::transactionPayment($data);
} catch (BasataInsufficientBalanceException $e) {
// $e->apiCode — int, e.g. 1016
// $e->getMessage() — the API's message text
// $e->payload — array, the raw response body
} catch (BasataException $e) {
// catches every Basata exception — they all extend this base class
}
use Ghanem\Basata\Exceptions\BasataDuplicateTransactionIdException;
try {
$payment = Basata::transactionPayment($data); // $data['external_id'] = 'order-001'
} catch (BasataDuplicateTransactionIdException $e) {
// Do NOT re-submit with a new external_id — ask what happened first.
$existing = Basata::getTransaction('order-001', 'external_id');
$status = $existing['data']['transaction_details']['status'] ?? null;
// SUCCESS -> the payment went through; ERROR/DEPOSIT_ERROR -> it did not.
}
use Ghanem\Basata\Enums\TransactionStatus;
$transaction = Basata::getTransaction(123);
// GetTransactionDetails nests the record under `transaction_details`
// (spec 5.11) — NOT directly under `data`.
$status = TransactionStatus::from($transaction['data']['transaction_details']['status']);
if ($status->isFinal()) {
// stop polling
}
// Clear all cached data
Basata::clearCache();
// Clear specific cache key
Basata::clearCache('category_list_en');
use Ghanem\Basata\Events\BasataWebhookReceived;
use Ghanem\Basata\Events\TransactionStatusUpdated;
// Listen to all webhook events
Event::listen(BasataWebhookReceived::class, function ($event) {
// $event->event - event name (e.g. 'transaction.completed')
// $event->payload - full webhook payload
});
// Listen specifically to transaction status changes
Event::listen(TransactionStatusUpdated::class, function ($event) {
// $event->transactionId
// $event->status
// $event->payload
});