In our website we have a customized order process like processing,packaging,dispatch,shipment and delivery. we are using paytabs payment gateway Now issue is on success transaction paytabs changing order status to complete because of this we are unable to perform above process we just want to make amout as zero or paid without changing status on success transaction. i have shared code paytabs page code.Please suggest what can i change in this.
paytab response page code <?php // declare(strict_types=1); namespace Paytabs\Paytabexpress\Controller\Ipn; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; use Magento\Framework\App\ResponseInterface; use Magento\Framework\Controller\ResultInterface; use Magento\Framework\View\Result\Page; use Magento\Framework\View\Result\PageFactory; use Magento\Sales\Model\Order; /** * Class Index */ class Response extends Action { /** * @var PageFactory */ private $pageFactory; /** * @var Magento\Sales\Model\Order\Email\Sender\OrderSender */ private $_orderSender; // protected $resultRedirect; private $paytabs; /** * @var \Psr\Log\LoggerInterface */ protected $_logger; /** * @param Context $context * @param PageFactory $pageFactory */ public function __construct( Context $context, PageFactory $pageFactory, \Magento\Sales\Model\Order\Email\Sender\OrderSender $orderSender, \Psr\Log\LoggerInterface $logger ) { parent::__construct($context); $this->pageFactory = $pageFactory; $this->_orderSender = $orderSender; $this->_logger = $logger; // $this->resultRedirect = $context->getResultFactory(); $this->paytabs = new \Paytabs\Paytabexpress\Gateway\Api; } /** * @return ResponseInterface|ResultInterface|Page */ public function execute() { if (!$this->getRequest()->isPost()) { $this->_logger->addError("Paytabs: no post back data received in callback"); return; } // Get the params that were passed from our Router $orderId = $this->getRequest()->getParam('order_id', null); $transactionId = $this->getRequest()->getParam('transaction_id', null); $resultRedirect = $this->resultRedirectFactory->create(); // if (!$orderId || !$transactionId) { $this->_logger->addError("Paytabs: OrderId/TransactionId data did not receive in callback"); return; } // $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $order = $objectManager->create('Magento\Sales\Model\Order')->loadByIncrementId($orderId); if (!$order) { $this->_logger->addError("Paytabs: Order is missing, Order param = [{$orderId}]"); return; } $payment = $order->getPayment(); $paymentMethod = $payment->getMethodInstance(); $paymentSuccess = $paymentMethod->getConfigData('order_success_status'); if (!$paymentSuccess) $paymentSuccess = Order::STATE_PROCESSING; $paymentFailed = $paymentMethod->getConfigData('order_failed_status'); if (!$paymentFailed) $paymentFailed = Order::STATE_CANCELED; $secretsign = $paymentMethod->getConfigData('secretsign'); $sendInvoice = $paymentMethod->getConfigData('send_invoice'); if (!$sendInvoice) $sendInvoice = false; // $secured = $this->verifySecure($this->getRequest()->getParams(), $secretsign); if (!$secured) { $this->_logger->addError("Paytabs Response signature did not match, Order param = [{$orderId}] "); $order->addStatusToHistory(Order::STATE_CANCELED, "Paytabs Response signature does not match. You might have received tampered data"); $order->cancel()->save(); $resultRedirect->setPath('checkout/onepage/failure'); return $resultRedirect; } // $ptApi = $this->paytabs->pt($paymentMethod); $verify_response = $ptApi->verify_payment($transactionId, $orderId); if (!$verify_response) { $this->_logger->addError("Paytabs Response: verify payload is empty, Order param = [{$orderId}] "); return; } // $orderId = $verify_response->reference_no; if ($orderId != $verify_response->order_id) { $this->_logger->addError("Paytabs Response: Order reference number is mismatch, Order = [{$orderId}], ReferenceId = [{$verify_response->reference_no}] "); $this->messageManager->addWarningMessage('Order reference number is mismatch'); $resultRedirect->setPath('checkout/onepage/failure'); return $resultRedirect; } //if get response successful $success = ($verify_response->response_code == 100); $res_msg = $verify_response->result; $verifyPayment = $success; if ($verifyPayment) { // PayTabs "Transaction ID" $txnId = $transactionId; $paymentAmount = $verify_response->amount; $paymentCurrency = $verify_response->currency; $payment ->setTransactionId($txnId) ->setLastTransId($txnId) ->setCcTransId($txnId) ->setIsTransactionClosed(false) ->setShouldCloseParentTransaction(true) ->setAdditionalInformation("Payment amount", $paymentAmount) ->setAdditionalInformation("Payment currency", $paymentCurrency) ->save(); if ($sendInvoice) { $payment->registerCaptureNotification($paymentAmount, true)->save(); $invoice = $payment->getCreatedInvoice(); if ($invoice && !$order->getEmailSent()) { $this->_orderSender->send($order); $order->addStatusHistoryComment( __('You notified customer about invoice #%1.', $invoice->getIncrementId()) ) ->setIsCustomerNotified(true) ->save(); } } $transType = \Magento\Sales\Model\Order\Payment\Transaction::TYPE_CAPTURE; $transaction = $payment->addTransaction($transType, null, false); $transaction ->setIsClosed(true) ->setParentTxnId(null) ->save(); // $orderState = Order::STATE_PROCESSING; $this->setNewStatus($order, $paymentSuccess); $this->messageManager->addSuccessMessage($res_msg); $resultRedirect->setPath('checkout/onepage/success'); } else { $this->_logger->addError("Paytabs Response: Payment verify failed [$res_msg] for Order {$orderId}"); $payment->setIsTransactionPending(true); $payment->setIsFraudDetected(true); // $orderState = Order::STATE_CANCELED; $this->setNewStatus($order, $paymentFailed); $this->messageManager->addErrorMessage($res_msg); // $resultRedirect->setPath('checkout/onepage/failure'); } return $resultRedirect; // return $this->pageFactory->create(); } // public function setNewStatus($order, $newStatus) { if ($newStatus == Order::STATE_CANCELED) { $order->cancel(); } else { $order->setState($newStatus)->setStatus($newStatus); $order->addStatusToHistory($newStatus, "Order was set to '$newStatus' as in the admin's configuration."); } $order->save(); } function verifySecure($pdata, $secretsign) { $params = array( 'order_id' => $pdata['order_id'], 'response_code' => $pdata['response_code'], 'customer_name' => $pdata['customer_name'], 'transaction_currency' => $pdata['transaction_currency'], 'last_4_digits' => $pdata['last_4_digits'], 'customer_email' => $pdata['customer_email'] ); $calSignature = $this->create_secure_hash($params, $secretsign); $signature = $pdata['secure_sign']; if ($calSignature != "" && strcmp($signature, $calSignature) != 0) { return false; } return true; } protected function create_secure_hash($params = array(), $shain_phrase) { $string = ''; // SHA phrase ksort($params); // Sorting the params foreach ($params as $keys => $values) { $string .= strtoupper($keys) . '=' . $values . $shain_phrase; // Combining the field values in one string } // SHA Converting here $secure_sign = sha1($string); // Converting the values to SHA1 format return $secure_sign; } } /** * move CRSF verification to Plugin * compitable with old Magento version >=2.0 && <2.3 * compitable with PHP version 5.6 */