public function get_transaction($create = true) { if (!isset($this->transaction)) { $id = $this->request->param('transaction_id'); // TODO: inject PaymentTransaction dependency if ($create === true) { $this->transaction = AWPCP_Payment_Transaction::find_or_create($id); } else { $this->transaction = AWPCP_Payment_Transaction::find_by_id($id); } } if (!is_null($this->transaction) && $this->transaction->is_new()) { $this->transaction->user_id = wp_get_current_user()->ID; $this->transaction->set('context', 'add-credit'); $this->transaction->set('redirect', $this->url()); $this->transaction->set('redirect-data', array('action' => 'payment-completed')); } return $this->transaction; }
public function process_payment() { if (!($id = awpcp_post_param('transaction_id', false))) { return; } $transaction = AWPCP_Payment_Transaction::find_by_id($id); if (!is_null($transaction) && $transaction->is_doing_checkout()) { $this->set_transaction_payment_method($transaction); $this->process_transaction($transaction); $errors = array(); $this->set_transaction_status_to_payment($transaction, $errors); if ($transaction->payment_is_not_required() && empty($errors)) { $this->set_transaction_status_to_payment_completed($transaction, $errors); if (empty($errors)) { return; // nothing else to do here, pass control to the (api) user } } if (empty($errors)) { // no errors, so we must have a payment method defined $payment_method = $this->get_transaction_payment_method($transaction); $result = array('output' => $payment_method->process_payment($transaction)); } else { // most likely the payment method hasn't been properly set $result = array('errors' => $errors); } $this->cache[$transaction->id] = $result; } else { if (!is_null($transaction) && $transaction->is_processing_payment()) { $this->process_transaction($transaction); $payment_method = $this->get_transaction_payment_method($transaction); $result = array('output' => $payment_method->process_payment($transaction)); $this->cache[$transaction->id] = $result; } } }
public static function find_or_create($id) { $transaction = AWPCP_Payment_Transaction::find_by_id($id); if (is_null($transaction)) { $unique = awpcp_array_data('UNIQUE_ID', rand(), $_SERVER); $id = md5($unique . microtime() . wp_salt()); $transaction = new AWPCP_Payment_Transaction(array('id' => $id)); } return $transaction; }
/** * Remove incomplete payment transactions */ function awpcp_clean_up_payment_transactions() { $threshold = awpcp_datetime('mysql', current_time('timestamp') - 24 * 60 * 60); $transactions = AWPCP_Payment_Transaction::query(array('status' => array(AWPCP_Payment_Transaction::STATUS_NEW, AWPCP_Payment_Transaction::STATUS_OPEN), 'created' => array('<', $threshold))); foreach ($transactions as $transaction) { $transaction->delete(); } }
/** * validate checkout by processing transaction against eWAY * @param bool $verified * @param AWPCP_Payment_Transaction $transaction * @return bool */ public function awpcpValidateTx($valid, $transaction) { if ($transaction->get('payment-method') == self::PAYMENT_METHOD) { try { $response = $this->processTransaction($transaction); if ($response->status) { // transaction was successful, so record details and complete payment $transaction->set('txn-id', $response->transactionNumber); if (!empty($response->authCode)) { $transaction->set('eway_authcode', $response->authCode); } //~ if (!empty($response->beagleScore)) { //~ $transaction->set('eway_beagle_score', $response->beagleScore); //~ } $transaction->set('payment-status', AWPCP_Payment_Transaction::$PAYMENT_STATUS_COMPLETED); $valid = true; } else { // transaction was unsuccessful, so record transaction number and the error $transaction->set('txn-id', $response->transactionNumber); $transaction->set('payment-status', AWPCP_Payment_Transaction::$PAYMENT_STATUS_FAILED); $transaction->errors[] = nl2br(esc_html($response->error . "\nuse your browser's back button to try again.")); $valid = false; } } catch (EwayPaymentsException $e) { // an exception occured, so record the error $transaction->set('payment-status', AWPCP_Payment_Transaction::$PAYMENT_STATUS_FAILED); $transaction->errors[] = nl2br(esc_html($e->getMessage() . "\nuse your browser's back button to try again.")); $valid = false; } } return $valid; }
public function ajax_import_payment_transactions() { global $wpdb; $existing_transactions = $this->count_old_payment_transactions(); $query = 'SELECT option_name FROM ' . $wpdb->options . ' '; $query .= "WHERE option_name LIKE 'awpcp-payment-transaction-%' "; $query .= "LIMIT 0, 100"; $transactions = $wpdb->get_col($query); foreach ($transactions as $option_name) { $hash = end(explode('-', $option_name)); $transaction_errors = array(); $transaction = AWPCP_Payment_Transaction::find_by_id($hash); if (is_null($transaction)) { $transaction = new AWPCP_Payment_Transaction(array('id' => $hash)); } $data = maybe_unserialize(get_option($option_name, null)); // can't process this transaction, skip and delete old data if (!is_array($data)) { delete_option($option_name); continue; } $errors = awpcp_array_data('__errors__', array(), $data); $user_id = awpcp_array_data('user-id', null, $data); $amount = awpcp_array_data('amount', 0.0, $data); $items = awpcp_array_data('__items__', array(), $data); $created = awpcp_array_data('__created__', current_time('mysql'), $data); $updated = awpcp_array_data('__updated__', current_time('mysql'), $data); if ($type = awpcp_array_data('payment-term-type', false, $data)) { if (strcmp($type, 'ad-term-fee') === 0) { $data['payment-term-type'] = 'fee'; } } foreach ($data as $name => $value) { $transaction->set($name, $value); } foreach ($items as $item) { $transaction->add_item($item->id, $item->name, '', AWPCP_Payment_Transaction::PAYMENT_TYPE_MONEY, $amount); // at the time of this upgrade, only one item was supported. break; } if (awpcp_array_data('free', false, $data)) { $transaction->payment_status = AWPCP_Payment_Transaction::PAYMENT_STATUS_NOT_REQUIRED; } $totals = $transaction->get_totals(); if ($totals['money'] === 0 || $transaction->get('payment-method', false) === '') { $transaction->payment_status = AWPCP_Payment_Transaction::PAYMENT_STATUS_NOT_REQUIRED; } if ($totals['money'] > 0 && $transaction->get('payment-method', false)) { $transaction->_set_status(AWPCP_Payment_Transaction::STATUS_PAYMENT); } if ($completed = awpcp_array_data('completed', null, $data)) { $transaction->completed = $completed; $transaction->payment_status = AWPCP_Payment_Transaction::PAYMENT_STATUS_COMPLETED; $transaction->_set_status(AWPCP_Payment_Transaction::STATUS_COMPLETED); } unset($data['__errors__']); unset($data['__items__']); unset($data['__created__']); unset($data['__updated__']); unset($data['user-id']); unset($data['completed']); unset($data['free']); $transaction->user_id = $user_id; $transaction->created = $created; $transaction->updated = $updated; $transaction->errors = $errors; $transaction->version = 1; // remove entries from wp_options table if ($transaction->save()) { delete_option($option_name); } } $remaining_transactions = $this->count_old_payment_transactions(); // we are done here, let the plugin know so othrer upgrades // can be initiated or the plugin features can be enabled again. if ($remaining_transactions === 0) { delete_option('awpcp-import-payment-transactions'); $this->update_pending_upgrades_status(); } return $this->ajax_response($existing_transactions, $remaining_transactions); }