diff --git a/packages/payment-providers/src/providers/waafi/waafi.provider.ts b/packages/payment-providers/src/providers/waafi/waafi.provider.ts index 8551f6086..dbd04c642 100644 --- a/packages/payment-providers/src/providers/waafi/waafi.provider.ts +++ b/packages/payment-providers/src/providers/waafi/waafi.provider.ts @@ -86,6 +86,21 @@ export class WaafiProvider implements PaymentProvider { requestBody, ); + // Waafi returns transaction info (params.status) ONLY when responseCode is 2001. For an + // unpaid or not-yet-existing transaction it returns an error envelope (e.g. 5001 / E10206 + // "Failed to get transaction info") with no status. Treat that as still-pending (PROCESSING), + // never terminal — so the intent keeps waiting for the webhook / its expiry rather than being + // wrongly resolved off a "no info" response. + if (response.responseCode !== WAAFI_SUCCESS_CODE) { + this.logger.debug( + `Waafi HPP_GETTRANINFO ${merchantOrderId}: ${response.responseCode}/${response.errorCode} ${response.responseMsg} — treating as pending`, + ); + return { + status: ProviderPaymentStatus.PROCESSING, + rawResponse: response as unknown as Record, + }; + } + const rawState = response.params?.status ?? response.params?.tranStatusDesc; const transactionId = response.params?.transactionId; const mapped = this.mapStatus(rawState);