diff --git a/src/TransactionCallbacks.php b/src/TransactionCallbacks.php index 6d68ffa..7944e2a 100644 --- a/src/TransactionCallbacks.php +++ b/src/TransactionCallbacks.php @@ -8,7 +8,6 @@ namespace safaricom\Mpesa; - /** * Class TransactionCallbacks * This class contains functions that will be used to obtain data from Mpesa callbacks @@ -17,338 +16,82 @@ class TransactionCallbacks { /** - * Use this function to process the B2B request callback - * @return string - */ - public static function processB2BRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultCode=$callbackData->Result->ResultCode; - $resultDesc=$callbackData->Result->ResultDesc; - $originatorConversationID=$callbackData->Result->OriginatorConversationID; - $conversationID=$callbackData->Result->ConversationID; - $transactionID=$callbackData->Result->TransactionID; - $transactionReceipt=$callbackData->Result->ResultParameters->ResultParameter[0]->Value; - $transactionAmount=$callbackData->Result->ResultParameters->ResultParameter[1]->Value; - $b2CWorkingAccountAvailableFunds=$callbackData->Result->ResultParameters->ResultParameter[2]->Value; - $b2CUtilityAccountAvailableFunds=$callbackData->Result->ResultParameters->ResultParameter[3]->Value; - $transactionCompletedDateTime=$callbackData->Result->ResultParameters->ResultParameter[4]->Value; - $receiverPartyPublicName=$callbackData->Result->ResultParameters->ResultParameter[5]->Value; - $B2CChargesPaidAccountAvailableFunds=$callbackData->Result->ResultParameters->ResultParameter[6]->Value; - $B2CRecipientIsRegisteredCustomer=$callbackData->Result->ResultParameters->ResultParameter[7]->Value; - - - $result=[ - "resultCode"=>$resultCode, - "resultDesc"=>$resultDesc, - "originatorConversationID"=>$originatorConversationID, - "conversationID"=>$conversationID, - "transactionID"=>$transactionID, - "transactionReceipt"=>$transactionReceipt, - "transactionAmount"=>$transactionAmount, - "b2CWorkingAccountAvailableFunds"=>$b2CWorkingAccountAvailableFunds, - "b2CUtilityAccountAvailableFunds"=>$b2CUtilityAccountAvailableFunds, - "transactionCompletedDateTime"=>$transactionCompletedDateTime, - "receiverPartyPublicName"=>$receiverPartyPublicName, - "B2CChargesPaidAccountAvailableFunds"=>$B2CChargesPaidAccountAvailableFunds, - "B2CRecipientIsRegisteredCustomer"=>$B2CRecipientIsRegisteredCustomer - ]; - - return json_encode($result); - } - - /** - * Use this function to process the B2C request callback - * @return string - */ - public static function processB2CRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultCode=$callbackData->Result->ResultCode; - $resultDesc=$callbackData->Result->ResultDesc; - $originatorConversationID=$callbackData->Result->OriginatorConversationID; - $conversationID=$callbackData->Result->ConversationID; - $transactionID=$callbackData->Result->TransactionID; - $initiatorAccountCurrentBalance=$callbackData->Result->ResultParameters->ResultParameter[0]->Value; - $debitAccountCurrentBalance=$callbackData->Result->ResultParameters->ResultParameter[1]->Value; - $amount=$callbackData->Result->ResultParameters->ResultParameter[2]->Value; - $debitPartyAffectedAccountBalance=$callbackData->Result->ResultParameters->ResultParameter[3]->Value; - $transCompletedTime=$callbackData->Result->ResultParameters->ResultParameter[4]->Value; - $debitPartyCharges=$callbackData->Result->ResultParameters->ResultParameter[5]->Value; - $receiverPartyPublicName=$callbackData->Result->ResultParameters->ResultParameter[6]->Value; - $currency=$callbackData->Result->ResultParameters->ResultParameter[7]->Value; - - $result=[ - "resultCode"=>$resultCode, - "resultDesc"=>$resultDesc, - "originatorConversationID"=>$originatorConversationID, - "conversationID"=>$conversationID, - "transactionID"=>$transactionID, - "initiatorAccountCurrentBalance"=>$initiatorAccountCurrentBalance, - "debitAccountCurrentBalance"=>$debitAccountCurrentBalance, - "amount"=>$amount, - "debitPartyAffectedAccountBalance"=>$debitPartyAffectedAccountBalance, - "transCompletedTime"=>$transCompletedTime, - "debitPartyCharges"=>$debitPartyCharges, - "receiverPartyPublicName"=>$receiverPartyPublicName, - "currency"=>$currency - ]; - - - return json_encode($result); - } - - /** - * Use this function to process the C2B Validation request callback - * @return string - */ - public static function processC2BRequestValidation(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $transactionType=$callbackData->TransactionType; - $transID=$callbackData->TransID; - $transTime=$callbackData->TransTime; - $transAmount=$callbackData->TransAmount; - $businessShortCode=$callbackData->BusinessShortCode; - $billRefNumber=$callbackData->BillRefNumber; - $invoiceNumber=$callbackData->InvoiceNumber; - $orgAccountBalance=$callbackData->OrgAccountBalance; - $thirdPartyTransID=$callbackData->ThirdPartyTransID; - $MSISDN=$callbackData->MSISDN; - $firstName=$callbackData->FirstName; - $middleName=$callbackData->MiddleName; - $lastName=$callbackData->LastName; - - $result=[ - $transTime=>$transTime, - $transAmount=>$transAmount, - $businessShortCode=>$businessShortCode, - $billRefNumber=>$billRefNumber, - $invoiceNumber=>$invoiceNumber, - $orgAccountBalance=>$orgAccountBalance, - $thirdPartyTransID=>$thirdPartyTransID, - $MSISDN=>$MSISDN, - $firstName=>$firstName, - $lastName=>$lastName, - $middleName=>$middleName, - $transID=>$transID, - $transactionType=>$transactionType - - ]; - - return json_encode($result); - - } - - /** - * Use this function to process the C2B Confirmation result callback - * @return string - */ - public static function processC2BRequestConfirmation(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $transactionType=$callbackData->TransactionType; - $transID=$callbackData->TransID; - $transTime=$callbackData->TransTime; - $transAmount=$callbackData->TransAmount; - $businessShortCode=$callbackData->BusinessShortCode; - $billRefNumber=$callbackData->BillRefNumber; - $invoiceNumber=$callbackData->InvoiceNumber; - $orgAccountBalance=$callbackData->OrgAccountBalance; - $thirdPartyTransID=$callbackData->ThirdPartyTransID; - $MSISDN=$callbackData->MSISDN; - $firstName=$callbackData->FirstName; - $middleName=$callbackData->MiddleName; - $lastName=$callbackData->LastName; - - $result=[ - $transTime=>$transTime, - $transAmount=>$transAmount, - $businessShortCode=>$businessShortCode, - $billRefNumber=>$billRefNumber, - $invoiceNumber=>$invoiceNumber, - $orgAccountBalance=>$orgAccountBalance, - $thirdPartyTransID=>$thirdPartyTransID, - $MSISDN=>$MSISDN, - $firstName=>$firstName, - $lastName=>$lastName, - $middleName=>$middleName, - $transID=>$transID, - $transactionType=>$transactionType - - ]; - - return json_encode($result); - } - - /** - * Use this function to process the Account Balance request callback - * @return string + * Read and decode JSON input data + * @return mixed */ - public static function processAccountBalanceRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultType=$callbackData->Result->ResultType; - $resultCode=$callbackData->Result->ResultCode; - $resultDesc=$callbackData->Result->ResultDesc; - $originatorConversationID=$callbackData->Result->OriginatorConversationID; - $conversationID=$callbackData->Result->ConversationID; - $transactionID=$callbackData->Result->TransactionID; - $accountBalance=$callbackData->Result->ResultParameters->ResultParameter[0]->Value; - $BOCompletedTime=$callbackData->Result->ResultParameters->ResultParameter[1]->Value; - - $result=[ - "resultDesc"=>$resultDesc, - "resultCode"=>$resultCode, - "originatorConversationID"=>$originatorConversationID, - "conversationID"=>$conversationID, - "transactionID"=>$transactionID, - "accountBalance"=>$accountBalance, - "BOCompletedTime"=>$BOCompletedTime, - "resultType"=>$resultType - ]; - - return json_encode($result); - - + private static function getCallbackData() { + $callbackJSONData = file_get_contents('php://input'); + return json_decode($callbackJSONData); } /** - * Use this function to process the Reversal request callback + * Handle errors in callback processing + * @param string $errorMessage * @return string */ - public static function processReversalRequestCallBack(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultType=$callbackData->Result->ResultType; - $resultCode=$callbackData->Result->ResultCode; - $resultDesc=$callbackData->Result->ResultDesc; - $originatorConversationID=$callbackData->Result->OriginatorConversationID; - $conversationID=$callbackData->Result->ConversationID; - $transactionID=$callbackData->Result->TransactionID; - - $result=[ - "resultType"=>$resultType, - "resultCode"=>$resultCode, - "resultDesc"=>$resultDesc, - "conversationID"=>$conversationID, - "transactionID"=>$transactionID, - "originatorConversationID"=>$originatorConversationID - ]; - - return json_encode($result); - + private static function handleError($errorMessage) { + return json_encode(['error' => $errorMessage]); } /** - * Use this function to process the STK push request callback + * Process callback data for a given set of parameters + * @param object $data + * @param array $params * @return string */ - public static function processSTKPushRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultCode=$callbackData->Body->stkCallback->ResultCode; - $resultDesc=$callbackData->Body->stkCallback->ResultDesc; - $merchantRequestID=$callbackData->Body->stkCallback->MerchantRequestID; - $checkoutRequestID=$callbackData->Body->stkCallback->CheckoutRequestID; - - $amount=$callbackData->stkCallback->Body->CallbackMetadata->Item[0]->Value; - $mpesaReceiptNumber=$callbackData->Body->stkCallback->CallbackMetadata->Item[1]->Value; - $balance=$callbackData->stkCallback->Body->CallbackMetadata->Item[2]->Value; - $b2CUtilityAccountAvailableFunds=$callbackData->Body->stkCallback->CallbackMetadata->Item[3]->Value; - $transactionDate=$callbackData->Body->stkCallback->CallbackMetadata->Item[4]->Value; - $phoneNumber=$callbackData->Body->stkCallback->CallbackMetadata->Item[5]->Value; - - $result=[ - "resultDesc"=>$resultDesc, - "resultCode"=>$resultCode, - "merchantRequestID"=>$merchantRequestID, - "checkoutRequestID"=>$checkoutRequestID, - "amount"=>$amount, - "mpesaReceiptNumber"=>$mpesaReceiptNumber, - "balance"=>$balance, - "b2CUtilityAccountAvailableFunds"=>$b2CUtilityAccountAvailableFunds, - "transactionDate"=>$transactionDate, - "phoneNumber"=>$phoneNumber - ]; - + private static function processCallback($data, $params) { + $result = []; + foreach ($params as $param) { + $value = $data; + foreach (explode('->', $param) as $key) { + if (isset($value->$key)) { + $value = $value->$key; + } else { + return self::handleError("Missing parameter: $param"); + } + } + $result[basename($param)] = $value; + } return json_encode($result); } /** - * Use this function to process the STK Push request callback + * Use this function to process the B2B request callback * @return string */ - public static function processSTKPushQueryRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $responseCode=$callbackData->ResponseCode; - $responseDescription=$callbackData->ResponseDescription; - $merchantRequestID=$callbackData->MerchantRequestID; - $checkoutRequestID=$callbackData->CheckoutRequestID; - $resultCode=$callbackData->ResultCode; - $resultDesc=$callbackData->ResultDesc; - - $result=[ - "resultCode"=>$resultCode, - "responseDescription"=>$responseDescription, - "responseCode"=>$responseCode, - "merchantRequestID"=>$merchantRequestID, - "checkoutRequestID"=>$checkoutRequestID, - "resultDesc"=>$resultDesc + public static function processB2BRequestCallback() { + $data = self::getCallbackData(); + $params = [ + 'Result->ResultCode', + 'Result->ResultDesc', + 'Result->OriginatorConversationID', + 'Result->ConversationID', + 'Result->TransactionID', + 'Result->ResultParameters->ResultParameter[0]->Value', + 'Result->ResultParameters->ResultParameter[1]->Value', + 'Result->ResultParameters->ResultParameter[2]->Value', + 'Result->ResultParameters->ResultParameter[3]->Value', + 'Result->ResultParameters->ResultParameter[4]->Value', + 'Result->ResultParameters->ResultParameter[5]->Value', + 'Result->ResultParameters->ResultParameter[6]->Value', + 'Result->ResultParameters->ResultParameter[7]->Value' ]; - - return json_encode($result); + return self::processCallback($data, $params); } /** - * Use this function to process the Transaction status request callback + * Use this function to process the B2C request callback * @return string */ - public static function processTransactionStatusRequestCallback(){ - $callbackJSONData=file_get_contents('php://input'); - $callbackData=json_decode($callbackJSONData); - $resultCode=$callbackData->Result->ResultCode; - $resultDesc=$callbackData->Result->ResultDesc; - $originatorConversationID=$callbackData->Result->OriginatorConversationID; - $conversationID=$callbackData->Result->ConversationID; - $transactionID=$callbackData->Result->TransactionID; - $ReceiptNo=$callbackData->Result->ResultParameters->ResultParameter[0]->Value; - $ConversationID=$callbackData->Result->ResultParameters->ResultParameter[1]->Value; - $FinalisedTime=$callbackData->Result->ResultParameters->ResultParameter[2]->Value; - $Amount=$callbackData->Result->ResultParameters->ResultParameter[3]->Value; - $TransactionStatus=$callbackData->Result->ResultParameters->ResultParameter[4]->Value; - $ReasonType=$callbackData->Result->ResultParameters->ResultParameter[5]->Value; - $TransactionReason=$callbackData->Result->ResultParameters->ResultParameter[6]->Value; - $DebitPartyCharges=$callbackData->Result->ResultParameters->ResultParameter[7]->Value; - $DebitAccountType=$callbackData->Result->ResultParameters->ResultParameter[8]->Value; - $InitiatedTime=$callbackData->Result->ResultParameters->ResultParameter[9]->Value; - $OriginatorConversationID=$callbackData->Result->ResultParameters->ResultParameter[10]->Value; - $CreditPartyName=$callbackData->Result->ResultParameters->ResultParameter[11]->Value; - $DebitPartyName=$callbackData->Result->ResultParameters->ResultParameter[12]->Value; - - $result=[ - "resultCode"=>$resultCode, - "resultDesc"=>$resultDesc, - "originatorConversationID"=>$originatorConversationID, - "conversationID"=>$conversationID, - "transactionID"=>$transactionID, - "ReceiptNo"=>$ReceiptNo, - "ConversationID"=>$ConversationID, - "FinalisedTime"=>$FinalisedTime, - "Amount"=>$Amount, - "TransactionStatus"=>$TransactionStatus, - "ReasonType"=>$ReasonType, - "TransactionReason"=>$TransactionReason, - "DebitPartyCharges"=>$DebitPartyCharges, - "DebitAccountType"=>$DebitAccountType, - "InitiatedTime"=>$InitiatedTime, - "OriginatorConversationID"=>$OriginatorConversationID, - "CreditPartyName"=>$CreditPartyName, - "DebitPartyName"=>$DebitPartyName - ]; - - return json_encode($result); - } - -} + public static function processB2CRequestCallback() { + $data = self::getCallbackData(); + $params = [ + 'Result->ResultCode', + 'Result->ResultDesc', + 'Result->OriginatorConversationID', + 'Result->ConversationID', + 'Result->TransactionID', + 'Result->ResultParameters->ResultParameter[0]->Value', + 'Result->ResultParameters->ResultParameter[1]->Value', + 'Result->ResultParameters->ResultParameter[2]->Value', + 'Result->ResultParameters->ResultParame