Skip to content

Dynamic QR

Generates a QR code M-Pesa app users scan to capture your till number and the amount, then authorise payment. Unlike most of Daraja, this one is synchronous — the code comes back in the response.

POST mpesa/qrcode/v1/generate
use Starnerz\LaravelDaraja\Enums\QrTransactionType;
$qr = Daraja::qr()->generate(
merchantName: 'Test Supermarket',
reference: 'INV-9',
amount: 1200,
type: QrTransactionType::BuyGoods,
size: 300,
);

The API returns base64 PNG data. Two helpers save you decoding it:

// Embed straight into a Blade view
<img src="{{ $qr->dataUri() }}" alt="Scan to pay">
// Or store the raw bytes
Storage::put("qr/{$invoice->id}.png", $qr->png());
Enum Code Meaning
QrTransactionType::BuyGoods BG Pay merchant (buy goods)
QrTransactionType::WithdrawAtAgent WA Withdraw cash at an agent till
QrTransactionType::PayBill PB Pay bill or business number
QrTransactionType::SendMoney SM Send money to a mobile number
QrTransactionType::SendToBusiness SB Send to business, CPI in MSISDN format

The credit party defaults to your configured short code. Override it when the QR should point somewhere else:

Daraja::qr()->generate('Shop', 'REF', 500,
QrTransactionType::PayBill,
creditPartyIdentifier: '174379',
);

Scanning produces an ordinary C2B payment, so the money arrives through your C2B confirmation URL. This API only makes the image.

Laravel Daraja is free and open source, maintained by eazysoft.

An independent open-source project, not affiliated with, endorsed by, or sponsored by Safaricom PLC or Laravel LLC. M-Pesa and Daraja are trademarks of Safaricom PLC; Laravel is a trademark of Laravel LLC. Used here only to say what this package works with.