'payment', 'IDo' => $this->order->id, 'cf' => $this->order->getSecurityCode(), 'step' => $step, 'class' => $this->class, 'paymentId' => $this->paymentId, 'absolute' => true, ]); } private function getPayment(bool $new = false) { $kupshopPayment = $this->getPendingPayment(); if ($kupshopPayment && $new) { $status = Payment::STATUS_UNKNOWN; sqlQuery('UPDATE '.getTableName('order_payments')." SET status={$status}, date=NOW() WHERE id={$kupshopPayment['id']}"); $kupshopPayment = false; } if ($kupshopPayment && !$new) { return $kupshopPayment; } else { $this->createPayment( null, $amount = roundPrice($this->order->getRemainingPayment())->asFloat(), ['paymentClass' => self::class] ); $paymentRow = $this->selectSQL('order_payments', ['id' => $this->paymentId])->fetch(); $json = json_decode($paymentRow['payment_data'], true); $json['session'] = $this->paymentId; $json['shopID'] = $this->order->id.'_'.$paymentRow['id'].'_'.uniqid(); $paymentRow['payment_data'] = json_encode($json); $this->updateSQL('order_payments', $paymentRow, ['id' => $this->paymentId]); return $this->getPendingPayment(); } } public function savePaymentData(array $data, array $payment) { $paymentRow = $this->selectSQL('order_payments', ['id' => $payment['id']])->fetch(); $json = json_decode($paymentRow['payment_data'], true); $json = array_merge($json, $data); $paymentRow['payment_data'] = json_encode($json); $this->updateSQL('order_payments', $paymentRow, ['id' => $payment['id']]); } /* Payment steps */ public function processStep_1() { $merchangConfig = $this->getMerchantConfig(); $amount = roundPrice($this->order->getRemainingPayment())->asFloat(); if ($amount <= (float) 0) { $this->step(-3, 'storno'); } $payment = $this->getPayment(true); // Initialize the payment page // See https://github.com/mattiabasone/PagOnline $init = new \PagOnline\Init\IgfsCgInit(); $init->serverURL = $merchangConfig['url']; $init->tid = $merchangConfig['tid']; $init->kSig = $merchangConfig['kSig']; $init->shopID = $payment['decoded_data']->shopID; $init->shopUserRef = $this->order->invoice_email; $init->shopUserName = $this->order->invoice_surname.','.$this->order->invoice_name; $init->trType = 'AUTH'; $init->currencyCode = 'EUR'; $init->amount = (int) ($amount * 100); // Amount without comma (500 = 5,00) $init->langID = 'IT'; $init->notifyURL = $this->getPaymentUrl(2); $init->errorURL = $this->getPaymentUrl(-3); // $init->addInfo1 = 'myFirstAddintionalInfo'; if (!$init->execute()) { // Something went wrong, save error $this->savePaymentData([ 'error' => $init->errorDesc, 'rc' => $init->rc, ], $payment); $this->step(-3, 'storno'); } else { // save PagOnline PaymentID $this->savePaymentData(['session' => $init->paymentID], $payment); // Redirect user to payment gateway redirection($init->redirectURL); } } public function processStep_2() { $merchangConfig = $this->getMerchantConfig(); $payment = $this->getPayment(); $verify = new \PagOnline\Init\IgfsCgVerify(); $verify->setRequestTimeout(15); $verify->serverURL = $merchangConfig['url']; $verify->tid = $merchangConfig['tid']; // per servizio MyBank usare UNI_MYBK $verify->kSig = $merchangConfig['kSig']; $verify->shopID = $payment['decoded_data']->shopID; $verify->paymentID = $payment['decoded_data']->session; if (!$verify->execute()) { // save error $this->savePaymentData([ 'error' => $verify->errorDesc, 'rc' => $verify->rc, ], $payment); $this->step(-3, 'storno'); return; } if (!$this->setStatus(Payment::STATUS_FINISHED, $verify->paymentID)) { throw new Exception('PagOnline::updatePaymentStatus: setStatus failed!'); } $this->success(translate('paymentSuccess', 'payment')); } public function hasOnlinePayment() { return true; } public static function isEnabled($className) { $cfg = Config::get(); if (empty($cfg['Modules']['payments'][$className])) { return false; } return true; } protected function getMerchantConfig(): array { $defaultTestConfig = [ 'url' => 'https://testeps.netswgroup.it/UNI_CG_SERVICES/services', 'tid' => 'UNI_ECOM', 'kSig' => 'UNI_TESTKEY', ]; return array_merge($defaultTestConfig, $this->config); } }