diff --git a/api/blueprints/finstitutions/payments/callback.py b/api/blueprints/finstitutions/payments/callback.py index 3599ef9..439e511 100644 --- a/api/blueprints/finstitutions/payments/callback.py +++ b/api/blueprints/finstitutions/payments/callback.py @@ -198,11 +198,12 @@ async def safaricom_m_pesa_express_callback( # Figure out which of the above codes is relevant to you: pg_reference_id = inbound_data["Body"]["stkCallback"]["CheckoutRequestID"] pg_result_code = int(inbound_data["Body"]["stkCallback"]["ResultCode"]) + pg_result_desc = inbound_data["Body"]["stkCallback"]["ResultDesc"] relevant_code = code_map.get( pg_result_code, { "status": "unknown", - "message": f"Unknown code '{pg_result_code}' from the payment gateway." + "message": f"Unknown code '{pg_result_code}' from the payment gateway. PG: '{pg_result_desc}'" } ) diff --git a/controllers/api/payment.py b/controllers/api/payment.py index ba0b237..5b120b4 100644 --- a/controllers/api/payment.py +++ b/controllers/api/payment.py @@ -231,6 +231,7 @@ class PaymentController: payment_id = payment_id, event = PaymentEvent( paymentStatus = "initiated" if client_response.success else "initFailed", + message = f"PG: {client_response.message}", initByPG = False, httpCode = client_response.httpCode, headers = await client_response.get_headers(), @@ -241,12 +242,12 @@ class PaymentController: # Done here: result.success = client_response.success and event_note_success - result.message = "; ".join([ - "payment requested successfully" if client_response.success - else f"payment request failed (PG: {client_response.message})", - "event noted successfully" if event_note_success - else "event noting failed", - ]) + result.message = " ".join([ + "Payment requested successfully." if client_response.success + else f"Payment request FAILED (PG: '{client_response.message}').", + " " if event_note_success + else "Event noting FAILED.", + ]).strip() return result async def request_payment( @@ -272,6 +273,7 @@ class PaymentController: payerNo = payment_request.payerNo, email = payment_request.email ), + lastEventMessage = "Payment Request Queued", lastPaymentStatus = "queued", tokenId = auth_token.authTokenId, amount = payment_request.amount, diff --git a/controllers/core/payment.py b/controllers/core/payment.py index d81cad8..6cbea46 100644 --- a/controllers/core/payment.py +++ b/controllers/core/payment.py @@ -317,8 +317,9 @@ class CorePaymentController(BaseModel): "events": event.model_dump() }, "$set": { - "lastEventTs": date_time.get_current_ist_date_time(as_string = False), - "lastPaymentStatus": event.paymentStatus + "lastEventTs": event.eventTs, + "lastEventMessage": event.message, + "lastPaymentStatus": event.paymentStatus, } } if client_reference_id: update_json["$set"]["clientPaymentReferenceId"] = client_reference_id @@ -354,7 +355,8 @@ class CorePaymentController(BaseModel): "events": event.model_dump() }, "$set": { - "lastEventTs": date_time.get_current_ist_date_time(as_string = False), + "lastEventTs": event.eventTs, + "lastEventMessage": event.message, "lastPaymentStatus": event.paymentStatus } } diff --git a/models/core/payment.py b/models/core/payment.py index f0acba4..4610e9c 100644 --- a/models/core/payment.py +++ b/models/core/payment.py @@ -235,6 +235,12 @@ class CorePaymentModel(BaseModel): default = None ) + lastEventMessage: str | None = Field( + description = "a short, human-readable message", + frozen = False, + default = None + ) + lastPaymentStatus: str = Field( description = "the status of the payment request to see what stage of the process we are in", frozen = False diff --git a/utils_v2/payments/safaricom/controllers/m_pesa_express.py b/utils_v2/payments/safaricom/controllers/m_pesa_express.py index e2052d7..147b225 100644 --- a/utils_v2/payments/safaricom/controllers/m_pesa_express.py +++ b/utils_v2/payments/safaricom/controllers/m_pesa_express.py @@ -346,12 +346,12 @@ class SafaricomMPesaExpress: ) # If the call failed: - if api_response.httpCode == 400: + if api_response.httpCode not in [200]: api_json = await api_response.get_json() api_response.message = f"{api_json['errorCode']} -> {api_json['errorMessage']}" # If the call failed: - if api_response.httpCode in [200]: + else: api_json = await api_response.get_json() success = True if str(api_json.get("ResponseCode")) == "0" else False api_response.message = api_json.get("ResponseDescription", "N/A")