From f5156bcd9a5c2a069962c9d4c3d1a8f670640b67 Mon Sep 17 00:00:00 2001 From: Sam Arossi Maosa Date: Wed, 24 Jun 2020 08:38:51 +0300 Subject: [PATCH] (minor): Reversals Implementation - Added a function to encrypt initiator password using the safaricom public certs. - Added safaricom cert vendor publishes - Added default config to vendor publishes - Abstracted the reverseTransaction method that will be used to reverse transactions (WIP) --- certs/live.cer | 38 +++++++++++++++++++++++++++++++++++ certs/sandbox.cer | 35 ++++++++++++++++++++++++++++++++ config/config.php | 8 ++++++-- src/Daraja.php | 36 +++++++++++++++++++++++++++++++-- src/DarajaServiceProvider.php | 5 +++++ 5 files changed, 118 insertions(+), 4 deletions(-) create mode 100644 certs/live.cer create mode 100644 certs/sandbox.cer diff --git a/certs/live.cer b/certs/live.cer new file mode 100644 index 0000000..0db2e0b --- /dev/null +++ b/certs/live.cer @@ -0,0 +1,38 @@ +-----BEGIN CERTIFICATE----- +MIIGkzCCBXugAwIBAgIKXfBp5gAAAD+hNjANBgkqhkiG9w0BAQsFADBbMRMwEQYK +CZImiZPyLGQBGRYDbmV0MRkwFwYKCZImiZPyLGQBGRYJc2FmYXJpY29tMSkwJwYD +VQQDEyBTYWZhcmljb20gSW50ZXJuYWwgSXNzdWluZyBDQSAwMjAeFw0xNzA0MjUx +NjA3MjRaFw0xODAzMjExMzIwMTNaMIGNMQswCQYDVQQGEwJLRTEQMA4GA1UECBMH +TmFpcm9iaTEQMA4GA1UEBxMHTmFpcm9iaTEaMBgGA1UEChMRU2FmYXJpY29tIExp +bWl0ZWQxEzARBgNVBAsTClRlY2hub2xvZ3kxKTAnBgNVBAMTIGFwaWdlZS5hcGlj +YWxsZXIuc2FmYXJpY29tLmNvLmtlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAoknIb5Tm1hxOVdFsOejAs6veAai32Zv442BLuOGkFKUeCUM2s0K8XEsU +t6BP25rQGNlTCTEqfdtRrym6bt5k0fTDscf0yMCoYzaxTh1mejg8rPO6bD8MJB0c +FWRUeLEyWjMeEPsYVSJFv7T58IdAn7/RhkrpBl1dT7SmIZfNVkIlD35+Cxgab+u7 ++c7dHh6mWguEEoE3NbV7Xjl60zbD/Buvmu6i9EYz+27jNVPI6pRXHvp+ajIzTSsi +eD8Ztz1eoC9mphErasAGpMbR1sba9bM6hjw4tyTWnJDz7RdQQmnsW1NfFdYdK0qD +RKUX7SG6rQkBqVhndFve4SDFRq6wvQIDAQABo4IDJDCCAyAwHQYDVR0OBBYEFG2w +ycrgEBPFzPUZVjh8KoJ3EpuyMB8GA1UdIwQYMBaAFOsy1E9+YJo6mCBjug1evuh5 +TtUkMIIBOwYDVR0fBIIBMjCCAS4wggEqoIIBJqCCASKGgdZsZGFwOi8vL0NOPVNh +ZmFyaWNvbSUyMEludGVybmFsJTIwSXNzdWluZyUyMENBJTIwMDIsQ049U1ZEVDNJ +U1NDQTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2 +aWNlcyxDTj1Db25maWd1cmF0aW9uLERDPXNhZmFyaWNvbSxEQz1uZXQ/Y2VydGlm +aWNhdGVSZXZvY2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1 +dGlvblBvaW50hkdodHRwOi8vY3JsLnNhZmFyaWNvbS5jby5rZS9TYWZhcmljb20l +MjBJbnRlcm5hbCUyMElzc3VpbmclMjBDQSUyMDAyLmNybDCCAQkGCCsGAQUFBwEB +BIH8MIH5MIHJBggrBgEFBQcwAoaBvGxkYXA6Ly8vQ049U2FmYXJpY29tJTIwSW50 +ZXJuYWwlMjBJc3N1aW5nJTIwQ0ElMjAwMixDTj1BSUEsQ049UHVibGljJTIwS2V5 +JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlvbixEQz1zYWZh +cmljb20sREM9bmV0P2NBQ2VydGlmaWNhdGU/YmFzZT9vYmplY3RDbGFzcz1jZXJ0 +aWZpY2F0aW9uQXV0aG9yaXR5MCsGCCsGAQUFBzABhh9odHRwOi8vY3JsLnNhZmFy +aWNvbS5jby5rZS9vY3NwMAsGA1UdDwQEAwIFoDA9BgkrBgEEAYI3FQcEMDAuBiYr +BgEEAYI3FQiHz4xWhMLEA4XphTaE3tENhqCICGeGwcdsg7m5awIBZAIBDDAdBgNV +HSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwEwJwYJKwYBBAGCNxUKBBowGDAKBggr +BgEFBQcDAjAKBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOCAQEAC/hWx7KTwSYr +x2SOyyHNLTRmCnCJmqxA/Q+IzpW1mGtw4Sb/8jdsoWrDiYLxoKGkgkvmQmB2J3zU +ngzJIM2EeU921vbjLqX9sLWStZbNC2Udk5HEecdpe1AN/ltIoE09ntglUNINyCmf +zChs2maF0Rd/y5hGnMM9bX9ub0sqrkzL3ihfmv4vkXNxYR8k246ZZ8tjQEVsKehE +dqAmj8WYkYdWIHQlkKFP9ba0RJv7aBKb8/KP+qZ5hJip0I5Ey6JJ3wlEWRWUYUKh +gYoPHrJ92ToadnFCCpOlLKWc0xVxANofy6fqreOVboPO0qTAYpoXakmgeRNLUiar +0ah6M/q/KA== +-----END CERTIFICATE----- diff --git a/certs/sandbox.cer b/certs/sandbox.cer new file mode 100644 index 0000000..94eb486 --- /dev/null +++ b/certs/sandbox.cer @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIGKzCCBROgAwIBAgIQDL7NH8cxSdUpl0ihH0A1wTANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMScwJQYDVQQDEx5E +aWdpQ2VydCBTSEEyIFNlY3VyZSBTZXJ2ZXIgQ0EwHhcNMTgwODI3MDAwMDAwWhcN +MTkwNDA0MTIwMDAwWjBuMQswCQYDVQQGEwJLRTEQMA4GA1UEBxMHTmFpcm9iaTEW +MBQGA1UEChMNU2FmYXJpY29tIFBMQzETMBEGA1UECxMKRGlnaXRhbCBJVDEgMB4G +A1UEAxMXc2FuZGJveC5zYWZhcmljb20uY28ua2UwggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQC78yeC/wLoZY6TJeqc4g/9eAKIpeCwEsjX09pD8ZxAGXqT +Oi7ssdIGJBPmJZNeEVyf8ocFhisCuLngJ9Z5e/AvH52PhrEFmVu2D03zSf4C+rhZ +ndEKP6G79pUAb/bemOliU9zM8xYYkpCRzPWUzk6zSDarg0ZDLw5FrtZj/VJ9YEDL +WGgAfwExEgSN3wjyUlJ2UwI3wqQXLka0VNFWoZxUH5j436gbSWRIL6NJUmrq8V8S +aTEPz3eJHj3NOToDu245c7VKdF/KExyZjRjD2p5I+Aip80TXzKlZj6DjMb3DlfXF +Hsnu0+1uJE701mvKX7BiscxKr8tCRphL63as4dqvAgMBAAGjggLkMIIC4DAfBgNV +HSMEGDAWgBQPgGEcgjFh1S8o541GOLQs4cbZ4jAdBgNVHQ4EFgQUzZmY7ZORLw9w +qRbAQN5m9lJ28qMwIgYDVR0RBBswGYIXc2FuZGJveC5zYWZhcmljb20uY28ua2Uw +DgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBr +BgNVHR8EZDBiMC+gLaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc3NjYS1z +aGEyLWc2LmNybDAvoC2gK4YpaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NzY2Et +c2hhMi1nNi5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAQEwKjAoBggrBgEFBQcC +ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBAgIwfAYIKwYB +BQUHAQEEcDBuMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20w +RgYIKwYBBQUHMAKGOmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2Vy +dFNIQTJTZWN1cmVTZXJ2ZXJDQS5jcnQwCQYDVR0TBAIwADCCAQUGCisGAQQB1nkC +BAIEgfYEgfMA8QB2AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAAB +ZXs1FvEAAAQDAEcwRQIgBzVMkm7SNprjJ1GBqiXIc9rNzY+y7gt6s/O02oMkyFoC +IQDBuThGlpmUKpeZoHhK6HGwB4jDMIecmKaOcMS18R2jxwB3AId1v+dZfPiMQ5lf +vfNu/1aNR1Y2/0q1YMG06v9eoIMPAAABZXs1F8IAAAQDAEgwRgIhAIRq2XFiC+RS +uDCYq8ICJg0QafSV+e9BLpJnElEdaSjiAiEAyiiW4vxwv4cWcAXE6FAipctyUBs6 +bE5QyaCnmNpoDiQwDQYJKoZIhvcNAQELBQADggEBAB0YoWve9Sxhb0PBS3Hc46Rf +a7H1jhHuwE+UyscSQsdJdk8uPAgDuKRZMvJPGEaCkNHm36NfcaXXFjPOl7LI1d1a +9zqSP0xeZBI6cF0x96WuQGrI9/WR2tfxjmaUSp8a/aJ6n+tZA28eJZNPrIaMm+6j +gh7AkKnqcf+g8F/MvCCVdNAiVMdz6UpCscf6BRPHNZ5ifvChGh7aUKjrVLLuF4Ls +HE05qm6HNyV5eTa6wvcbc4ewguN1UDZvPWetSyfBk10Wbpor4znQ4TJ3Y9uCvsJH +41ldblDvZZ2z4kB2UYQ7iBkPlJSxSOaFgW/GGDXq49sz/995xzhVITHxh2SdLkI= +-----END CERTIFICATE----- diff --git a/config/config.php b/config/config.php index 48d0ee9..e5275d4 100644 --- a/config/config.php +++ b/config/config.php @@ -4,5 +4,9 @@ * You can place your custom package configuration in here. */ return [ - -]; \ No newline at end of file + "mpesa" => [ + "cert_path" => storage_path("mpesa"), + "live_cert_name" => "live.cer", + "sandbox_cert_name" => "sandbox.cer" + ] +]; diff --git a/src/Daraja.php b/src/Daraja.php index d60f833..70a5da0 100644 --- a/src/Daraja.php +++ b/src/Daraja.php @@ -156,7 +156,40 @@ public function registerCallbacks($shortCode,$confirmationURL, $validationURL=nu } /** - * Use this function to initiate a reversal request + * Generate an encrypted security credential from the initiator password on either live or sandbox env. + * @param string $initiatorPassword + * @param string $env live|sandbox + */ + public function encryptInitiatorPassword($initiatorPassword, $env="sandbox") { + if (!in_array($env,["live", "sandbox"])) { + throw new \Exception("Environment must be either live or sandbox"); + } + $publicKey = config('daraja.mpesa.cert_path')."/".config('daraja.mpesa.'.$env.'_cert_name'); + openssl_public_encrypt($initiatorPassword, $encrypted, $publicKey, OPENSSL_PKCS1_PADDING); + return base64_encode($encrypted); + } + + /** + * Use this function to initiate a reversal request. This is an abstracted function that takes care of SecurityCredential Generation + * @param $Initiator | The name of Initiator to initiating the request + * @param $InitiatorPassword | Plain Text Initiator Password for generating the security credential + * @param $TransactionID | Unique Id received with every transaction response. + * @param $Amount | Amount + * @param $ReceiverParty | Organization /MSISDN sending the transaction + * @param $ResultURL | The path that stores information of transaction + * @param $QueueTimeOutURL | The path that stores information of time out transaction + * @param $Remarks | Comments that are sent along with the transaction. + * @param $Occasion | Optional Parameter + * @return mixed|string + */ + public function reverseTransaction($Initiator, $InitiatorPassword, $TransactionID, $Amount, $ReceiverParty, $ResultURL, $QueueTimeOutURL, $Remarks, $Occasion) { + $SecurityCredential = $this->encryptInitiatorPassword($InitiatorPassword,$this->environment); + $CommandID = 'TransactionReversal'; + $RecieverIdentifierType = 11; + return $this->reversal($CommandID,$Initiator,$SecurityCredential,$TransactionID,$Amount,$ReceiverParty,$RecieverIdentifierType,$ResultURL,$QueueTimeOutURL,$Remarks,$Occasion); + } + /** + * Use this function to initiate a reversal request. This is the lowest level function that can change even the Organization Id Type. * @param $CommandID | Takes only 'TransactionReversal' Command id * @param $Initiator | The name of Initiator to initiating the request * @param $SecurityCredential | Encrypted Credential of user getting transaction amount @@ -211,7 +244,6 @@ public function reversal($CommandID, $Initiator, $SecurityCredential, $Transacti curl_setopt($curl, CURLOPT_HEADER, false); $curl_response = curl_exec($curl); return json_decode($curl_response); - } /** diff --git a/src/DarajaServiceProvider.php b/src/DarajaServiceProvider.php index eba3999..14b606f 100644 --- a/src/DarajaServiceProvider.php +++ b/src/DarajaServiceProvider.php @@ -24,6 +24,11 @@ public function boot() __DIR__.'/../config/config.php' => config_path('daraja.php'), ], 'config'); + // Publishing mpesa certs. + $this->publishes([ + __DIR__.'/../certs' => storage_path('mpesa'), + ], 'certs'); + // Publishing the views. /*$this->publishes([ __DIR__.'/../resources/views' => resource_path('views/vendor/daraja'),