Ruka uende kwenye yaliyomoSkip to Content
HatiMarejeo ya makosa

Kushughulikia Makosa

Jifunze jinsi ya kushughulikia makosa kwa ufanisi unapounganisha na Wakapay API.

Muundo wa Jibu la Kosa

Wakapay API inatumia miundo miwili ya majibu ya kosa:

Muundo wa 1 — Kosa la Kawaida

{ "code": 0, "error": "error message here" }

Muundo wa 2 — Kosa la Uidhinishaji

{ "message": "error message here" }

Misimbo ya Hali ya HTTP

Wakapay inatumia misimbo ya kawaida ya hali ya HTTP:

Msimbo wa HaliMaanaMaelezo
200OKOmbi limefanikiwa
201CreatedRasilimali imeundwa kwa mafanikio (malipo ya nje)
400Bad RequestVigezo vya ombi visivyo sahihi, kosa la uthibitishaji
401UnauthorizedUthibitishaji umeshindwa au tokeni imemalizika
404Not FoundRasilimali haipo, kiwango cha FX hakijawekwa
409ConflictbusinessReference iliyorudiwa
412Precondition FailedFedha hazitoshi
422Unprocessable EntityKosa la mantiki ya biashara (akaunti haifanyi kazi, QR iliyoharibika)

Makosa ya Uthibitishaji (401)

Vitambulisho Visivyo Sahihi

{ "code": 0, "error": "invalid credentials" }

Sababu:

  • apiKey isiyo sahihi
  • apiSecret isiyo sahihi
  • Vitambulisho vimeghairiwa

Suluhisho: Hakikisha vitambulisho vyako vya API ni sahihi

Authorization Inakosekana

{ "message": "missing value in request header" }

Sababu: Hakuna kichwa cha Authorization: Bearer YOUR_TOKEN katika ombi

Suluhisho: Jumuisha kichwa cha Authorization na tokeni yako ya upatikanaji

Tokeni Iliyoharibika

{ "message": "token is malformed: token contains an invalid number of segments" }

Sababu:

  • Muundo wa JWT usio sahihi
  • Tokeni iliyomalizika
  • Tokeni iliyoharibika

Suluhisho: Omba tokeni mpya ya upatikanaji

Makosa ya Uthibitishaji wa Vigezo (400)

Vitambulisho Vinavyohitajika Vinakosekana

{ "code": 0, "error": "apiKey and apiSecret required" }

Sababu:

  • Sehemu ya apiKey inakosekana
  • Sehemu ya apiSecret inakosekana
  • apiKey au apiSecret ni tupu

Mzigo Usio Sahihi

{ "code": 0, "error": "invalid payload" }

Sababu:

  • JSON iliyoharibika
  • Kichwa kibaya cha Content-Type (lazima kiwe application/json)

Msimbo wa Nchi Unakosekana

{ "code": 0, "error": "countryCode is required" }
{ "code": 0, "error": "countryCode must be one of: KE, TZ, UG, ZA" }

Suluhisho: Toa countryCode halali: KE, TZ, UG, au ZA

Nambari ya Simu Inakosekana

{ "code": 0, "error": "empty mobile number" }

Suluhisho: Toa sehemu ya phoneNumber

Muundo wa Simu Usio Sahihi

{ "code": 0, "error": "phoneNumber must use the correct international prefix for the given countryCode" }

Suluhisho: Tumia muundo sahihi wa kimataifa (mfano, +254700000001 kwa Kenya)

Aina ya Malipo Isiyo Sahihi

{ "code": 0, "error": "type must be \"paybill\" or \"till\"" }

Suluhisho: Weka type kuwa “till” au “paybill”

Nambari ya Lipa Inakosekana

{ "code": 0, "error": "lipaNumber is required" }

Suluhisho: Toa sehemu ya lipaNumber kwa uthibitishaji wa till/paybill

Simu ya Mpokeaji Inakosekana

