public function start_cc_processing() { $service_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/hcws/hcservice.asmx?WSDL' : 'https://hc.mercurypay.com/hcws/hcservice.asmx?WSDL'; $cc_amount = to_currency_no_money($this->sales_controller->sale_lib->get_payment_amount(lang('sales_credit'))); $tax_amount = to_currency_no_money(($this->sales_controller->sale_lib->get_total() - $this->sales_controller->sale_lib->get_subtotal()) * ($cc_amount / $this->sales_controller->sale_lib->get_total())); $customer_id = $this->sales_controller->sale_lib->get_customer(); $customer_name = ''; if ($customer_id != -1) { $customer_info = $this->sales_controller->Customer->get_info($customer_id); $customer_name = $customer_info->first_name . ' ' . $customer_info->last_name; } if (!$this->sales_controller->sale_lib->get_use_saved_cc_info()) { $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16); $parameters = array('request' => array('MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'Password' => $this->sales_controller->Location->get_info_for_key('merchant_password'), 'TranType' => $cc_amount > 0 ? 'Sale' : 'Return', 'TotalAmount' => abs($cc_amount), 'PartialAuth' => 'On', 'Frequency' => 'OneTime', 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'Invoice' => $invoice_number, 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'TaxAmount' => abs($tax_amount), 'CardHolderName' => substr(preg_replace("/[^A-Za-z ]/", '', $customer_name), 0, 30), 'ForceManualTablet' => 'Off', 'ProcessCompleteUrl' => site_url('sales/finish_cc_processing'), 'ReturnUrl' => site_url('sales/cancel_cc_processing'), 'LaneID' => $this->sales_controller->Employee->get_logged_in_employee_current_register_id() ? $this->sales_controller->Employee->get_logged_in_employee_current_register_id() : 0)); if (isset($customer_info) && $customer_info->zip && $this->_is_valid_zip($customer_info->zip)) { $customer_info->zip = str_replace('-', '', $customer_info->zip); $parameters['request']['AVSZip'] = $customer_info->zip; } $client = new SoapClient($service_url, array('trace' => TRUE)); $result = $client->InitializePayment($parameters); $response_code = $result->InitializePaymentResult->ResponseCode; if ($response_code == 0) { $payment_id = $result->InitializePaymentResult->PaymentID; $hosted_checkout_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/CheckoutPOS.aspx' : 'https://hc.mercurypay.com/CheckoutPOS.aspx'; $this->sales_controller->load->view('sales/mercury_hosted_checkout', array('payment_id' => $payment_id, 'hosted_checkout_url' => $hosted_checkout_url)); } else { $this->sales_controller->_reload(array('error' => lang('sales_credit_card_processing_is_down')), false); } } elseif ($customer_info->cc_token) { $service_url = (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'https://hc.mercurydev.net/tws/transactionservice.asmx?WSDL' : 'https://hc.mercurypay.com/tws/transactionservice.asmx?WSDL'; $client = new SoapClient($service_url, array('trace' => TRUE)); $invoice_number = substr(date('mdy') . (time() - strtotime("today")) . $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 0, 16); $parameters = array('request' => array('Token' => $customer_info->cc_token, 'MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'PurchaseAmount' => $cc_amount, 'PartialAuth' => FALSE, 'Frequency' => 'OneTime', 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'Invoice' => $invoice_number, 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'TaxAmount' => $tax_amount, 'CardHolderName' => substr(preg_replace("/[^A-Za-z ]/", '', $customer_name), 0, 30)), 'password' => $this->sales_controller->Location->get_info_for_key('merchant_password')); if (isset($customer_info) && $customer_info->zip && $this->_is_valid_zip($customer_info->zip)) { $customer_info->zip = str_replace('-', '', $customer_info->zip); $parameters['request']['Zip'] = $customer_info->zip; } $result = $client->CreditSaleToken($parameters); $status = $result->CreditSaleTokenResult->Status; if ($status == 'Approved') { $token = $result->CreditSaleTokenResult->Token; $ref_no = $result->CreditSaleTokenResult->RefNo; $auth_code = $result->CreditSaleTokenResult->AuthCode; $masked_account = $customer_info->cc_preview; $card_issuer = $customer_info->card_issuer; $acq_ref_data = $result->CreditSaleTokenResult->AcqRefData; $process_data = $result->CreditSaleTokenResult->ProcessData; $person_info = array('person_id' => $this->sales_controller->sale_lib->get_customer()); $customer_info = array('cc_token' => $token); $this->sales_controller->Customer->save($person_info, $customer_info, $this->sales_controller->sale_lib->get_customer()); $this->sales_controller->session->set_userdata('ref_no', $ref_no); $this->sales_controller->session->set_userdata('auth_code', $auth_code); $this->sales_controller->session->set_userdata('masked_account', $masked_account); $this->sales_controller->session->set_userdata('card_issuer', $card_issuer); //If the sale payments cover the total, redirect to complete (receipt) if ($this->sales_controller->_payments_cover_total()) { redirect(site_url('sales/complete')); } else { $credit_card_amount = to_currency_no_money($this->sales_controller->sale_lib->get_payment_amount(lang('sales_credit'))); $partial_transaction = array('AuthCode' => $auth_code, 'Frequency' => 'OneTime', 'Memo' => 'PHP POS ' . APPLICATION_VERSION, 'Invoice' => $invoice_number, 'MerchantID' => $this->sales_controller->Location->get_info_for_key('merchant_id'), 'OperatorID' => (!defined("ENVIRONMENT") or ENVIRONMENT == 'development') ? 'test' : $this->sales_controller->Employee->get_logged_in_employee_info()->person_id, 'PurchaseAmount' => $credit_card_amount, 'RefNo' => $ref_no, 'Token' => $token, 'AcqRefData' => $acq_ref_data, 'ProcessData' => $process_data); $this->sales_controller->sale_lib->delete_payment($this->sales_controller->sale_lib->get_payment_ids(lang('sales_credit'))); $this->sales_controller->sale_lib->add_payment(lang('sales_partial_credit'), $credit_card_amount, FALSE, $masked_account, $card_issuer); $this->sales_controller->sale_lib->add_partial_transaction($partial_transaction); $this->sales_controller->_reload(array('warning' => lang('sales_credit_card_partially_charged_please_complete_sale_with_another_payment_method')), false); } } else { //If we have failed, remove cc token and cc preview $person_info = array('person_id' => $this->sales_controller->sale_lib->get_customer()); $customer_info = array('cc_token' => NULL, 'cc_preview' => NULL, 'card_issuer' => NULL); $this->sales_controller->Customer->save($person_info, $customer_info, $this->sales_controller->sale_lib->get_customer()); //Clear cc token for using saved cc info $this->sales_controller->sale_lib->clear_use_saved_cc_info(); $this->sales_controller->_reload(array('error' => lang('sales_charging_card_failed_please_try_again')), false); } } }