- maib MIA QR API docs: https://docs.maibmerchants.md/mia-qr-api
- maib Request to Pay (RTP) API docs: https://docs.maibmerchants.md/request-to-pay
- GitHub project https://github.com/alexminza/maib-mia-sdk-php
- Composer package https://packagist.org/packages/alexminza/maib-mia-sdk
To easily install or upgrade to the latest release, use composer:
composer require alexminza/maib-mia-sdk
To enable logging add the monolog package:
composer require monolog/monolog
Import SDK:
require_once __DIR__ . '/vendor/autoload.php';
use Maib\MaibMia\MaibMiaClient;
Add project configuration:
$DEBUG = getenv('DEBUG');
$MAIB_MIA_BASE_URI = getenv('MAIB_MIA_BASE_URI');
$MAIB_MIA_CLIENT_ID = getenv('MAIB_MIA_CLIENT_ID');
$MAIB_MIA_CLIENT_SECRET = getenv('MAIB_MIA_CLIENT_SECRET');
$MAIB_MIA_SIGNATURE_KEY = getenv('MAIB_MIA_SIGNATURE_KEY');
Initialize client:
$options = [
'base_uri' => $MAIB_MIA_BASE_URI,
'timeout' => 15
];
if ($DEBUG) {
$logName = 'maib_mia_guzzle';
$logFileName = "$logName.log";
$log = new \Monolog\Logger($logName);
$log->pushHandler(new \Monolog\Handler\StreamHandler($logFileName, \Monolog\Logger::DEBUG));
$stack = \GuzzleHttp\HandlerStack::create();
$stack->push(\GuzzleHttp\Middleware::log($log, new \GuzzleHttp\MessageFormatter(\GuzzleHttp\MessageFormatter::DEBUG)));
$options['handler'] = $stack;
}
$guzzleClient = new \GuzzleHttp\Client($options);
$maibMiaClient = new MaibMiaClient($guzzleClient);
$tokenResponse = $maibMiaClient->getToken($MAIB_MIA_CLIENT_ID, $MAIB_MIA_CLIENT_SECRET);
$accessToken = $tokenResponse['result']['accessToken'];
$validityMinutes = 60;
$expiresAt = (new DateTime())->modify("+{$validityMinutes} minutes")->format('c');
$qrData = [
'type' => 'Dynamic',
'expiresAt' => $expiresAt,
'amountType' => 'Fixed',
'amount' => 50.00,
'currency' => 'MDL',
'description' => 'Order #123',
'orderId' => '123',
'callbackUrl' => 'https://example.com/callback',
'redirectUrl' => 'https://example.com/success'
];
$qrCreateResponse = $maibMiaClient->qrCreate($qrData, $accessToken);
$callbackBody = '{
"result": {
"qrId": "c3108b2f-6c2e-43a2-bdea-123456789012",
"extensionId": "3fe7f013-23a6-4d09-a4a4-123456789012",
"qrStatus": "Paid",
"payId": "eb361f48-bb39-45e2-950b-123456789012",
"referenceId": "MIA0001234567",
"orderId": "123",
"amount": 50.00,
"commission": 0.1,
"currency": "MDL",
"payerName": "TEST QR PAYMENT",
"payerIban": "MD88AG000000011621810140",
"executedAt": "2025-04-18T14:04:11.81145+00:00",
"terminalId": null
},
"signature": "fHM+l4L1ycFWZDRTh/Vr8oybq1Q1xySdjyvmFQCmZ4s="
}';
$callbackData = json_decode($callbackBody, true);
$validationResult = MaibMiaClient::validateCallbackSignature($callbackData, $MAIB_MIA_SIGNATURE_KEY);
$qrId = $qrCreateResponse['result']['qrId'];
$testPayData = [
'qrId' => $qrId,
'amount' => 50.00,
'iban' => 'MD88AG000000011621810140',
'currency' => 'MDL',
'payerName' => 'TEST QR PAYMENT'
];
$testPayResponse = $maibMiaClient->testPay($testPayData, $accessToken);
$payId = $testPayResponse['result']['payId'];
$paymentDetailsResponse = $maibMiaClient->paymentDetails($payId, $accessToken);
$refundData = [
'reason' => 'Test refund reason',
// 'amount' => 25.00, // Optional: for partial refund
// 'callbackUrl' => 'https://example.com/refund' // Optional
];
$paymentRefundResponse = $maibMiaClient->paymentRefund($payId, $refundData, $accessToken);
$validityMinutes = 60;
$expiresAt = (new DateTime())->modify("+{$validityMinutes} minutes")->format('c');
$rtpData = [
'alias' => '3736xxxxxxx',
'amount' => 150.00,
'expiresAt' => $expiresAt,
'currency' => 'MDL',
'description' => 'Invoice #123',
'orderId' => '123',
'terminalId' => 'P011111',
'callbackUrl' => 'https://example.com/callback',
'redirectUrl' => 'https://example.com/success'
];
$rtpCreateResponse = $maibMiaClient->rtpCreate($rtpData, $accessToken);