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 Hali | Maana | Maelezo |
|---|---|---|
| 200 | OK | Ombi limefanikiwa |
| 201 | Created | Rasilimali imeundwa kwa mafanikio (malipo ya nje) |
| 400 | Bad Request | Vigezo vya ombi visivyo sahihi, kosa la uthibitishaji |
| 401 | Unauthorized | Uthibitishaji umeshindwa au tokeni imemalizika |
| 404 | Not Found | Rasilimali haipo, kiwango cha FX hakijawekwa |
| 409 | Conflict | businessReference iliyorudiwa |
| 412 | Precondition Failed | Fedha hazitoshi |
| 422 | Unprocessable Entity | Kosa la mantiki ya biashara (akaunti haifanyi kazi, QR iliyoharibika) |
Makosa ya Uthibitishaji (401)
Vitambulisho Visivyo Sahihi
{
"code": 0,
"error": "invalid credentials"
}Sababu:
apiKeyisiyo sahihiapiSecretisiyo 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
apiKeyinakosekana - Sehemu ya
apiSecretinakosekana apiKeyauapiSecretni tupu
Mzigo Usio Sahihi
{
"code": 0,
"error": "invalid payload"
}Sababu:
- JSON iliyoharibika
- Kichwa kibaya cha
Content-Type(lazima kiweapplication/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
qrStringinakosekana - 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 HTTP | Ujumbe wa Kosa | Sababu | Suluhisho |
|---|---|---|---|
| 400 | apiKey and apiSecret required | Vitambulisho vinakosekana | Toa apiKey na apiSecret |
| 400 | invalid payload | JSON iliyoharibika au Content-Type isiyo sahihi | Sahihisha JSON, tumia Content-Type: application/json |
| 400 | from and to are required | Vigezo vya FX vinakosekana | Toa sarafu zote za from na to |
| 400 | countryCode is required | countryCode inakosekana | Toa countryCode (KE, TZ, UG, ZA) |
| 400 | countryCode must be one of: KE, TZ, UG, ZA | countryCode isiyo sahihi | Tumia msimbo halali wa nchi |
| 400 | type must be “paybill” or “till” | type isiyo sahihi au inakosekana | Weka type kuwa “till” au “paybill” |
| 400 | lipaNumber is required | lipaNumber inakosekana | Toa nambari ya till/paybill |
| 400 | receiverPhone is required | receiverPhone inakosekana | Toa nambari ya simu kwa uhamishaji |
| 400 | receiverLipaNumber is required | receiverLipaNumber inakosekana | Toa nambari ya till/paybill kwa malipo |
| 400 | empty mobile number | phoneNumber inakosekana | Toa sehemu ya phoneNumber |
| 400 | phoneNumber must use correct international prefix | Muundo wa simu haulingani na nchi | Tumia muundo sahihi (mfano, +254… kwa KE) |
| 400 | purposeOfTransfer must be one of: […] | Thamani isiyo halali ya enum | Tumia thamani halali ya purposeOfTransfer |
| 400 | sourceOfFunds must be one of: […] | Thamani isiyo halali ya enum | Tumia thamani halali ya sourceOfFunds |
| 401 | invalid credentials | apiKey au apiSecret isiyo sahihi | Hakikisha vitambulisho |
| 401 | missing value in request header | Kichwa cha Authorization kinakosekana | Ongeza Authorization: Bearer YOUR_TOKEN |
| 401 | token is malformed | JWT isiyo sahihi | Omba tokeni mpya ya upatikanaji |
| 404 | rate XXX_YYY not configured | Kiwango cha FX hakijawekwa | Wasiliana na usaidizi au tumia sarafu nyingine |
| 404 | transaction not found | Muamala haupo | Hakikisha businessReference |
| 409 | duplicate reference | businessReference tayari imetumika | Tumia rejea ya kipekee |
| 412 | insufficient available balance | Fedha hazitoshi | Ongeza salio au punguza kiasi |
| 422 | account not active | Nambari isiyo ya majaribio katika TESTENV | Tumia nambari za majaribio katika TESTENV |
| 422 | unsupported or malformed QR payload | QR isiyo sahihi | Tumia 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
- Uthibitishaji — Makosa ya uthibitishaji na suluhisho
- Marejeo ya API — Majibu ya makosa mahsusi kwa kiungo