Array('Name' => 'Sella/GuestPay', 'ClassName' => 'kSellaGuestPayGW', 'ClassFile' => 'sella_guestpay.php', 'RequireCCFields' => 0), 'ConfigFields' => Array( 'merchant_id' => Array('Name' => 'Merchant ID', 'Type' => 'text', 'ValueList' => '', 'Default' => ''), 'merchant_country' => Array('Name' => 'Merchant Country Code', 'Type' => 'text', 'ValueList' => '', 'Default' => ''), 'currency_code' => Array('Name' => 'Currency Code', 'Type' => 'text', 'ValueList' => '', 'Default' => '978'), 'language_code' => Array('Name' => 'Language Code', 'Type' => 'text', 'ValueList' => '', 'Default' => '2'), 'shipping_control' => Array('Name' => 'Shipping Control', 'Type' => 'select', 'ValueList' => '3=la_CreditDirect,4=la_CreditPreAuthorize', 'Default' => '3'), ) ); return $data; } /** * Returns payment form submit url * * @param Array $gw_params gateway params from payment type config * @return string */ function getFormAction($gw_params) { return 'https://ecomm.sella.it/gestpay/pagam.asp'; } /** * Processed input data and convets it to fields understandable by gateway * * @param Array $item_data * @param Array $tag_params additional params for gateway passed through tag * @param Array $gw_params gateway params from payment type config * @return Array */ function getHiddenFields($item_data, $tag_params, $gw_params) { $a = $gw_params['merchant_id']; $params['PAY1_UICCODE'] = $gw_params['currency_code']; $params['PAY1_AMOUNT'] = $item_data['TotalAmount']; $params['PAY1_SHOPTRANSACTIONID'] = $item_data['OrderId']; $params['PAY1_IDLANGUAGE'] = $gw_params['language_code']; $params['CUSTOM_INFO'] = $this->Application->GetSID().','.MD5($item_data['OrderId']); $separator = '*P1*'; $b = array(); foreach ($params as $key=>$val) { $b[] = $key.'='.urlencode(trim($val)); } //the last one is CUSTOMINFO according to GW specs, passing the atosorigin-style 'caddie' $b = join($separator, $b); $url = 'https://ecomm.sella.it/CryptHTTPS/Encrypt.asp?a='.$a.'&b='.$b.'&c=2.0'; $curl_helper = $this->Application->recallObject('CurlHelper'); /* @var $curl_helper kCurlHelper */ $res = $curl_helper->Send($url); preg_match('/#cryptstring#(.*)#\/cryptstring#/', $res, $matches); $b = $matches[1]; $res = ''; return $res; } function NeedPlaceButton($item_data, $tag_params, $gw_params) { return true; } function processNotification($gw_params) { $a = $gw_params['merchant_id']; $b = $_REQUEST['b']; $url = 'https://ecomm.sella.it/CryptHTTPS/Decrypt.asp?a='.$a.'&b='.$b.'&c=2.0'; $curl_helper = $this->Application->recallObject('CurlHelper'); /* @var $curl_helper kCurlHelper */ $ret = $curl_helper->Send($url); $result = $this->parseGWResponce($ret); list ($sid, $auth_code) = explode(',', $result['CUSTOM_INFO']); $session = $this->Application->recallObject('Session'); $session->SID = $sid; $order_id = $this->Conn->GetOne('SELECT OrderId FROM '.TABLE_PREFIX.'Orders WHERE md5(OrderId) = '.$this->Conn->qstr($auth_code)); $this->Application->SetVar('ord_id', $order_id); $order = $this->Application->recallObject('ord'); $order->Load($order_id); if ($this->Application->GetVar('sella_ok')) { if ($result['PAY1_TRANSACTIONRESULT'] == 'OK') { $this->Application->Redirect('in-commerce/checkout/checkout_success', null, '_FRONT_END_', 'index.php'); } else { $this->Application->SetVar('sella_error', 1); } } if ($this->Application->GetVar('sella_error')) { $this->Application->StoreVar('gw_error', $this->getErrorMsg()); $this->Application->Redirect('in-commerce/checkout/billing', null, '_FRONT_END_', 'index.php'); } return $result['PAY1_TRANSACTIONRESULT'] == 'OK' ? 1 : 0; } function parseGWResponce($str) { if (preg_match('/#decryptstring#(.*)#\/decryptstring#/', $str, $matches)) { $separator = '*P1*'; $pairs = explode($separator, $matches[1]); foreach ($pairs as $a_pair) { list($key, $val) = explode('=', $a_pair); $result[$key] = $val; } } elseif (preg_match('/#error#(.*)#\/error#/', $str, $matches)) { $result['PAY1_ERRORDESCRIPTION'] = $matches[1]; } else { //unknown error $result['PAY1_ERRORDESCRIPTION'] = 'Unknown error'; } $this->parsed_responce = $result; return $result; } function getGWResponce() { return serialize($this->parsed_responce); } function getErrorMsg() { $msg = $this->parsed_responce['PAY1_ERRORDESCRIPTION']; if (!$msg) { if ($this->parsed_responce['response_code'] != 'OK') { $msg = 'Transaction failed'; } } return $msg; } }