| <?php |
| /******************************************************************************* |
| * Copyright (c) 2015 Eclipse Foundation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Christopher Guindon (Eclipse Foundation)- initial API and implementation |
| *******************************************************************************/ |
| |
| require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php"); |
| require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/evt_log.class.php"); |
| require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/smartconnection.class.php"); |
| require_once("gateway/paypal.class.php"); |
| require_once("gateway/bitpay.class.php"); |
| |
| /** |
| * Base class for PaymentGateway() |
| * |
| * @author chrisguindon |
| */ |
| class Payment { |
| |
| /** |
| * The Eclipse App() class. |
| * This is useful for making calls to our databases. |
| */ |
| protected $App = NULL; |
| |
| /** |
| * List of message to show to the end user |
| * |
| * @var array |
| */ |
| protected $client_message = ''; |
| |
| /** |
| * Debug mode state |
| * |
| * @var bool |
| */ |
| protected $debug_mode = FALSE; |
| |
| /** |
| * Cookie domain value |
| * |
| * @var string |
| */ |
| protected $prefix_cookie = ''; |
| |
| /** |
| * Eclipse domain prefix |
| * |
| * This could be www.eclipse.org, staging.eclipse.org or |
| * www.eclipse.local |
| * |
| * @var string |
| */ |
| protected $prefix_domain = ''; |
| |
| /** |
| * Proxy value for curl requests |
| * |
| * @var string |
| */ |
| protected $proxy = ''; |
| |
| /** |
| * Constructor |
| */ |
| public function Payment() { |
| global $App; |
| $this->App = $App; |
| if ($this->_get_prefix_domain() != 'www.eclipse.org') { |
| $this->_set_debug_mode(TRUE); |
| } |
| } |
| |
| /** |
| * Writes $contents to the system logger which is usually the webserver's error log |
| * but can be changed depending on your development requirements. |
| * |
| * @param mixed $contents |
| * @return boolean |
| * @throws Exception $e |
| */ |
| public function error_logger($contents) { |
| if (!$this->_get_debug_mode()){ |
| return FALSE; |
| } |
| if (!isset($contents) || trim($contents) == '' || is_null($contents) || empty($contents)) |
| return 'Error in error_logger(): Nothing to log was supplied. Usage: error_logger($contents)'; |
| |
| try { |
| |
| /* |
| * System Error Logging: bool error_log ( string $message ) |
| * $message is sent to PHP's system logger, using the Operating System's system |
| * logging mechanism or a file, depending on what the error_log configuration |
| * directive is set to. This is the default option. |
| * See: http://www.php.net/manual/en/function.error-log.php |
| */ |
| if (isset($contents)) { |
| if (is_resource($contents)) { |
| return error_log(serialize($contents)); |
| } |
| else { |
| return error_log(var_dump($contents)); |
| } |
| } |
| else { |
| return false; |
| } |
| |
| } catch (Exception $e) { |
| echo 'Error in error_logger(): ' . $e->getMessage(); |
| } |
| } |
| |
| /** |
| * Get HTML for messages to the client |
| * |
| * @return string |
| */ |
| public function get_client_message(){ |
| $html = ""; |
| foreach ($this->client_message as $type => $msgs) { |
| foreach ($msgs as $m) { |
| $html .= '<div class="alert alert-' . $type . '" role="alert">' . $m . '</div>'; |
| } |
| } |
| return $html; |
| } |
| |
| /** |
| * Set a client message |
| * |
| * @param string $message |
| * @param string $type |
| * This should be either danger, warning, info or success |
| */ |
| public function set_client_message($message = '', $type = 'success') { |
| $alert_type = array('success', 'warning', 'danger', 'info'); |
| if (!in_array($type, $alert_type)) { |
| $type = 'warning'; |
| } |
| $this->client_message[$type][] = $message; |
| } |
| |
| /** |
| * Get HTML for proccess page |
| * |
| * This is based of the class name that is calling this function |
| * |
| * @return string |
| */ |
| public function get_process_html(){ |
| ob_start(); |
| include('tpl/'. strtolower(get_class($this)) . '-process.tpl.php'); |
| return ob_get_clean(); |
| } |
| |
| /** |
| * Email IPN results to webdev@eclipse.org |
| */ |
| protected function _email_ipn_post() { |
| ob_start(); |
| print '-------$_POST---------' . PHP_EOL; |
| print_r($_POST) . PHP_EOL; |
| print '-------$_SERVER---------' . PHP_EOL; |
| print_r($_SERVER) . PHP_EOL; |
| $this->_extend_email_ipn_post(); |
| $message = ob_get_clean(); |
| mail('webdev@eclipse.org', 'Eclipse Donation IPN: This a debug message', $message); |
| } |
| |
| /** |
| * Set default curl option for all curl request |
| */ |
| protected function _get_curl_options(&$curl) { |
| curl_setopt($curl, CURLOPT_FORBID_REUSE, TRUE); |
| curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 1); |
| curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); |
| curl_setopt($curl, CURLOPT_TIMEOUT, 30); |
| // CONFIG: Optional proxy configuration |
| curl_setopt($curl, CURLOPT_PROXY, $this->_get_proxy()); |
| curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, 1); |
| if ($this->_get_prefix_domain() === 'www.eclipse.local') { |
| curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); |
| curl_setopt($curl, CURLOPT_PROXY, ''); |
| } |
| } |
| |
| /** |
| * Get debug mode value |
| * |
| * @return Ambigous <boolean, string> |
| */ |
| public function _get_debug_mode() { |
| return $this->debug_mode; |
| } |
| |
| /** |
| * Get domain prefix |
| */ |
| protected function _get_prefix_domain() { |
| if (empty($this->prefix_domain)){ |
| $this->_set_prefix(); |
| } |
| return $this->prefix_domain; |
| } |
| |
| /** |
| * Get cookie prefix |
| */ |
| protected function _get_prefix_cookie() { |
| if (empty($this->prefix_cookie)){ |
| $this->_set_prefix(); |
| } |
| return $this->prefix_cookie; |
| } |
| |
| /** |
| * Get proxy value |
| * |
| * @return string |
| */ |
| protected function _get_proxy() { |
| if (empty($this->proxy)) { |
| $this->_set_proxy(); |
| } |
| return $this->proxy; |
| } |
| |
| /** |
| * Allow classes to extend the ipn post e-mail |
| * @return string |
| */ |
| protected function _extend_email_ipn_post() { |
| return ''; |
| } |
| |
| /** |
| * Log donation status in the EvtLog. |
| * |
| * @param unknown $action |
| */ |
| protected function _log_database($action) { |
| // Database Logging |
| $EvtLog = new EvtLog(); |
| $EvtLog->setLogTable("__paypal.class"); |
| if ($this->transaction) { |
| $EvtLog->setPK1("$this->donation_transaction_id,$this->donation_amount,$this->donation_status"); |
| } |
| else { |
| $EvtLog->setPK1("Unknown"); |
| } |
| $ip = $_SERVER['REMOTE_ADDR']; |
| $EvtLog->setPK2($ip); |
| $EvtLog->setLogAction($action); |
| if ($this->donor_email) { |
| $EvtLog->insertModLog($this->donor_email); |
| } |
| else { |
| $EvtLog->insertModLog("Unknown"); |
| } |
| } |
| |
| /** |
| * Append class specific functionnality to _set_debug_mode() |
| */ |
| protected function _extend_set_debug_mode() { |
| return TRUE; |
| } |
| |
| /** |
| * Enable/disable debug/sandbox mode |
| */ |
| private function _set_debug_mode($debug_mode = FALSE){ |
| $this->debug_mode = $debug_mode; |
| if ($this->_get_debug_mode()) { |
| $this->set_client_message('Debug, logging and Sandbox mode is enabled.', 'warning'); |
| $this->_extend_set_debug_mode(); |
| } |
| } |
| |
| /** |
| * Set Eclipse domain and Eclipse cookie domain |
| */ |
| protected function _set_prefix() { |
| $domain = $this->App->getEclipseDomain(); |
| $this->prefix_domain = $domain['domain']; |
| $this->prefix_cookie = $domain['cookie']; |
| } |
| |
| /** |
| * Set eclipse proxy for staging/production |
| */ |
| protected function _set_proxy(){ |
| if ($this->_get_prefix_domain() === 'www.eclipse.org') { |
| $this->proxy = 'proxy.eclipse.org:9899'; |
| } |
| } |
| |
| /** |
| * Helper SQL function to Insert/Update |
| * |
| * @param unknown $table |
| * @param unknown $fields |
| * @param unknown $possible_null_field |
| * @return string |
| */ |
| protected function _sql_on_duplicate_update($table, $fields = array(), $possible_null_field = array()) { |
| if ($this->_get_debug_mode()) { |
| $table = 'testing_' . $table; |
| } |
| $sql = "INSERT INTO " . $table . " ("; |
| $columns = array(); |
| $values = array(); |
| foreach ($fields as $key => $value) { |
| if (!empty($value)) { |
| $columns[] = $key; |
| $values[] = '"' . $this->App->sqlSanitize($value) . '"'; |
| } |
| else if(in_array($key, $possible_null_field)) { |
| $columns[] = $key; |
| $values[] = 'NULL'; |
| } |
| } |
| |
| $sql .= implode(',', $columns); |
| $sql .= ') VALUES ('; |
| $sql .= implode(',', $values); |
| $sql .= ") ON DUPLICATE KEY UPDATE"; |
| foreach ($columns as $key => $value){ |
| $sql .= ' ' .$value . '=' . $values[$key] . ','; |
| } |
| $sql = rtrim($sql, ','); |
| return $sql; |
| } |
| |
| } |