Your first payment in 5 minutes
You need: a Lango account (register here — sandbox keys are issued the moment you finish) and a terminal. Nothing else.
-
Copy your test key.
Dashboard → Developers. Test keys start with
sk_test_. They can never move real money. -
Create a payment.
The customer number below is a sandbox number that always approves.
Terminal window curl https://api.lango.co.zw/v1/payments \-H "Authorization: Bearer sk_test_YOUR_KEY" \-H "Idempotency-Key: quickstart-001" \-H "Content-Type: application/json" \-d '{"amount": 10000,"currency": "USD","method": "ecocash","reference": "QUICKSTART-1","customer": { "msisdn": "263771000001" }}'<?phprequire 'vendor/autoload.php'; // composer require lango/lango-php$lango = new \Lango\Client('sk_test_YOUR_KEY');$payment = $lango->payments->create(['amount' => 10000, // USD 100.00, in cents'currency' => 'USD','method' => 'ecocash','reference' => 'QUICKSTART-1','customer' => ['msisdn' => '263771000001'],], 'quickstart-001'); // the idempotency keyecho $payment->status; // "awaiting_customer"import Lango from '@lango/node' // npm install @lango/nodeconst lango = new Lango('sk_test_YOUR_KEY')const payment = await lango.payments.create({amount: 10000, // USD 100.00, in centscurrency: 'USD',method: 'ecocash',reference: 'QUICKSTART-1',customer: { msisdn: '263771000001' },},{ idempotencyKey: 'quickstart-001' },)console.log(payment.status) // "awaiting_customer"The response itemises every fee before anything is charged:
{"id": "pay_01J8XQ7M4K...","status": "awaiting_customer","currency": "USD","amount": 10000,"charged_amount": 10300,"merchant_net": 10000,"fees": [{ "type": "commission", "amount": 300, "bearer": "customer" }],"reference": "QUICKSTART-1","created_at": "2026-09-12T09:00:00.000Z"} -
Watch it complete.
In the sandbox,
...000001approves after a moment. Fetch the payment:Terminal window curl https://api.lango.co.zw/v1/payments/pay_01J8XQ7M4K... \-H "Authorization: Bearer sk_test_YOUR_KEY"statusis nowcompleted. Your dashboard’s Payments page shows the same payment with its full timeline. -
Hear about it without polling.
Add a webhook endpoint (Dashboard → Developers → Webhooks). Lango signs every delivery; verify the signature and you can trust the news:
{ "type": "payment.succeeded", "data": { "id": "pay_01J8XQ7M4K...", "amount": 10000 } }
That’s a working integration. Where to next:
- Real customers won’t all approve: test the failure modes with the other nine numbers.
- Read the unknown state before you write your retry logic — it prevents double charges.
- No website? Payment links collect without code.