{ "code": 0, "error": "receiverPhone is required" }

Suluhisho: Toa sehemu ya receiverPhone kwa uhamishaji wa pesa za simu

Nambari ya Lipa ya Mpokeaji Inakosekana

{ "code": 0, "error": "receiverLipaNumber is required" }

Suluhisho: Toa sehemu ya receiverLipaNumber kwa malipo ya till/paybill

Madhumuni ya Uhamishaji Yasiyo Sahihi

{ "code": 0, "error": "purposeOfTransfer must be one of: [family_support, education, business_payment, medical, investment, construction, rent, general, fuel, repairs, gift, personal_care, food_and_groceries, transport, travel, shopping, entertainment, donations, other]" }

Thamani halali:

  • family_support, education, business_payment, medical, investment
  • construction, rent, general, fuel, repairs, gift, personal_care
  • food_and_groceries, transport, travel, shopping, entertainment
  • donations, other

Chanzo cha Fedha Kisicho Sahihi

{ "code": 0, "error": "sourceOfFunds must be one of: [salary, savings, business_income, sale_of_assets, investment_income, other]" }

Thamani halali: salary, savings, business_income, sale_of_assets, investment_income, other

Vigezo vya Kiwango cha FX Vinakosekana

{ "code": 0, "error": "from and to are required" }

Suluhisho: Toa misimbo yote ya sarafu ya from na to

Makosa ya Haipo (404)

Kiwango cha FX Hakijawekwa

{ "code": 0, "error": "rate USD_TZS not configured" }
{ "code": 0, "error": "rate USD_UGX not configured" }
{ "code": 0, "error": "rate USD_ZAR not configured" }
{ "code": 0, "error": "rate INVALID_KES not configured" }

Sababu: Kiwango cha FX cha jozi ya sarafu hakijawekwa katika akaunti yako

Suluhisho: Wasiliana na usaidizi wa Wakapay kuweka kiwango cha FX, au tumia jozi nyingine ya sarafu

Kumbuka: Katika TESTENV, USD→KES tu ndio iliyowekwa (kiwango: 129)

Muamala Haupo

{ "code": 0, "error": "transaction not found" }

Sababu: Muamala wenye businessReference uliyotoa haupo

Suluhisho: Hakikisha rejea ya muamala ni sahihi

Makosa ya Mgongano (409)

Rejea Iliyorudiwa

{ "code": 0, "error": "duplicate reference" }

Sababu: Muamala wenye businessReference hii tayari upo

Suluhisho: Tumia rejea ya kipekee kwa kila muamala (mfano, jumuisha muhuri wa muda au UUID)

Hali ya Awali Imeshindwa (412)

Salio Halitoshi

{ "code": 0, "error": "insufficient available balance" }

Sababu: Hakuna fedha za kutosha katika pochi kukamilisha muamala

Suluhisho: Ongeza salio kwenye pochi yako au punguza kiasi cha muamala

Chombo Kisichoshughulikiwa (422)

Akaunti Haifanyi Kazi

{ "code": 0, "error": "account not active" }

Sababu: Katika TESTENV, nambari za simu zisizo za majaribio zinarudisha kosa hili

Suluhisho:

  • Katika TESTENV: Tumia nambari za simu za majaribio (+254700000001, +255700000001)
  • Katika Uzalishaji: Uanzishaji wa akaunti unaweza kuhitajika

Mzigo wa QR Usioungwa Mkono

{ "code": 0, "error": "unsupported or malformed QR payload" }

Sababu:

  • Muundo wa QR usio sahihi
  • Sehemu ya qrString inakosekana
  • QR haifuati EMV

Suluhisho: Hakikisha QR ni muundo halali wa EMV kutoka kwa mitandao inayoungwa mkono

Mbinu Bora za Kushughulikia Makosa

1. Angalia Hali ya Jibu

