diff --git a/UnitTestFiles/Functionality/FunctionalityTest.php b/UnitTestFiles/Functionality/FunctionalityTest.php index baaf240..b9215d8 100644 --- a/UnitTestFiles/Functionality/FunctionalityTest.php +++ b/UnitTestFiles/Functionality/FunctionalityTest.php @@ -1,24 +1,26 @@ getPgPublicKey() . "\n-----END PUBLIC KEY-----"; $keyResource = openssl_get_publickey($publicKey); - openssl_public_encrypt($data, $cryptoText, $keyResource); - return base64_encode($cryptoText); + $status = openssl_public_encrypt($data, $cryptoText, $keyResource); + if ($status) { + return base64_encode($cryptoText); + } else { + throw new ExceptionHandler('Invalid Public key'); + } } /** * Generate Signature * @param $data * @return string + * @throws ExceptionHandler * @since v1.3.1 */ public function SignatureGenerate($data) { $privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" . $this->getMerchantPrivateKey() . "\n-----END RSA PRIVATE KEY-----"; - openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256); - return base64_encode($signature); + $status = openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256); + if ($status) { + + return base64_encode($signature); + } else { + throw new ExceptionHandler('Invalid private key'); + } } @@ -77,10 +99,12 @@ public function SignatureGenerate($data) * @param $PostURL * @param $PostData * @return mixed + * @throws GuzzleException * @since v1.3.1 */ public function HttpPostMethod($PostURL, $PostData) { + $url = curl_init($PostURL); $postToken = json_encode($PostData); $header = array( @@ -109,6 +133,8 @@ public function HttpPostMethod($PostURL, $PostData) curl_close($url); return $response; } + + } /** diff --git a/src/RequestHandler.php b/src/RequestHandler.php index a802d82..2914caa 100644 --- a/src/RequestHandler.php +++ b/src/RequestHandler.php @@ -1,20 +1,19 @@ Helper::generateRandomString(40, 'you', 'me') ); + + try { + $publicSignature = $this->helper->EncryptDataWithPublicKey(json_encode($sensitiveData)); + } catch (Exception $e) { + // return $this->showResponse($e->getMessage(), $sensitiveData, []); + throw new ExceptionHandler($e->getMessage()); + + } + + try { + $signature = $this->helper->SignatureGenerate(json_encode($sensitiveData)); + } catch (Exception $e) { + throw new ExceptionHandler($e->getMessage()); + + } + $postData = array( 'accountNumber' => $this->base->keyObject->getAppAccount(), //optional 'dateTime' => Date('YmdHis'), - 'sensitiveData' => $this->helper->EncryptDataWithPublicKey(json_encode($sensitiveData)), - 'signature' => $this->helper->SignatureGenerate(json_encode($sensitiveData)) + 'sensitiveData' => $publicSignature, + 'signature' => $signature ); $resultData = $this->helper->HttpPostMethod($postUrl, $postData); $this->initUrl = $postUrl; + if (is_array($resultData) && array_key_exists('reason', $resultData)) { - $this->showResponse($resultData, $sensitiveData, $postData); - return $this->response; + + throw new ExceptionHandler($resultData['reason'] . ', ' . $resultData['message']); + } else if (is_array($resultData) && array_key_exists('error', $resultData)) { + $this->showResponse($resultData, $sensitiveData, $postData); return $this->response; } + //check existence of sensitiveData and signature if (array_key_exists('sensitiveData', $resultData) && array_key_exists('signature', $resultData)) { if (!empty($resultData['sensitiveData']) && !empty($resultData['signature'])) { - $PlainResponse = json_decode($this->helper->DecryptDataWithPrivateKey($resultData['sensitiveData']), true); - if (isset($PlainResponse['paymentReferenceId']) && isset($PlainResponse['challenge'])) { + $plainResponse = json_decode($this->helper->DecryptDataWithPrivateKey($resultData['sensitiveData']), true); + if (isset($plainResponse['paymentReferenceId']) && isset($plainResponse['challenge'])) { - $paymentReferenceId = $PlainResponse['paymentReferenceId']; - $challenge = $PlainResponse['challenge']; + $paymentReferenceId = $plainResponse['paymentReferenceId']; + $challenge = $plainResponse['challenge']; - $SensitiveDataOrder = array( + $sensitiveDataOrder = array( 'merchantId' => $this->base->getMerchantID(), 'orderId' => $this->base->getInvoice(), 'currencyCode' => $this->base->keyObject->getCurrencyCode(), @@ -114,29 +133,29 @@ public function sendRequest() 'challenge' => $challenge ); - $PostDataOrder = array( - 'sensitiveData' => $this->helper->EncryptDataWithPublicKey(json_encode($SensitiveDataOrder)), - 'signature' => $this->helper->SignatureGenerate(json_encode($SensitiveDataOrder)), + $postDataOrder = array( + 'sensitiveData' => $this->helper->EncryptDataWithPublicKey(json_encode($sensitiveDataOrder)), + 'signature' => $this->helper->SignatureGenerate(json_encode($sensitiveDataOrder)), 'merchantCallbackURL' => $this->base->merchantCallback, ); $OrderSubmitUrl = $this->base->getBaseUrl() . "api/dfs/check-out/complete/" . $paymentReferenceId; - $Result_Data_Order = $this->helper->HttpPostMethod($OrderSubmitUrl, $PostDataOrder); + $resultDataOrder = $this->helper->HttpPostMethod($OrderSubmitUrl, $postDataOrder); - if (array_key_exists('status', $Result_Data_Order)) { + if (array_key_exists('status', $resultDataOrder)) { - if ($Result_Data_Order['status'] == "Success") { - $url = json_encode($Result_Data_Order['callBackUrl']); + if ($resultDataOrder['status'] == "Success") { + $url = json_encode($resultDataOrder['callBackUrl']); echo ""; exit; } else { - echo json_encode($Result_Data_Order); + echo json_encode($resultDataOrder); } } else { - return $Result_Data_Order; + return $resultDataOrder; } } @@ -151,7 +170,7 @@ public function sendRequest() * @param $resultData * @param $sensitiveData * @param $postData - * @return array + * @return void * @since v1.8.4.4 */ private function showResponse($resultData, $sensitiveData, $postData) diff --git a/src/lib/Key.php b/src/lib/Key.php index aa3d92c..e8ca0ad 100644 --- a/src/lib/Key.php +++ b/src/lib/Key.php @@ -1,17 +1,13 @@ appMerchantID = $envData['NAGAD_APP_MERCHANTID']; $this->merchantPrivateKey = $envData['NAGAD_APP_MERCHANT_PRIVATE_KEY']; $this->pgPublicKey = $envData['NAGAD_APP_MERCHANT_PG_PUBLIC_KEY']; - $this->timeZone = $envData['NAGAD_APP_TIMEZONE']; + if (array_key_exists('NAGAD_APP_TIMEZONE', $envData)) + + $this->timeZone = $envData['NAGAD_APP_TIMEZONE']; }