/** * Log each API request, if enabled * * @access private * @since 1.1 * @global $give_logs * @global $wp_query * * @param array $data * * @return void */ private function log_request($data = array()) { if (!$this->log_requests) { return; } global $give_logs, $wp_query; $query = array('give-api' => $wp_query->query_vars['give-api'], 'key' => isset($wp_query->query_vars['key']) ? $wp_query->query_vars['key'] : null, 'token' => isset($wp_query->query_vars['token']) ? $wp_query->query_vars['token'] : null, 'query' => isset($wp_query->query_vars['query']) ? $wp_query->query_vars['query'] : null, 'type' => isset($wp_query->query_vars['type']) ? $wp_query->query_vars['type'] : null, 'form' => isset($wp_query->query_vars['form']) ? $wp_query->query_vars['form'] : null, 'customer' => isset($wp_query->query_vars['customer']) ? $wp_query->query_vars['customer'] : null, 'date' => isset($wp_query->query_vars['date']) ? $wp_query->query_vars['date'] : null, 'startdate' => isset($wp_query->query_vars['startdate']) ? $wp_query->query_vars['startdate'] : null, 'enddate' => isset($wp_query->query_vars['enddate']) ? $wp_query->query_vars['enddate'] : null, 'id' => isset($wp_query->query_vars['id']) ? $wp_query->query_vars['id'] : null, 'purchasekey' => isset($wp_query->query_vars['purchasekey']) ? $wp_query->query_vars['purchasekey'] : null, 'email' => isset($wp_query->query_vars['email']) ? $wp_query->query_vars['email'] : null); $log_data = array('log_type' => 'api_request', 'post_excerpt' => http_build_query($query), 'post_content' => !empty($data['error']) ? $data['error'] : ''); $log_meta = array('request_ip' => give_get_ip(), 'user' => $this->user_id, 'key' => isset($wp_query->query_vars['key']) ? $wp_query->query_vars['key'] : null, 'token' => isset($wp_query->query_vars['token']) ? $wp_query->query_vars['token'] : null, 'time' => $data['request_speed'], 'version' => $this->get_queried_version()); $give_logs->insert_log($log_data, $log_meta); }
/** * Insert Payment * * @since 1.0 * * @param array $payment_data Arguments passed * * @return int|bool Payment ID if payment is inserted, false otherwise */ function give_insert_payment($payment_data = array()) { if (empty($payment_data)) { return false; } $payment = new Give_Payment(); $gateway = !empty($payment_data['gateway']) ? $payment_data['gateway'] : ''; $gateway = empty($gateway) && isset($_POST['give-gateway']) ? $_POST['give-gateway'] : $gateway; $form_id = isset($payment_data['give_form_id']) ? $payment_data['give_form_id'] : 0; $price_id = isset($payment_data['give_price_id']) ? $payment_data['give_price_id'] : give_get_price_id($payment_data['give_form_id'], $payment_data['price']); $form_title = isset($payment_data['give_form_title']) ? $payment_data['give_form_title'] : get_the_title($form_id); //Set properties $payment->total = $payment_data['price']; $payment->status = !empty($payment_data['status']) ? $payment_data['status'] : 'pending'; $payment->currency = !empty($payment_data['currency']) ? $payment_data['currency'] : give_get_currency(); $payment->user_info = $payment_data['user_info']; $payment->gateway = $gateway; $payment->form_title = $form_title; $payment->form_id = $form_id; $payment->price_id = $price_id; $payment->user_id = $payment_data['user_info']['id']; $payment->email = $payment_data['user_email']; $payment->first_name = $payment_data['user_info']['first_name']; $payment->last_name = $payment_data['user_info']['last_name']; $payment->email = $payment_data['user_info']['email']; $payment->ip = give_get_ip(); $payment->key = $payment_data['purchase_key']; $payment->mode = give_is_test_mode() ? 'test' : 'live'; $payment->parent_payment = !empty($payment_data['parent']) ? absint($payment_data['parent']) : ''; //Add the donation $args = array('price' => $payment->total, 'price_id' => $payment->price_id, 'fees' => isset($payment_data['fees']) ? $payment_data['fees'] : array()); $payment->add_donation($payment->form_id, $args); //Set date if present if (isset($payment_data['post_date'])) { $payment->date = $payment_data['post_date']; } //Handle sequential payments if (give_get_option('enable_sequential')) { $number = give_get_next_payment_number(); $payment->number = give_format_payment_number($number); update_option('give_last_payment_number', $number); } // Clear the user's purchased cache delete_transient('give_user_' . $payment_data['user_info']['id'] . '_purchases'); //Save payment $payment->save(); //Hook it do_action('give_insert_payment', $payment->ID, $payment_data); //Return payment ID upon success if (!empty($payment->ID)) { return $payment->ID; } // Return false if no payment was inserted return false; }
/** * Insert Payment * * @since 1.0 * * @param array $payment_data * * @return int|bool Payment ID if payment is inserted, false otherwise */ function give_insert_payment($payment_data = array()) { if (empty($payment_data)) { return false; } // Make sure the payment is inserted with the correct timezone date_default_timezone_set(give_get_timezone_id()); // Construct the payment title if (isset($payment_data['user_info']['first_name']) || isset($payment_data['user_info']['last_name'])) { $payment_title = $payment_data['user_info']['first_name'] . ' ' . $payment_data['user_info']['last_name']; } else { $payment_title = $payment_data['user_email']; } // Find the next payment number, if enabled if (give_get_option('enable_sequential')) { $number = give_get_next_payment_number(); } $args = apply_filters('give_insert_payment_args', array('post_title' => $payment_title, 'post_status' => isset($payment_data['status']) ? $payment_data['status'] : 'pending', 'post_type' => 'give_payment', 'post_parent' => isset($payment_data['parent']) ? $payment_data['parent'] : null, 'post_date' => isset($payment_data['post_date']) ? $payment_data['post_date'] : null, 'post_date_gmt' => isset($payment_data['post_date']) ? get_gmt_from_date($payment_data['post_date']) : null), $payment_data); // Create a blank payment $payment = wp_insert_post($args); if ($payment) { $payment_meta = array('currency' => $payment_data['currency'], 'form_title' => $payment_data['give_form_title'], 'form_id' => $payment_data['give_form_id'], 'price_id' => give_get_price_id($payment_data['give_form_id'], $payment_data['price']), 'user_info' => $payment_data['user_info']); $mode = give_is_test_mode() ? 'test' : 'live'; $gateway = !empty($payment_data['gateway']) ? $payment_data['gateway'] : ''; $gateway = empty($gateway) && isset($_POST['give-gateway']) ? $_POST['give-gateway'] : $gateway; if (!$payment_data['price']) { // Ensures the _give_payment_total meta key is created for donations with an amount of 0 $payment_data['price'] = '0.00'; } // Create or update a customer $customer = new Give_Customer($payment_data['user_email']); $customer_data = array('name' => $payment_data['user_info']['first_name'] . ' ' . $payment_data['user_info']['last_name'], 'email' => $payment_data['user_email'], 'user_id' => $payment_data['user_info']['id']); if (empty($customer->id)) { $customer->create($customer_data); } else { // Only update the customer if their name or email has changed if ($customer_data['email'] !== $customer->email || $customer_data['name'] !== $customer->name) { // We shouldn't be updating the User ID here, that is an admin task unset($customer_data['user_id']); $customer->update($customer_data); } } $customer->attach_payment($payment, false); // Record the payment details give_update_payment_meta($payment, '_give_payment_meta', apply_filters('give_payment_meta', $payment_meta, $payment_data)); give_update_payment_meta($payment, '_give_payment_user_id', $payment_data['user_info']['id']); give_update_payment_meta($payment, '_give_payment_donor_id', $customer->id); give_update_payment_meta($payment, '_give_payment_user_email', $payment_data['user_email']); give_update_payment_meta($payment, '_give_payment_user_ip', give_get_ip()); give_update_payment_meta($payment, '_give_payment_purchase_key', $payment_data['purchase_key']); give_update_payment_meta($payment, '_give_payment_total', $payment_data['price']); give_update_payment_meta($payment, '_give_payment_mode', $mode); give_update_payment_meta($payment, '_give_payment_gateway', $gateway); if (give_get_option('enable_sequential')) { give_update_payment_meta($payment, '_give_payment_number', give_format_payment_number($number)); update_option('give_last_payment_number', $number); } // Clear the user's purchased cache delete_transient('give_user_' . $payment_data['user_info']['id'] . '_purchases'); do_action('give_insert_payment', $payment, $payment_data); return $payment; // Return the ID } // Return false if no payment was inserted return false; }
/** * Create the base of a payment. * * @since 1.5 * @access private * * @return int|bool False on failure, the payment ID on success. */ private function insert_payment() { // Construct the payment title $payment_title = ''; if (!empty($this->first_name) && !empty($this->last_name)) { $payment_title = $this->first_name . ' ' . $this->last_name; } else { if (!empty($this->first_name) && empty($this->last_name)) { $payment_title = $this->first_name; } else { if (!empty($this->email) && is_email($this->email)) { $payment_title = $this->email; } } } //Set Key if (empty($this->key)) { $auth_key = defined('AUTH_KEY') ? AUTH_KEY : ''; $this->key = strtolower(md5($this->email . date('Y-m-d H:i:s') . $auth_key . uniqid('give', true))); // Unique key $this->pending['key'] = $this->key; } //Set IP if (empty($this->ip)) { $this->ip = give_get_ip(); $this->pending['ip'] = $this->ip; } $payment_data = array('price' => $this->total, 'date' => $this->date, 'user_email' => $this->email, 'purchase_key' => $this->key, 'form_title' => $this->form_title, 'form_id' => $this->form_id, 'price_id' => $this->price_id, 'currency' => $this->currency, 'user_info' => array('id' => $this->user_id, 'email' => $this->email, 'first_name' => $this->first_name, 'last_name' => $this->last_name, 'address' => $this->address), 'status' => $this->status, 'fees' => $this->fees); $args = apply_filters('give_insert_payment_args', array('post_title' => $payment_title, 'post_status' => $this->status, 'post_type' => 'give_payment', 'post_date' => !empty($this->date) ? $this->date : null, 'post_date_gmt' => !empty($this->date) ? get_gmt_from_date($this->date) : null, 'post_parent' => $this->parent_payment), $payment_data); // Create a blank payment $payment_id = wp_insert_post($args); if (!empty($payment_id)) { $this->ID = $payment_id; $this->_ID = $payment_id; $customer = new stdClass(); if (did_action('give_pre_process_purchase') && is_user_logged_in()) { $customer = new Give_Customer(get_current_user_id(), true); } if (empty($customer->id)) { $customer = new Give_Customer($this->email); } if (empty($customer->id)) { $customer_data = array('name' => !is_email($payment_title) ? $this->first_name . ' ' . $this->last_name : '', 'email' => $this->email, 'user_id' => $this->user_id); $customer->create($customer_data); } $this->customer_id = $customer->id; $this->pending['customer_id'] = $this->customer_id; $customer->attach_payment($this->ID, false); $this->payment_meta = apply_filters('give_payment_meta', $this->payment_meta, $payment_data); if (!empty($this->payment_meta['fees'])) { $this->fees = array_merge($this->fees, $this->payment_meta['fees']); foreach ($this->fees as $fee) { $this->increase_fees($fee['amount']); } } $this->update_meta('_give_payment_meta', $this->payment_meta); $this->new = true; } return $this->ID; }
/** * Authorize.net Payments * * @param $purchase_data */ public function give_process_authorize_net_payment($purchase_data) { if (!isset($_POST['card_number']) || $_POST['card_number'] == '') { give_set_error('empty_card', __('You must enter a card number', 'give')); } if (!isset($_POST['card_name']) || $_POST['card_name'] == '') { give_set_error('empty_card_name', __('You must enter the name on your card', 'give')); } if (!isset($_POST['card_exp_month']) || $_POST['card_exp_month'] == '') { give_set_error('empty_month', __('You must enter an expiration month', 'give')); } if (!isset($_POST['card_exp_year']) || $_POST['card_exp_year'] == '') { give_set_error('empty_year', __('You must enter an expiration year', 'give')); } if (!isset($_POST['card_cvc']) || $_POST['card_cvc'] == '' || strlen($_POST['card_cvc']) < 3) { give_set_error('empty_cvc', __('You must enter a valid CVC', 'give')); } $errors = give_get_errors(); //No errors: Continue with payment processing if (!$errors) { //Include Authorize SDK require_once GIVE_AUTHORIZE_PLUGIN_DIR . '/includes/anet_php_sdk/AuthorizeNet.php'; if (!give_is_test_mode()) { //LIVE: $authorize_api_login = give_get_option('give_api_login'); $authorize_trans_key = give_get_option('give_transaction_key'); } else { //SANDBOX $authorize_api_login = give_get_option('give_authorize_sandbox_api_login'); $authorize_trans_key = give_get_option('give_authorize_sandbox_transaction_key'); } //Check for credentials entered if (empty($authorize_api_login) || empty($authorize_trans_key)) { give_set_error('error_id_here', __('Error: Missing API Login or Transaction key. Please enter them in the plugin settings.', 'give-authorize')); return; } //Proceed with Authorize AIM $transaction = new AuthorizeNetAIM($authorize_api_login, $authorize_trans_key); $transaction->VERIFY_PEER = false; //Sandbox or not? if (give_is_test_mode()) { $transaction->setSandbox(true); } else { $transaction->setSandbox(false); } $card_info = $purchase_data['card_info']; $card_names = explode(' ', $card_info['card_name']); $first_name = isset($card_names[0]) ? $card_names[0] : $purchase_data['user_info']['first_name']; if (!empty($card_names[1])) { unset($card_names[0]); $last_name = implode(' ', $card_names); } else { $last_name = $purchase_data['user_info']['last_name']; } $transaction->amount = $purchase_data['price']; $transaction->card_num = strip_tags(trim($card_info['card_number'])); $transaction->card_code = strip_tags(trim($card_info['card_cvc'])); $transaction->exp_date = strip_tags(trim($card_info['card_exp_month'])) . '/' . strip_tags(trim($card_info['card_exp_year'])); $transaction->description = give_get_purchase_summary($purchase_data); $transaction->first_name = $first_name; $transaction->last_name = $last_name; $transaction->address = $card_info['card_address'] . ' ' . $card_info['card_address_2']; $transaction->city = $card_info['card_city']; $transaction->country = $card_info['card_country']; $transaction->state = $card_info['card_state']; $transaction->zip = $card_info['card_zip']; $transaction->customer_ip = give_get_ip(); $transaction->email = $purchase_data['user_email']; $transaction->invoice_num = $purchase_data['purchase_key']; try { $response = $transaction->authorizeAndCapture(); if ($response->approved) { $payment_data = array('price' => $purchase_data['price'], 'give_form_title' => $purchase_data['post_data']['give-form-title'], 'give_form_id' => intval($purchase_data['post_data']['give-form-id']), 'price_id' => isset($purchase_data['post_data']['give-price-id']) ? intval($purchase_data['post_data']['give-price-id']) : '', 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => give_get_currency(), 'user_info' => $purchase_data['user_info'], 'status' => 'pending', 'gateway' => 'authorizenet'); $payment = give_insert_payment($payment_data); if ($payment) { give_update_payment_status($payment, 'publish'); give_send_to_success_page(); } else { give_set_error('authorize_error', __('Error: your payment could not be recorded. Please try again', 'give')); give_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['give-gateway']); } } else { if (isset($response->response_reason_text)) { $error = $response->response_reason_text; } elseif (isset($response->error_message)) { $error = $response->error_message; } else { $error = ''; } if (strpos(strtolower($error), 'the credit card number is invalid') !== false) { give_set_error('invalid_card', __('Your card number is invalid', 'give')); } elseif (strpos(strtolower($error), 'this transaction has been declined') !== false) { give_set_error('invalid_card', __('Your card has been declined', 'give')); } elseif (isset($response->response_reason_text)) { give_set_error('api_error', $response->response_reason_text); } elseif (isset($response->error_message)) { give_set_error('api_error', $response->error_message); } else { give_set_error('api_error', sprintf(__('An error occurred. Error data: %s', 'give'), print_r($response, true))); } give_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['give-gateway']); } } catch (AuthorizeNetException $e) { give_set_error('request_error', $e->getMessage()); give_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['give-gateway']); } } else { give_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['give-gateway']); } }