const response = await fetch("https://api.test.wakapay.io/business/balance", { headers: { Authorization: "Bearer YOUR_ACCESS_TOKEN" }, }); if (!response.ok) { const errorData = await response.json(); console.error("Error " + response.status + ":", errorData); throw new Error(errorData.error || errorData.message); } const data = await response.json(); console.log("Success:", data);

2. Tekeleza Mantiki ya Kujaribu Tena

async function makeRequestWithRetry(url, options, maxRetries = 3) { for (let attempt = 1; attempt <= maxRetries; attempt++) { try { const response = await fetch(url, options); const data = await response.json(); if (response.ok) { return data; } // Don't retry on client errors (4xx except 429) if ( response.status >= 400 && response.status < 500 && response.status !== 429 ) { throw new Error(data.error || data.message); } // Retry on server errors (5xx) and rate limits (429) if (attempt < maxRetries) { const delay = Math.min(1000 * Math.pow(2, attempt), 10000); await new Promise((resolve) => setTimeout(resolve, delay)); continue; } throw new Error(data.error || data.message); } catch (error) { if (attempt === maxRetries) { throw error; } } } }

3. Shughulikia Misimbo Maalum ya Makosa

async function sendPayout(payoutData) { try { const response = await fetch("/business/payout/transfer", { method: "POST", headers: { Authorization: "Bearer YOUR_ACCESS_TOKEN", "Content-Type": "application/json", }, body: JSON.stringify(payoutData), }); const data = await response.json(); if (!response.ok) { const errorMessage = data.error || data.message; switch (true) { case errorMessage.includes("insufficient available balance"): console.error("Insufficient balance - notify admin"); throw new Error("Unable to process: insufficient funds"); case errorMessage.includes("duplicate reference"): console.error("Duplicate reference detected"); throw new Error("Transaction already exists"); case errorMessage.includes("rate") && errorMessage.includes("not configured"): console.error("FX rate not configured"); throw new Error("Currency pair not supported"); case errorMessage.includes("account not active"): console.error("Account not active - use test numbers in TESTENV"); throw new Error("Recipient account not active"); case errorMessage === "missing value in request header": console.error("Authentication required"); throw new Error("Please authenticate"); default: throw new Error(errorMessage); } } return data; } catch (error) { console.error("Payout failed:", error); throw error; } }

4. Weka Kumbukumbu za Makosa Vizuri

function logError(error, context = {}) { const errorLog = { timestamp: new Date().toISOString(), error: error.message, context: context, }; console.error("API Error:", JSON.stringify(errorLog, null, 2)); // Send to error tracking service in production if (process.env.NODE_ENV === "production") { // errorTracker.captureException(error, { extra: context }); } } try { await sendPayout(payoutData); } catch (error) { logError(error, { operation: "sendPayout", reference: payoutData.businessReference, amount: payoutData.amount, }); }

5. Toa Ujumbe Rafiki kwa Mtumiaji

function getUserFriendlyErrorMessage(error) { const errorMessage = error.message; const errorMap = { "insufficient available balance": "Unable to process payment due to insufficient funds. Please contact support.", "duplicate reference": "This transaction has already been processed.", "account not active": "Recipient account is not active. Please verify recipient details.", rate: "Currency conversion not available for this currency pair.", "transaction not found": "Transaction not found. Please check the reference.", "missing value in request header": "Authentication required. Please log in again.", "invalid credentials": "Invalid credentials. Please check your API keys.", "unsupported or malformed QR payload": "Invalid QR code. Please scan again.", "phoneNumber must use the correct international prefix": "Invalid phone number format. Use international format (e.g., +254700000001).", "countryCode must be one of": "Invalid country code. Supported: KE, TZ, UG, ZA.", }; for (const [key, message] of Object.entries(errorMap)) { if (errorMessage.includes(key)) { return message; } } return "An error occurred. Please try again or contact support."; }

Jedwali Kamili la Marejeo ya Makosa

Hali ya HTTPUjumbe wa KosaSababuSuluhisho
400apiKey and apiSecret requiredVitambulisho vinakosekanaToa apiKey na apiSecret
400invalid payloadJSON iliyoharibika au Content-Type isiyo sahihiSahihisha JSON, tumia Content-Type: application/json
400from and to are requiredVigezo vya FX vinakosekanaToa sarafu zote za from na to
400countryCode is requiredcountryCode inakosekanaToa countryCode (KE, TZ, UG, ZA)
400countryCode must be one of: KE, TZ, UG, ZAcountryCode isiyo sahihiTumia msimbo halali wa nchi
400type must be “paybill” or “till”type isiyo sahihi au inakosekanaWeka type kuwa “till” au “paybill”
400lipaNumber is requiredlipaNumber inakosekanaToa nambari ya till/paybill
400receiverPhone is requiredreceiverPhone inakosekanaToa nambari ya simu kwa uhamishaji
400receiverLipaNumber is requiredreceiverLipaNumber inakosekanaToa nambari ya till/paybill kwa malipo
400empty mobile numberphoneNumber inakosekanaToa sehemu ya phoneNumber
400phoneNumber must use correct international prefixMuundo wa simu haulingani na nchiTumia muundo sahihi (mfano, +254… kwa KE)
400purposeOfTransfer must be one of: […]Thamani isiyo halali ya enumTumia thamani halali ya purposeOfTransfer
400sourceOfFunds must be one of: […]Thamani isiyo halali ya enumTumia thamani halali ya sourceOfFunds
401invalid credentialsapiKey au apiSecret isiyo sahihiHakikisha vitambulisho
401missing value in request headerKichwa cha Authorization kinakosekanaOngeza Authorization: Bearer YOUR_TOKEN
401token is malformedJWT isiyo sahihiOmba tokeni mpya ya upatikanaji
404rate XXX_YYY not configuredKiwango cha FX hakijawekwaWasiliana na usaidizi au tumia sarafu nyingine
404transaction not foundMuamala haupoHakikisha businessReference
409duplicate referencebusinessReference tayari imetumikaTumia rejea ya kipekee
412insufficient available balanceFedha hazitoshiOngeza salio au punguza kiasi
422account not activeNambari isiyo ya majaribio katika TESTENVTumia nambari za majaribio katika TESTENV
422unsupported or malformed QR payloadQR isiyo sahihiTumia QR halali ya EMV

Kujaribu Hali za Makosa

Tumia hali hizi kujaribu kushughulikia kwako makosa katika TESTENV:

Jaribu Vitambulisho Visivyo Sahihi

curl -X POST https://api.test.wakapay.io/business/auth \ -H "Content-Type: application/json" \ -d '{"apiKey":"invalid","apiSecret":"wrong"}' # Inarudisha: {"code":0,"error":"invalid credentials"}

Jaribu Rejea Iliyorudiwa

# Tuma businessReference sawa mara mbili curl -X POST https://api.test.wakapay.io/business/payout/transfer \ -H "Authorization: Bearer TOKEN" \ -H "Content-Type: application/json" \ -d '{"businessReference":"SAME-REF-001",...}' # Simu ya pili inarudisha: {"code":0,"error":"duplicate reference"}

Jaribu Akaunti Haifanyi Kazi

# Tumia nambari ya simu isiyo ya majaribio curl -X POST https://api.test.wakapay.io/business/payout/transfer \ -H "Authorization: Bearer TOKEN" \ -H "Content-Type: application/json" \ -d '{"receiverPhone":"+254712345678",...}' # Inarudisha: {"code":0,"error":"account not active"}

Jaribu Kiwango cha FX Hakijawekwa

curl "https://api.test.wakapay.io/business/rate?from=USD&to=TZS" \ -H "Authorization: Bearer TOKEN" # Inarudisha: {"code":0,"error":"rate USD_TZS not configured"}

Yanayohusiana

Imesasishwa mwisho tarehe