function edd_process_paytm_gateway_ipn()
{
    global $edd_options;
    if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] != 'POST') {
        return;
    }
    $payment_id = $_GET['payment_id'];
    if (empty($payment_id)) {
        edd_send_back_to_checkout('?payment-mode=paytm_gateway');
    }
    // Fallback just in case post_max_size is lower than needed
    if (isset($_POST['ORDERID']) && isset($_POST['RESPCODE'])) {
        $order_sent = $_POST['ORDERID'];
        $responseDescription = $_POST['RESPMSG'];
        if ($_POST['RESPCODE'] == '01') {
            // success
            $order_sent = $_POST['ORDERID'];
            $res_code = $_POST['RESPCODE'];
            $responseDescription = $_POST['RESPMSG'];
            $checksum_recv = $_POST['CHECKSUMHASH'];
            $paramList = $_POST;
            $order_amount = $_POST['TXNAMOUNT'];
            //  code by paytm team
            $bool = "FALSE";
            $secret_key = $edd_options['paytm_mer_access_key'];
            $bool = verifychecksum_e($paramList, $secret_key, $checksum_recv);
            if ($bool == "TRUE") {
                $payment_meta = edd_get_payment_meta($payment_id);
                edd_insert_payment_note($payment_id, sprintf(__('Thank you for your order . Your transaction has been successful. Paytm Transaction ID: %s', 'edd'), $_REQUEST['TXNID']));
                edd_set_payment_transaction_id($payment_id, $_REQUEST['TXNID']);
                edd_update_payment_status($payment_id, 'complete');
                edd_empty_cart();
                edd_send_to_success_page();
            } else {
                edd_record_gateway_error(__('Paytm Error', 'edd'), sprintf(__('Transaction Failed Invalid Checksum', 'edd'), ''), $payment_id);
                edd_update_payment_status($payment_id, 'failed');
                edd_insert_payment_note($payment_id, sprintf(__('Transaction Failed Invalid Checksum', 'edd'), ''));
                wp_redirect('?page_id=6&payment-mode=paytm_gateway');
                //edd_send_back_to_checkout( '?payment-mode=paytm_gateway' );
            }
        } else {
            edd_record_gateway_error(__('Paytm Error', 'edd'), sprintf(__('Transaction Failed. %s', 'edd'), $responseDescription), $payment_id);
            edd_update_payment_status($payment_id, 'failed');
            edd_insert_payment_note($payment_id, sprintf(__('Transaction Failed. %s', 'edd'), $responseDescription));
            wp_redirect('?page_id=6&payment-mode=paytm_gateway');
        }
    } else {
        edd_record_gateway_error(__('Paytm Error', 'edd'), sprintf(__('Transaction Failed, No Response ', 'edd'), ''), $payment_id);
        edd_update_payment_status($payment_id, 'failed');
        edd_insert_payment_note($payment_id, sprintf(__('Transaction Failed, No Response ', 'edd'), ''));
        wp_redirect('?page_id=6&payment-mode=paytm_gateway');
    }
    exit;
}
Ejemplo n.º 2
0
/**
 * Manual Payment
 *
 * @access      private
 * @since       1.0 
 * @return      void
*/
function edd_manual_payment($purchase_data)
{
    global $edd_options;
    /* 
    * purchase data comes in like this
    *
    $purchase_data = array(
    	'downloads' => array of download IDs,
    	'price' => total price of cart contents,
    	'purchase_key' =>  // random key
    	'user_email' => $user_email,
    	'date' => date('Y-m-d H:i:s'),
    	'user_id' => $user_id,
    	'post_data' => $_POST,
    	'user_info' => array of user's information and used discount code
    	'cart_details' => array of cart details,
    );
    */
    $payment = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    // record the pending payment
    $payment = edd_insert_payment($payment);
    if ($payment) {
        edd_update_payment_status($payment, 'publish');
        // empty the shopping cart
        edd_empty_cart();
        edd_send_to_success_page();
    } else {
        // if errors are present, send the user back to the purchase page so they can be corrected
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    }
}
Ejemplo n.º 3
0
/**
 * Processes the purchase data and uses the Manual Payment gateway to record
 * the transaction in the Purchase History
 *
 * @since 1.0
 * @param array $purchase_data Purchase Data
 * @return void
*/
function edd_manual_payment($purchase_data)
{
    if (!wp_verify_nonce($purchase_data['gateway_nonce'], 'edd-gateway')) {
        wp_die(__('Nonce verification has failed', 'edd'), __('Error', 'edd'), array('response' => 403));
    }
    /*
    * Purchase data comes in like this
    *
    $purchase_data = array(
    	'downloads' => array of download IDs,
    	'price' => total price of cart contents,
    	'purchase_key' =>  // Random key
    	'user_email' => $user_email,
    	'date' => date('Y-m-d H:i:s'),
    	'user_id' => $user_id,
    	'post_data' => $_POST,
    	'user_info' => array of user's information and used discount code
    	'cart_details' => array of cart details,
    );
    */
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    // Record the pending payment
    $payment = edd_insert_payment($payment_data);
    if ($payment) {
        edd_update_payment_status($payment, 'publish');
        // Empty the shopping cart
        edd_empty_cart();
        edd_send_to_success_page();
    } else {
        edd_record_gateway_error(__('Payment Error', 'edd'), sprintf(__('Payment creation failed while processing a manual (free or test) purchase. Payment data: %s', 'edd'), json_encode($payment_data)), $payment);
        // If errors are present, send the user back to the purchase page so they can be corrected
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    }
}
Ejemplo n.º 4
0
function edd_process_paymentwall_purchase($purchase_data)
{
    global $edd_options;
    // Collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'gateway' => 'paymentwall', 'status' => 'pending');
    // Record the pending payment
    $payment = edd_insert_payment($payment_data);
    // Check payment
    if (!$payment) {
        // Record the error
        edd_record_gateway_error(__('Payment Error', 'edd'), sprintf(__('Payment creation failed before sending buyer to Paymentwall. Payment data: %s', 'edd'), json_encode($payment_data)), $payment);
        // Problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        edd_initialize_paymentwall_lib();
        $widget = new Paymentwall_Widget($purchase_data['user_email'], $edd_options['paymentwall_widget_code'], array(new Paymentwall_Product($payment, $purchase_data['price'], edd_get_currency(), stripslashes(html_entity_decode(wp_strip_all_tags(edd_get_purchase_summary($purchase_data, false)), ENT_COMPAT, 'UTF-8')))), array('success_url' => add_query_arg('payment-confirmation', 'paymentwall', get_permalink($edd_options['success_page'])), 'email' => $purchase_data['user_email'], 'sign_version' => Paymentwall_Signature_Abstract::VERSION_THREE, 'integration_module' => 'easy_digital_downloads'));
        // Get rid of cart contents
        edd_empty_cart();
        if (!empty($edd_options['paymentwall_widget_mode']) && $edd_options['paymentwall_widget_mode'] == 'iframe') {
            echo $htmlCode = $widget->getHtmlCode(array('width' => '100%', 'allowtransparency' => 'true'));
        } else {
            wp_redirect($widget->getUrl());
        }
        exit;
    }
}
/**
 * Process PayPal Purchase
 *
 * @since 1.0
 * @global $edd_options Array of all the EDD Options
 * @param array $purchase_data Purchase Data
 * @return void
 */
function edd_process_paypal_purchase($purchase_data)
{
    global $edd_options;
    // Check there is a gateway name
    if (!isset($purchase_data['post_data']['edd-gateway'])) {
        return;
    }
    /*
    Purchase data comes in like this:
    
    $purchase_data = array(
        'downloads'     => array of download IDs,
        'tax' 			=> taxed amount on shopping cart
        'subtotal'		=> total price before tax
        'price'         => total price of cart contents after taxes,
        'purchase_key'  =>  // Random key
        'user_email'    => $user_email,
        'date'          => date( 'Y-m-d H:i:s' ),
        'user_id'       => $user_id,
        'post_data'     => $_POST,
        'user_info'     => array of user's information and used discount code
        'cart_details'  => array of cart details,
     );
    */
    // Collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    // Record the pending payment
    $payment = edd_insert_payment($payment_data);
    // Check payment
    if (!$payment) {
        // Record the error
        edd_record_gateway_error(__('Payment Error', 'edd'), sprintf(__('Payment creation failed before sending buyer to PayPal. Payment data: %s', 'edd'), json_encode($payment_data)), $payment);
        // Problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        // Only send to PayPal if the pending payment is created successfully
        $listener_url = trailingslashit(home_url()) . '?edd-listener=IPN';
        // Get the success url
        $return_url = add_query_arg('payment-confirmation', 'paypal', get_permalink($edd_options['success_page']));
        // Get the complete cart cart_summary
        $summary = edd_get_purchase_summary($purchase_data, false);
        // Get the PayPal redirect uri
        $paypal_redirect = trailingslashit(edd_get_paypal_redirect()) . '?';
        // Setup PayPal arguments
        $paypal_args = array('cmd' => '_xclick', 'amount' => round($purchase_data['price'] - $purchase_data['tax'], 2), 'business' => $edd_options['paypal_email'], 'item_name' => stripslashes_deep(html_entity_decode(wp_strip_all_tags($summary), ENT_COMPAT, 'UTF-8')), 'email' => $purchase_data['user_email'], 'no_shipping' => '1', 'shipping' => '0', 'no_note' => '1', 'currency_code' => edd_get_currency(), 'item_number' => $purchase_data['purchase_key'], 'charset' => get_bloginfo('charset'), 'custom' => $payment, 'rm' => '2', 'return' => $return_url, 'cancel_return' => edd_get_failed_transaction_uri(), 'notify_url' => $listener_url, 'page_style' => edd_get_paypal_page_style());
        if (edd_use_taxes()) {
            $paypal_args['tax'] = $purchase_data['tax'];
        }
        $paypal_args = apply_filters('edd_paypal_redirect_args', $paypal_args, $purchase_data);
        // Build query
        $paypal_redirect .= http_build_query($paypal_args);
        // Get rid of cart contents
        edd_empty_cart();
        // Redirect to PayPal
        wp_redirect($paypal_redirect);
        exit;
    }
}
 public function process_empty_cart()
 {
     if (isset($_GET['empty_cart'])) {
         if ($_GET['empty_cart'] == '1') {
             edd_empty_cart();
             wp_redirect(remove_query_arg('empty_cart'));
             exit;
         }
     }
 }
/**
 * Process PayPal Purchase
 *
 * @access      private
 * @since       1.0 
 * @return      void
*/
function edd_process_paypal_purchase($purchase_data)
{
    global $edd_options;
    // check there is a gateway name
    if (!isset($purchase_data['post_data']['edd-gateway'])) {
        return;
    }
    /* 
    Purchase data comes in like this:
    ////////////////////////////////
    
    $purchase_data = array( 
        'downloads'     => array of download IDs, 
        'price'         => total price of cart contents, 
        'purchase_key'  =>  // random key
        'user_email'    => $user_email, 
        'date'          => date( 'Y-m-d H:i:s' ), 
        'user_id'       => $user_id, 
        'post_data'     => $_POST, 
        'user_info'     => array of user's information and used discount code
        'cart_details'  => array of cart details, 
     );
    */
    // collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    // record the pending payment
    $payment = edd_insert_payment($payment_data);
    // check payment
    if (!$payment) {
        // problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        // only send to PayPal if the pending payment is created successfully
        $listener_url = trailingslashit(home_url()) . '?edd-listener=IPN';
        // get the success url
        $return_url = add_query_arg('payment-confirmation', 'paypal', get_permalink($edd_options['success_page']));
        // get the complete cart summary
        $cart_summary = edd_get_purchase_summary($purchase_data, false);
        // get the PayPal redirect uri
        $paypal_redirect = trailingslashit(edd_get_paypal_redirect()) . '?';
        // setup PayPal arguments
        $paypal_args = array('cmd' => '_xclick', 'amount' => $purchase_data['price'], 'business' => $edd_options['paypal_email'], 'item_name' => stripslashes_deep(html_entity_decode($cart_summary, ENT_COMPAT, 'UTF-8')), 'email' => $purchase_data['user_email'], 'no_shipping' => '1', 'shipping' => '0', 'no_note' => '1', 'currency_code' => $edd_options['currency'], 'item_number' => $purchase_data['purchase_key'], 'charset' => get_bloginfo('charset'), 'custom' => $payment, 'rm' => '2', 'return' => $return_url, 'notify_url' => $listener_url);
        // build query
        $paypal_redirect .= http_build_query(apply_filters('edd_paypal_redirect_args', $paypal_args, $purchase_data));
        // get rid of cart contents
        edd_empty_cart();
        // Redirect to PayPal
        wp_redirect($paypal_redirect);
        exit;
    }
}
Ejemplo n.º 8
0
/**
 * Process PayPal Purchase
 *
 * @access      private
 * @since       1.0 
 * @return      void
*/
function edd_process_paypal_purchase($purchase_data)
{
    global $edd_options;
    /* 
    * purchase data comes in like this
    *
    $purchase_data = array(
    	'downloads' => array of download IDs,
    	'price' => total price of cart contents,
    	'purchase_key' =>  // random key
    	'user_email' => $user_email,
    	'date' => date('Y-m-d H:i:s'),
    	'user_id' => $user_id,
    	'post_data' => $_POST,
    	'user_info' => array of user's information and used discount code
    	'cart_details' => array of cart details,
    );
    */
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    // record the pending payment
    $payment = edd_insert_payment($payment_data);
    if ($payment) {
        // only send to paypal if the pending payment is created successfully
        $listener_url = trailingslashit(home_url()) . '?edd-listener=IPN';
        $return_url = add_query_arg('payment-confirmation', 'paypal', get_permalink($edd_options['success_page']));
        $cart_summary = edd_get_purchase_summary($purchase_data, false);
        // one time payment
        if (edd_is_test_mode()) {
            $paypal_redirect = 'https://www.sandbox.paypal.com/cgi-bin/webscr/?';
        } else {
            $paypal_redirect = 'https://www.paypal.com/cgi-bin/webscr/?';
        }
        $paypal_args = array('cmd' => '_xclick', 'amount' => $purchase_data['price'], 'business' => $edd_options['paypal_email'], 'item_name' => $cart_summary, 'email' => $purchase_data['user_email'], 'no_shipping' => '1', 'no_note' => '1', 'currency_code' => $edd_options['currency'], 'item_number' => $purchase_data['purchase_key'], 'charset' => 'UTF-8', 'custom' => $payment, 'rm' => '2', 'return' => $return_url, 'notify_url' => $listener_url);
        //var_dump(http_build_query($paypal_args)); exit;
        $paypal_redirect .= http_build_query($paypal_args);
        //var_dump(urldecode($paypal_redirect)); exit;
        // get rid of cart contents
        edd_empty_cart();
        // Redirect to paypal
        wp_redirect($paypal_redirect);
        exit;
    } else {
        // if errors are present, send the user back to the purchase page so they can be corrected
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    }
}
function sofort_process_payment($purchase_data)
{
    global $edd_options;
    // check there is a gateway name
    if (!isset($purchase_data['post_data']['edd-gateway'])) {
        return;
    }
    // collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
    $errors = edd_get_errors();
    if ($errors) {
        // problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        $payment = edd_insert_payment($payment_data);
        // check payment
        if (!$payment) {
            edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
        } else {
            if (!class_exists('SofortLib')) {
                require_once 'library/sofortLib.php';
            }
            $return_url = add_query_arg('payment-confirmation', 'paypal', get_permalink($edd_options['success_page']));
            $Sofort = new SofortLib_Multipay(trim($edd_options['sofort_config_id']));
            $Sofort->setSofortueberweisung();
            $Sofort->setAmount($purchase_data['price']);
            $Sofort->setReason('CartId ' . $payment, $purchase_data['post_data']['edd_first'] . ' ' . $purchase_data['post_data']['edd_last']);
            $Sofort->addUserVariable($payment);
            $Sofort->setSuccessUrl($return_url);
            $Sofort->setAbortUrl(edd_get_failed_transaction_uri());
            $Sofort->setTimeoutUrl(edd_get_failed_transaction_uri());
            $Sofort->setNotificationUrl(home_url('/?sofort=ipn'));
            $Sofort->sendRequest();
            if ($Sofort->isError()) {
                //PNAG-API didn't accept the data
                wp_die($Sofort->getError(), 'Error');
            } else {
                //buyer must be redirected to $paymentUrl else payment cannot be successfully completed!
                $paymentUrl = $Sofort->getPaymentUrl();
                edd_empty_cart();
                wp_redirect($paymentUrl);
                exit;
            }
        }
    }
}
Ejemplo n.º 10
0
/**
 * Complete a purchase
 *
 * Performs all necessary actions to complete a purchase.
 * Triggered by the edd_update_payment_status() function.
 *
 * @since 1.0.8.3
 * @param int $payment_id the ID number of the payment
 * @param string $new_status the status of the payment, probably "publish"
 * @param string $old_status the status of the payment prior to being marked as "complete", probably "pending"
 * @return void
*/
function edd_complete_purchase($payment_id, $new_status, $old_status)
{
    if ($old_status == 'publish' || $old_status == 'complete') {
        return;
    }
    // Make sure that payments are only completed once
    // Make sure the payment completion is only processed when new status is complete
    if ($new_status != 'publish' && $new_status != 'complete') {
        return;
    }
    if (edd_is_test_mode() && !apply_filters('edd_log_test_payment_stats', false)) {
        return;
    }
    $payment_data = edd_get_payment_meta($payment_id);
    $downloads = maybe_unserialize($payment_data['downloads']);
    $user_info = maybe_unserialize($payment_data['user_info']);
    $cart_details = maybe_unserialize($payment_data['cart_details']);
    if (is_array($downloads)) {
        // Increase purchase count and earnings
        foreach ($downloads as $download) {
            edd_record_sale_in_log($download['id'], $payment_id, $user_info);
            edd_increase_purchase_count($download['id']);
            $amount = null;
            if (is_array($cart_details)) {
                foreach ($cart_details as $key => $item) {
                    if (array_search($download['id'], $item)) {
                        $cart_item_id = $key;
                    }
                }
                $amount = isset($cart_details[$cart_item_id]['price']) ? $cart_details[$cart_item_id]['price'] : null;
            }
            $amount = edd_get_download_final_price($download['id'], $user_info, $amount);
            edd_increase_earnings($download['id'], $amount);
        }
        // Clear the total earnings cache
        delete_transient('edd_earnings_total');
    }
    if (isset($user_info['discount']) && $user_info['discount'] != 'none') {
        edd_increase_discount_usage($user_info['discount']);
    }
    // Empty the shopping cart
    edd_empty_cart();
}
 /**
  * Process the purchase data and send to Payeezy
  *
  * @since 1.0
  * @return void
  */
 public function process_payment($purchase_data)
 {
     global $edd_options;
     $url = edd_is_test_mode() ? 'https://api-cert.payeezy.com/v1/transactions' : 'https://api.payeezy.com/v1/transactions';
     $payeezy = new Payeezy();
     $payeezy::setApiKey(edd_get_option('payeezy_api_key'));
     $payeezy::setApiSecret(edd_get_option('payeezy_api_secret'));
     $payeezy::setMerchantToken(edd_get_option('payeezy_token'));
     $payeezy::setUrl($url);
     $month = $purchase_data['card_info']['card_exp_month'];
     $month = $month > 9 ? $month : '0' . $month;
     // Payeezy requires two digits
     $year = substr($purchase_data['card_info']['card_exp_year'], -2);
     $card_type = edd_detect_cc_type($purchase_data['card_info']['card_number']);
     switch ($card_type) {
         case 'amex':
             $card_type = 'American Express';
             break;
     }
     $response = json_decode($payeezy->purchase(array('amount' => $purchase_data['price'], 'card_number' => $purchase_data['card_info']['card_number'], 'card_type' => $card_type, 'card_holder_name' => $purchase_data['card_info']['card_name'], 'card_cvv' => $purchase_data['card_info']['card_cvc'], 'card_expiry' => $month . $year, 'currency_code' => 'USD')));
     if ('failed' === $response->validation_status) {
         foreach ($response->Error->messages as $error) {
             edd_set_error($error->code, $error->description);
         }
         edd_send_back_to_checkout('?payment-mode=payeezy');
     } elseif ('success' === $response->validation_status) {
         if ('approved' === $response->transaction_status) {
             $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['post_data']['edd_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'cart_details' => $purchase_data['cart_details'], 'user_info' => $purchase_data['user_info'], 'status' => 'pending');
             // record the pending payment
             $payment_id = edd_insert_payment($payment_data);
             edd_update_payment_status($payment_id, 'publish');
             edd_set_payment_transaction_id($payment_id, $response->transaction_id);
             // Empty the shopping cart
             edd_empty_cart();
             edd_send_to_success_page();
         } else {
             edd_set_error('payeezy_error', sprintf(__('Transaction not approved. Status: %s', 'edd-payeezy'), $response->transaction_status));
             edd_send_back_to_checkout('?payment-mode=payeezy');
         }
     }
 }
/**
 * Process deposit
 *
 * @since       1.0.0
 * @return      void
 */
function edd_wallet_process_deposit()
{
    // Verify the nonce
    if (!wp_verify_nonce($_REQUEST['_wpnonce'], 'edd-wallet-deposit-nonce')) {
        wp_die(__('Nonce verification failed', 'edd-wallet'), __('Error', 'edd-wallet'), array('response' => 403));
    }
    // Make sure the cart is empty
    edd_empty_cart();
    $value = $_POST['edd_wallet_deposit_amount'];
    if ($value == 'custom') {
        $value = $_POST['edd_wallet_custom_deposit'];
    }
    // Setup the fee label
    $label = edd_get_option('edd_wallet_deposit_description', __('Deposit to wallet', 'edd-wallet'));
    $label = str_replace('{val}', edd_currency_filter(edd_format_amount($value)), $label);
    // Setup the fee (product) for the deposit
    $fee = array('amount' => $value, 'label' => $label, 'type' => 'item', 'no_tax' => true, 'id' => 'edd-wallet-deposit');
    EDD()->fees->add_fee($fee);
    // Redirect to checkout
    wp_redirect(edd_get_checkout_uri(), 303);
    edd_die();
}
/**
 * Complete a purchase
 *
 * Performs all necessary actions to complete a purchase. 
 * Triggered by the edd_update_payment_status() function.
 *
 * @param		 int $payment_id the ID number of the payment
 * @param		 string $new_status the status of the payment, probably "publish"
 * @param		 string $old_status the status of the payment prior to being marked as "complete", probably "pending"
 * @access      private
 * @since       1.0.8.3
 * @return      void
*/
function edd_complete_purchase($payment_id, $new_status, $old_status)
{
    if ($old_status == 'publish' || $old_status == 'complete') {
        return;
    }
    // make sure that payments are only completed once
    if (!edd_is_test_mode()) {
        $payment_data = edd_get_payment_meta($payment_id);
        $downloads = maybe_unserialize($payment_data['downloads']);
        $user_info = maybe_unserialize($payment_data['user_info']);
        $cart_details = maybe_unserialize($payment_data['cart_details']);
        if (is_array($downloads)) {
            // increase purchase count and earnings
            foreach ($downloads as $download) {
                edd_record_sale_in_log($download['id'], $payment_id, $user_info, $payment_data['date']);
                edd_increase_purchase_count($download['id']);
                $amount = null;
                if (is_array($cart_details)) {
                    foreach ($cart_details as $key => $item) {
                        if (array_search($download['id'], $item)) {
                            $cart_item_id = $key;
                        }
                    }
                    $amount = isset($cart_details[$cart_item_id]['price']) ? $cart_details[$cart_item_id]['price'] : null;
                }
                $amount = edd_get_download_final_price($download['id'], $user_info, $amount);
                edd_increase_earnings($download['id'], $amount);
            }
        }
        if (isset($user_info['discount'])) {
            edd_increase_discount_usage($user_info['discount']);
        }
    }
    // empty the shopping cart
    edd_empty_cart();
}
Ejemplo n.º 14
0
 /**
  * Process Payment
  *
  * Process payments trough the PagSeguro gateway.
  *
  * @return   void
  * @since    1.0
  */
 function process_payment($purchase_data)
 {
     global $edd_options;
     // check there is a gateway name
     if (!isset($purchase_data['post_data']['edd-gateway'])) {
         return;
     }
     // get credentials
     $credentials = $this->get_credentials();
     // check credentials have been set
     if (is_null($credentials['email']) || is_null($credentials['token'])) {
         edd_set_error(0, __('Please enter your PagSeguro Client Email and Token in settings', 'edd-pagseguro-gateway'));
         edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
     }
     // get payment
     $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_option('currency', 'BRL'), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
     // insert pending payment
     $payment = edd_insert_payment($payment_data);
     if (!$payment) {
         // problems? send back
         edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
     } else {
         // require PagSeguro files
         $this->load_pagseguro_sdk();
         // verify classes exists
         if (!class_exists('PagSeguroPaymentRequest')) {
             edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
         }
         // create payment request
         $paymentRequest = new PagSeguroPaymentRequest();
         // sets the currency
         $paymentRequest->setCurrency('BRL');
         // cart summary
         $cart_summary = edd_get_purchase_summary($purchase_data, false);
         // format total price
         $total_price = number_format($purchase_data['price'], 2, '.', '');
         // payment request details
         $paymentRequest->addItem('01', sanitize_text_field(substr($cart_summary, 0, 95)), '1', strval($total_price));
         // sets the reference code for this request
         $paymentRequest->setReference($payment);
         // sets customer information
         $paymentRequest->setSender(sanitize_text_field($purchase_data['user_info']['first_name'] . ' ' . $purchase_data['user_info']['last_name']), $purchase_data['user_email']);
         // redirect url
         $paymentRequest->setRedirectUrl(add_query_arg('payment-confirmation', 'pagseguro', edd_get_success_page_uri()));
         // IPN URL
         $paymentRequest->addParameter('notificationURL', get_site_url());
         /* TRY CHECKOUT */
         try {
             // generate credentials
             $credentials = new PagSeguroAccountCredentials($credentials['email'], $credentials['token']);
             // register this payment request in PagSeguro, to obtain the payment URL for redirect your customer
             $checkout_uri = $paymentRequest->register($credentials);
             if (gettype($checkout_uri) != 'string') {
                 throw new exception($checkout_uri);
             }
             // empty cart
             edd_empty_cart();
             // send the user to PagSeguro
             wp_redirect($checkout_uri);
             die;
         } catch (Exception $e) {
             //catch exception
             wp_mail(get_bloginfo('admin_email'), __('PagSeguro Checkout Error', 'edd-pagseguro-gateway'), $e->getMessage());
             edd_set_error('pagseguro_exception', $e->getMessage());
             edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
         }
     }
 }
 /**
  * Process payment submission
  *
  * @access      public
  * @since       1.0.0
  * @param       array $purchase_data The data for a specific purchase
  * @return      void
  */
 public function process_payment($purchase_data)
 {
     if (!wp_verify_nonce($purchase_data['gateway_nonce'], 'edd-gateway')) {
         wp_die(__('Nonce verification has failed', 'edd-wallet'), __('Error', 'edd-wallet'), array('response' => 403));
     }
     $error = false;
     // Double check that we can afford this item
     $value = edd_wallet()->wallet->balance($purchase_data['user_email']);
     if ($value < $purchase_data['price']) {
         edd_record_gateway_error(__('Wallet Gateway Error', 'edd-wallet'), __('User wallet has insufficient funds.', 'edd-wallet'), 0);
         edd_set_error('wallet_error', __('Insufficient funds.', 'edd-wallet'));
         edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
     }
     $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
     // Record the pending payment
     $payment = edd_insert_payment($payment_data);
     if ($payment) {
         // Update payment status
         edd_update_payment_status($payment, 'publish');
         // Withdraw the funds
         edd_wallet()->wallet->withdraw($purchase_data['user_info']['id'], $payment_data['price'], 'withdrawal', $payment);
         edd_empty_cart();
         edd_send_to_success_page();
     } else {
         edd_record_gateway_error(__('Wallet Gateway Error', 'edd-wallet'), sprintf(__('Payment creation failed while processing a Wallet purchase. Payment data: %s', 'edd-wallet'), json_encode($payment_data)), $payment);
         edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
     }
 }
Ejemplo n.º 16
0
/**
 * Process the payment
 *
 * @since  1.0
 * @return void
 */
function eddcg_process_payment($purchase_data)
{
    global $edd_options;
    $purchase_summary = edd_get_purchase_summary($purchase_data);
    // setup the payment details
    $payment = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'cart_details' => $purchase_data['cart_details'], 'user_info' => $purchase_data['user_info'], 'status' => 'pending');
    // record the pending payment
    $payment = edd_insert_payment($payment);
    if ($payment) {
        edd_cg_send_admin_notice($payment);
        edd_empty_cart();
        edd_send_to_success_page();
    } else {
        // if errors are present, send the user back to the purchase page so they can be corrected
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    }
}
 public function process_payment($purchase_data)
 {
     if (!wp_verify_nonce($purchase_data['gateway_nonce'], 'edd-gateway')) {
         wp_die(__('Nonce verification has failed', GOURLEDD), __('Error', GOURLEDD), array('response' => 403));
     }
     $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'status' => 'pending');
     // Record the pending payment
     $payment_id = edd_insert_payment($payment_data);
     if ($payment_id) {
         // Save Log
         $userID = edd_get_payment_user_id($payment_id);
         $user = !$userID ? __('Guest', GOURLEDD) : "<a href='" . admin_url("user-edit.php?user_id=" . $userID) . "'>user" . $userID . "</a>";
         edd_insert_payment_note($payment_id, sprintf(__('Order Created by %s. <br/>Awaiting cryptocurrency payment ...', GOURLEDD), $user) . ' <br/>');
         // Forward to payment page
         edd_empty_cart();
         edd_send_to_success_page();
     } else {
         edd_record_gateway_error(__('Payment Error', GOURLEDD), sprintf(__('Payment creation failed while processing Bitcoin/Altcoin purchase. Payment data: %s', GOURLEDD), json_encode($payment_data)), $payment);
         // If errors are present, send the user back to the purchase page so they can be corrected
         edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
     }
     return true;
 }
Ejemplo n.º 18
0
/**
 * Plugin Name: Easy Digital Downloads - Limit Cart to One Items 
 * Description: Prevents customers from ever purchasing more than a single item at once
 */
function pw_edd_one_item_checkout($download_id, $options)
{
    if (edd_get_cart_quantity() >= 1) {
        edd_empty_cart();
    }
}
Ejemplo n.º 19
0
 /**
  * Update the status of the specified payment
  *
  * @param Pronamic_Pay_Payment $payment
  * @param boolean			  $can_redirect (optional, defaults to false)
  */
 public static function status_update(Pronamic_Pay_Payment $payment, $can_redirect = false)
 {
     $source_id = $payment->get_source_id();
     $data = new Pronamic_WP_Pay_Extensions_EDD_PaymentData($source_id, array());
     // Only update if order is not completed
     $should_update = edd_get_payment_status($source_id) !== Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_PUBLISH;
     // Defaults
     $status = null;
     $note = null;
     $url = $data->get_normal_return_url();
     $status = $payment->get_status();
     switch ($status) {
         case Pronamic_WP_Pay_Statuses::CANCELLED:
             $url = $data->get_cancel_url();
             break;
         case Pronamic_WP_Pay_Statuses::EXPIRED:
             if ($should_update) {
                 edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_ABANDONED);
             }
             $url = $data->get_error_url();
             break;
         case Pronamic_WP_Pay_Statuses::FAILURE:
             if ($should_update) {
                 edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_FAILED);
             }
             $url = $data->get_error_url();
             break;
         case Pronamic_WP_Pay_Statuses::SUCCESS:
             if ($should_update) {
                 edd_insert_payment_note($source_id, __('Payment completed.', 'pronamic_ideal'));
                 /*
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L36
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L199-L206
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/payments/functions.php#L1312-L1332
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/gateways/paypal-standard.php#L555-L576
                  */
             }
             edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_PUBLISH);
             edd_empty_cart();
             $url = $data->get_success_url();
             break;
         case Pronamic_WP_Pay_Statuses::OPEN:
             if ($should_update) {
                 edd_insert_payment_note($source_id, __('Payment open.', 'pronamic_ideal'));
             }
             break;
         default:
             if ($should_update) {
                 edd_insert_payment_note($source_id, __('Payment unknown.', 'pronamic_ideal'));
             }
             break;
     }
     if ($can_redirect) {
         wp_redirect($url, 303);
         exit;
     }
 }
/**
 * Process PayPal Purchase
 *
 * @since 1.0
 * @param array   $purchase_data Purchase Data
 * @return void
 */
function edd_process_paypal_purchase($purchase_data)
{
    if (!wp_verify_nonce($purchase_data['gateway_nonce'], 'edd-gateway')) {
        wp_die(__('Nonce verification has failed', 'edd'), __('Error', 'edd'), array('response' => 403));
    }
    // Collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'gateway' => 'paypal', 'status' => !empty($purchase_data['buy_now']) ? 'private' : 'pending');
    // Record the pending payment
    $payment = edd_insert_payment($payment_data);
    // Check payment
    if (!$payment) {
        // Record the error
        edd_record_gateway_error(__('Payment Error', 'edd'), sprintf(__('Payment creation failed before sending buyer to PayPal. Payment data: %s', 'edd'), json_encode($payment_data)), $payment);
        // Problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        // Only send to PayPal if the pending payment is created successfully
        $listener_url = add_query_arg('edd-listener', 'IPN', home_url('index.php'));
        // Get the success url
        $return_url = add_query_arg(array('payment-confirmation' => 'paypal', 'payment-id' => $payment), get_permalink(edd_get_option('success_page', false)));
        // Get the PayPal redirect uri
        $paypal_redirect = trailingslashit(edd_get_paypal_redirect()) . '?';
        // Setup PayPal arguments
        $paypal_args = array('business' => edd_get_option('paypal_email', false), 'email' => $purchase_data['user_email'], 'first_name' => $purchase_data['user_info']['first_name'], 'last_name' => $purchase_data['user_info']['last_name'], 'invoice' => $purchase_data['purchase_key'], 'no_shipping' => '1', 'shipping' => '0', 'no_note' => '1', 'currency_code' => edd_get_currency(), 'charset' => get_bloginfo('charset'), 'custom' => $payment, 'rm' => '2', 'return' => $return_url, 'cancel_return' => edd_get_failed_transaction_uri('?payment-id=' . $payment), 'notify_url' => $listener_url, 'page_style' => edd_get_paypal_page_style(), 'cbt' => get_bloginfo('name'), 'bn' => 'EasyDigitalDownloads_SP');
        if (!empty($purchase_data['user_info']['address'])) {
            $paypal_args['address1'] = $purchase_data['user_info']['address']['line1'];
            $paypal_args['address2'] = $purchase_data['user_info']['address']['line2'];
            $paypal_args['city'] = $purchase_data['user_info']['address']['city'];
            $paypal_args['country'] = $purchase_data['user_info']['address']['country'];
        }
        $paypal_extra_args = array('cmd' => '_cart', 'upload' => '1');
        $paypal_args = array_merge($paypal_extra_args, $paypal_args);
        // Add cart items
        $i = 1;
        foreach ($purchase_data['cart_details'] as $item) {
            $item_amount = round($item['subtotal'] / $item['quantity'] - $item['discount'] / $item['quantity'], 2);
            if ($item_amount <= 0) {
                $item_amount = 0;
            }
            $paypal_args['item_name_' . $i] = stripslashes_deep(html_entity_decode(edd_get_cart_item_name($item), ENT_COMPAT, 'UTF-8'));
            $paypal_args['quantity_' . $i] = $item['quantity'];
            $paypal_args['amount_' . $i] = $item_amount;
            if (edd_use_skus()) {
                $paypal_args['item_number_' . $i] = edd_get_download_sku($item['id']);
            }
            $i++;
        }
        // Calculate discount
        $discounted_amount = 0.0;
        if (!empty($purchase_data['fees'])) {
            $i = empty($i) ? 1 : $i;
            foreach ($purchase_data['fees'] as $fee) {
                if (floatval($fee['amount']) > '0') {
                    // this is a positive fee
                    $paypal_args['item_name_' . $i] = stripslashes_deep(html_entity_decode(wp_strip_all_tags($fee['label']), ENT_COMPAT, 'UTF-8'));
                    $paypal_args['quantity_' . $i] = '1';
                    $paypal_args['amount_' . $i] = edd_sanitize_amount($fee['amount']);
                    $i++;
                } else {
                    // This is a negative fee (discount)
                    $discounted_amount += abs($fee['amount']);
                }
            }
        }
        if ($discounted_amount > '0') {
            $paypal_args['discount_amount_cart'] = edd_sanitize_amount($discounted_amount);
        }
        // Add taxes to the cart
        if (edd_use_taxes()) {
            $paypal_args['tax_cart'] = edd_sanitize_amount($purchase_data['tax']);
        }
        $paypal_args = apply_filters('edd_paypal_redirect_args', $paypal_args, $purchase_data);
        // Build query
        $paypal_redirect .= http_build_query($paypal_args);
        // Fix for some sites that encode the entities
        $paypal_redirect = str_replace('&amp;', '&', $paypal_redirect);
        // Get rid of cart contents
        edd_empty_cart();
        // Redirect to PayPal
        wp_redirect($paypal_redirect);
        exit;
    }
}
Ejemplo n.º 21
0
function edd_veritrans_payment($purchase_data)
{
    global $edd_options;
    require_once plugin_dir_path(__FILE__) . '/lib/Veritrans.php';
    /**********************************
     * set transaction mode
     **********************************/
    if (edd_is_test_mode()) {
        // set test credentials here
        Veritrans_Config::$isProduction = false;
        Veritrans_Config::$serverKey = $edd_options['vt_sandbox_api_key'];
    } else {
        // set live credentials here
        Veritrans_Config::$isProduction = true;
        Veritrans_Config::$serverKey = $edd_options['vt_production_api_key'];
    }
    // check for any stored errors
    $errors = edd_get_errors();
    if (!$errors) {
        $purchase_summary = edd_get_purchase_summary($purchase_data);
        // error_log('purchase data: '.print_r($purchase_data,true)); //debugan
        // error_log('purchase summary: '.print_r($purchase_summary,true)); //debugan
        // error_log('plugin_dir_path : '.plugin_dir_path(__FILE__)); //debugan
        /**********************************
         * setup the payment details
         **********************************/
        // error_log(json_encode($purchase_data, true));
        $payment = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => $edd_options['currency'], 'downloads' => $purchase_data['downloads'], 'cart_details' => $purchase_data['cart_details'], 'user_info' => $purchase_data['user_info'], 'status' => 'pending');
        // record the pending payment
        $payment = edd_insert_payment($payment);
        // create item
        $transaction_details = array();
        foreach ($purchase_data['cart_details'] as $item) {
            $vt_item = array('id' => $item['id'], 'price' => $item['price'], 'quantity' => $item['quantity'], 'name' => $item['name']);
            array_push($transaction_details, $vt_item);
        }
        $vt_params = array('transaction_details' => array('order_id' => $payment, 'gross_amount' => $purchase_data['price']), 'customer_details' => array('first_name' => $purchase_data['user_info']['first_name'], 'last_name' => $purchase_data['user_info']['last_name'], 'email' => $purchase_data['user_info']['email'], 'billing_address' => array('first_name' => $purchase_data['user_info']['first_name'], 'last_name' => $purchase_data['user_info']['last_name'])), 'item_details' => $transaction_details);
        //get enabled payment opts from backend
        $enabled_payments = edd_get_vtpayment_ops();
        if (!empty($enabled_payments)) {
            $vt_params['vtweb']['enabled_payments'] = $enabled_payments;
        }
        // error_log('vt_3ds '.$edd_options['vt_3ds']); //debugan
        // get rid of cart contents
        edd_empty_cart();
        // Redirect to veritrans
        // error_log('vt_params: '.print_r($vt_params,true)); //debugan
        wp_redirect(Veritrans_Vtweb::getRedirectionUrl($vt_params));
        exit;
    } else {
        $fail = true;
        // errors were detected
    }
    if ($fail !== false) {
        // if errors are present, send the user back to the purchase page so they can be corrected
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    }
}
function sagepay_direct_ipn()
{
    global $edd_options;
    if (isset($_REQUEST['MD']) && isset($_REQUEST['PaRes']) && $_GET['sagepay_direct'] == 'ipn') {
        $request_array = array('MD' => $_REQUEST['MD'], 'PARes' => $_REQUEST['PaRes'], 'VendorTxCode' => EDD()->session->get('sagepay_vtc'));
        $request = http_build_query($request_array);
        if ($edd_options['sagepay_direct_mode'] == 'test') {
            $gateway_url = 'https://test.sagepay.com/gateway/service/direct3dcallback.vsp';
        } else {
            if ($edd_options['sagepay_direct_mode'] == 'live') {
                $gateway_url = 'https://live.sagepay.com/gateway/service/direct3dcallback.vsp';
            }
        }
        $response = wp_remote_post($gateway_url, array('body' => $request, 'method' => 'POST', 'sslverify' => false));
        if (!is_wp_error($response) && $response['response']['code'] >= 200 && $response['response']['code'] < 300) {
            $resp = array();
            $lines = preg_split('/\\r\\n|\\r|\\n/', $response['body']);
            foreach ($lines as $line) {
                $key_value = preg_split('/=/', $line, 2);
                if (count($key_value) > 1) {
                    $resp[trim($key_value[0])] = trim($key_value[1]);
                }
            }
            if ($resp['Status'] == "OK" || $resp['Status'] == "REGISTERED" || $resp['Status'] == "AUTHENTICATED") {
                edd_update_payment_status(EDD()->session->get('sagepay_oid'), 'publish');
                edd_set_payment_transaction_id($payment, $resp['VPSTxId']);
                edd_empty_cart();
                edd_send_to_success_page();
            } else {
                if ($resp['Status'] == "3DAUTH") {
                    if ($resp['3DSecureStatus'] == 'OK') {
                        if (isset($resp['ACSURL']) && isset($resp['MD'])) {
                            $array = array('PaReq' => $resp['PAReq'], 'MD' => $resp['MD'], 'TermUrl' => trailingslashit(home_url()) . '?sagepay_direct=ipn');
                            $sagepay_arg_array = array();
                            foreach ($array as $key => $value) {
                                $sagepay_arg_array[] = '<input type="hidden" name="' . esc_attr($key) . '" value="' . esc_attr($value) . '" />';
                            }
                            echo '<form action="' . $resp['ACSURL'] . '" method="post" name="sagepay_direct_3dsecure_form" >
								' . implode('', $sagepay_arg_array) . '
							</form>		
							<b> Please wait while you are being redirected.</b>			
							<script type="text/javascript" event="onload">
								ocument.sagepay_direct_3dsecure_form.submit();
							</script>';
                        }
                    }
                } else {
                    if (isset($resp['StatusDetail'])) {
                        edd_set_error('error_tranasction_failed', __('Transaction Failed. ' . $resp['StatusDetail'], 'sagepay_direct_patsatech'));
                        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
                    } else {
                        edd_set_error('error_tranasction_failed', __('Transaction Failed with ' . $resp['Status'] . ' status for Unknown Reason.', 'sagepay_direct_patsatech'));
                        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
                    }
                }
            }
        } else {
            edd_set_error('error_tranasction_failed', __('Gateway Error. Please Notify the Store Owner about this error.', 'sagepay_direct_patsatech'));
            edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
        }
    }
}
 /**
  * Process the purchase and create the charge in Amazon
  *
  * @access public
  * @since  2.4
  * @param  $purchase_data array Cart details
  * @return void
  */
 public function process_purchase($purchase_data)
 {
     if (empty($purchase_data['post_data']['edd_amazon_reference_id'])) {
         edd_set_error('missing_reference_id', __('Missing Reference ID, please try again', 'edd'));
     }
     $errors = edd_get_errors();
     if ($errors) {
         edd_send_back_to_checkout('?payment-mode=amazon');
     }
     $args = apply_filters('edd_amazon_charge_args', array('merchant_id' => edd_get_option('amazon_seller_id', ''), 'amazon_reference_id' => $purchase_data['post_data']['edd_amazon_reference_id'], 'authorization_reference_id' => $purchase_data['purchase_key'], 'charge_amount' => $purchase_data['price'], 'currency_code' => edd_get_currency(), 'charge_note' => html_entity_decode(edd_get_purchase_summary($purchase_data, false)), 'charge_order_id' => $purchase_data['purchase_key'], 'store_name' => remove_accents(wp_specialchars_decode(get_bloginfo('name'), ENT_QUOTES)), 'transaction_timeout' => 0), $purchase_data);
     $args['platform_id'] = 'A3JST9YM1SX7LB';
     $charge = $this->client->charge($args);
     if (200 == $charge->response['Status']) {
         $charge = new ResponseParser($charge->response);
         $charge = $charge->toArray();
         $status = $charge['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['State'];
         if ('Declined' === $status) {
             $reason = $charge['AuthorizeResult']['AuthorizationDetails']['AuthorizationStatus']['ReasonCode'];
             edd_set_error('payment_declined', sprintf(__('Your payment could not be authorized, please try a different payment method. Reason: %s', 'edd'), $reason));
             edd_send_back_to_checkout('?payment-mode=amazon&amazon_reference_id=' . $purchase_data['post_data']['edd_amazon_reference_id']);
         }
         // Setup payment data to be recorded
         $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'gateway' => $this->gateway_id, 'status' => 'pending');
         $payment_id = edd_insert_payment($payment_data);
         $authorization_id = $charge['AuthorizeResult']['AuthorizationDetails']['AmazonAuthorizationId'];
         $capture_id = str_replace('-A', '-C', $authorization_id);
         $reference_id = sanitize_text_field($_POST['edd_amazon_reference_id']);
         // Confirm the capture was completed
         $capture = $this->client->getCaptureDetails(array('merchant_id' => edd_get_option('amazon_seller_id', ''), 'amazon_capture_id' => $capture_id));
         $capture = new ResponseParser($capture->response);
         $capture = $capture->toArray();
         // Check capture status
         edd_update_payment_meta($payment_id, '_edd_amazon_authorization_id', $authorization_id);
         edd_update_payment_meta($payment_id, '_edd_amazon_capture_id', $capture_id);
         edd_set_payment_transaction_id($payment_id, $reference_id);
         edd_update_payment_status($payment_id, 'publish');
         // Empty the shopping cart
         edd_empty_cart();
         edd_send_to_success_page();
     } else {
         // Set an error
         edd_set_error('amazon_error', sprintf(__('There was an issue processing your payment. Amazon error: %s', 'edd'), print_r($charge, true)));
         edd_send_back_to_checkout('?payment-mode=amazon&amazon_reference_id=' . $purchase_data['post_data']['edd_amazon_reference_id']);
     }
 }
Ejemplo n.º 24
0
/**
 * Don't allow multiple pledges to be made at once if
 * it is not set to allow them to. When a single campaign page
 * is loaded (they are browsing again), clear their cart.
 *
 * @since Appthemer CrowdFunding 1.8
 *
 * @return void
 */
function atcf_clear_cart()
{
    if (is_admin() || defined('DOING_AJAX')) {
        return;
    }
    edd_empty_cart();
}
Ejemplo n.º 25
0
function mondca_process_payment($purchase_data)
{
    global $edd_options;
    // check there is a gateway name
    if (!isset($purchase_data['post_data']['edd-gateway'])) {
        return;
    }
    // collect payment data
    $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'user_info' => $purchase_data['user_info'], 'cart_details' => $purchase_data['cart_details'], 'gateway' => 'mondca', 'status' => 'pending');
    if (!mondca_is_credit_card_number($purchase_data['post_data']['card_number'])) {
        edd_set_error('invalid_card_number', __('Credit Card Number is not valid.', 'mondca_patsatech'));
    }
    if (!mondca_is_correct_expire_date(date("y", strtotime($purchase_data['post_data']['card_exp_month'])), $purchase_data['post_data']['card_exp_year'])) {
        edd_set_error('invalid_card_expiry', __('Card Expire Date is not valid.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_cvc']) {
        edd_set_error('invalid_card_cvc', __('Card CVV is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_name']) {
        edd_set_error('invalid_card_name', __('CardHolder Name is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_address']) {
        edd_set_error('invalid_card_address', __('Billing Address is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_zip']) {
        edd_set_error('invalid_card_zip', __('Post Code is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_state']) {
        edd_set_error('invalid_card_state', __('State is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['card_city']) {
        edd_set_error('invalid_card_city', __('City is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['edd_first']) {
        edd_set_error('invalid_edd_first', __('First Name is not entered.', 'mondca_patsatech'));
    }
    if (!$purchase_data['post_data']['edd_last']) {
        edd_set_error('invalid_edd_last', __('Last Name is not entered.', 'mondca_patsatech'));
    }
    $errors = edd_get_errors();
    if ($errors) {
        // problems? send back
        edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
    } else {
        // record the pending payment
        $payment = edd_insert_payment($payment_data);
        // check payment
        if (!$payment) {
            // problems? send back
            edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
        } else {
            $store_id = $edd_options['mondca_storeid'];
            $api_token = $edd_options['mondca_apitoken'];
            $type = 'purchase';
            //$cust_id = $order->order_key;
            $amount = number_format($purchase_data['price'], 2, '.', '');
            $pan = $purchase_data['post_data']['card_number'];
            $cavv = $purchase_data['post_data']['card_cvc'];
            $expiry_date = substr($purchase_data['post_data']['card_exp_year'], -2) . sprintf("%02s", $purchase_data['post_data']['card_exp_month']);
            $crypt = '7';
            $status_check = 'false';
            $stamp = date("YdmHisB");
            $orderid = $stamp . '|' . $payment;
            /***************** Transactional Associative Array ********************/
            //$arr=explode("|",$teststring);
            $txnArray = array('type' => $type, 'order_id' => $orderid, 'cust_id' => '', 'amount' => $amount, 'pan' => $pan, 'expdate' => $expiry_date, 'cavv' => $cavv);
            /********************** Transaction Object ****************************/
            $mpgTxn = new mpgTransaction($txnArray);
            /************************ Request Object ******************************/
            $mpgRequest = new mpgRequest($mpgTxn);
            /*********************** HTTPSPost Object ****************************/
            $mpgHttpPost = new mpgHttpsPost($store_id, $api_token, $mpgRequest);
            /*************************** Response *********************************/
            $mpgResponse = $mpgHttpPost->getMpgResponse();
            $txnno = $mpgResponse->getTxnNumber();
            $receipt = explode("|", $mpgResponse->getReceiptId());
            $respcode = $mpgResponse->getResponseCode();
            $refnum = $mpgResponse->getReferenceNum();
            $auth = $mpgResponse->getAuthCode();
            $mess = $mpgResponse->getMessage();
            if ($respcode < '50' && $respcode > '0') {
                edd_update_payment_status($payment, 'publish');
                edd_insert_payment_note($payment, sprintf(__('Moneris CA Payment %s. The Transaction Id is %s', 'mondca_patsatech'), $mess, $txnno));
                edd_empty_cart();
                edd_send_to_success_page();
            } else {
                edd_insert_payment_note($payment, sprintf(__('Transaction Error. Message : %s', 'mondca_patsatech'), $mess));
                edd_set_error('error_tranasction_failed', sprintf(__('Transaction Error. Message : %s', 'mondca_patsatech'), $mess));
                edd_send_back_to_checkout('?payment-mode=' . $purchase_data['post_data']['edd-gateway']);
            }
        }
    }
}
 /**
  * Update the status of the specified payment
  *
  * @param Pronamic_Pay_Payment $payment
  */
 public static function status_update(Pronamic_Pay_Payment $payment)
 {
     $source_id = $payment->get_source_id();
     $data = new Pronamic_WP_Pay_Extensions_EDD_PaymentData($source_id, array());
     // Only update if order is not completed
     $should_update = edd_get_payment_status($source_id) !== Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_PUBLISH;
     if ($should_update) {
         switch ($payment->get_status()) {
             case Pronamic_WP_Pay_Statuses::CANCELLED:
                 // Nothing to do?
                 break;
             case Pronamic_WP_Pay_Statuses::EXPIRED:
                 edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_ABANDONED);
                 break;
             case Pronamic_WP_Pay_Statuses::FAILURE:
                 edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_FAILED);
                 break;
             case Pronamic_WP_Pay_Statuses::SUCCESS:
                 edd_insert_payment_note($source_id, __('Payment completed.', 'pronamic_ideal'));
                 /*
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L36
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/admin/payments/view-order-details.php#L199-L206
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/payments/functions.php#L1312-L1332
                  * @see https://github.com/easydigitaldownloads/Easy-Digital-Downloads/blob/2.2.8/includes/gateways/paypal-standard.php#L555-L576
                  */
                 edd_update_payment_status($source_id, Pronamic_WP_Pay_Extensions_EDD_EasyDigitalDownloads::ORDER_STATUS_PUBLISH);
                 edd_empty_cart();
                 break;
             case Pronamic_WP_Pay_Statuses::OPEN:
                 edd_insert_payment_note($source_id, __('Payment open.', 'pronamic_ideal'));
                 break;
             default:
                 edd_insert_payment_note($source_id, __('Payment unknown.', 'pronamic_ideal'));
                 break;
         }
     }
 }
Ejemplo n.º 27
0
/**
 * Complete a purchase
 *
 * Performs all necessary actions to complete a purchase.
 * Triggered by the edd_update_payment_status() function.
 *
 * @since 1.0.8.3
 * @param int $payment_id the ID number of the payment
 * @param string $new_status the status of the payment, probably "publish"
 * @param string $old_status the status of the payment prior to being marked as "complete", probably "pending"
 * @return void
*/
function edd_complete_purchase($payment_id, $new_status, $old_status)
{
    if ($old_status == 'publish' || $old_status == 'complete') {
        return;
    }
    // Make sure that payments are only completed once
    // Make sure the payment completion is only processed when new status is complete
    if ($new_status != 'publish' && $new_status != 'complete') {
        return;
    }
    $creation_date = get_post_field('post_date', $payment_id, 'raw');
    $completed_date = edd_get_payment_completed_date($payment_id);
    $user_info = edd_get_payment_meta_user_info($payment_id);
    $customer_id = edd_get_payment_customer_id($payment_id);
    $amount = edd_get_payment_amount($payment_id);
    $cart_details = edd_get_payment_meta_cart_details($payment_id);
    do_action('edd_pre_complete_purchase', $payment_id);
    if (is_array($cart_details)) {
        // Increase purchase count and earnings
        foreach ($cart_details as $cart_index => $download) {
            // "bundle" or "default"
            $download_type = edd_get_download_type($download['id']);
            $price_id = isset($download['item_number']['options']['price_id']) ? (int) $download['item_number']['options']['price_id'] : false;
            // Increase earnings and fire actions once per quantity number
            for ($i = 0; $i < $download['quantity']; $i++) {
                // Ensure these actions only run once, ever
                if (empty($completed_date)) {
                    edd_record_sale_in_log($download['id'], $payment_id, $price_id, $creation_date);
                    do_action('edd_complete_download_purchase', $download['id'], $payment_id, $download_type, $download, $cart_index);
                }
            }
            // Increase the earnings for this download ID
            edd_increase_earnings($download['id'], $download['price']);
            edd_increase_purchase_count($download['id'], $download['quantity']);
        }
        // Clear the total earnings cache
        delete_transient('edd_earnings_total');
        // Clear the This Month earnings (this_monththis_month is NOT a typo)
        delete_transient(md5('edd_earnings_this_monththis_month'));
        delete_transient(md5('edd_earnings_todaytoday'));
    }
    // Increase the customer's purchase stats
    $customer = new EDD_Customer($customer_id);
    $customer->increase_purchase_count();
    $customer->increase_value($amount);
    edd_increase_total_earnings($amount);
    // Check for discount codes and increment their use counts
    if (!empty($user_info['discount']) && $user_info['discount'] !== 'none') {
        $discounts = array_map('trim', explode(',', $user_info['discount']));
        if (!empty($discounts)) {
            foreach ($discounts as $code) {
                edd_increase_discount_usage($code);
            }
        }
    }
    // Ensure this action only runs once ever
    if (empty($completed_date)) {
        // Save the completed date
        edd_update_payment_meta($payment_id, '_edd_completed_date', current_time('mysql'));
        do_action('edd_complete_purchase', $payment_id);
    }
    // Empty the shopping cart
    edd_empty_cart();
}
Ejemplo n.º 28
0
/**
 * Processes the license upgrade
 */
function affwp_process_license_upgrade()
{
    // get type. plus, professional or ultimate
    $type = isset($_GET['type']) ? strtolower($_GET['type']) : '';
    $license = isset($_GET['key']) ? strtolower($_GET['key']) : '';
    if (!is_user_logged_in() || 'plus' !== $type && 'professional' !== $type && 'ultimate' !== $type) {
        // Isn't logged in, so go back to pricing
        wp_redirect(home_url('/pricing'));
        exit;
    }
    $affwp_id = affwp_get_affiliatewp_id();
    $licenses = affwp_get_users_licenses();
    $has_ultimate_license = in_array(3, affwp_get_users_price_ids());
    $has_professional_license = in_array(2, affwp_get_users_price_ids());
    $has_plus_license = in_array(1, affwp_get_users_price_ids());
    $has_personal_license = in_array(0, affwp_get_users_price_ids());
    switch ($type) {
        case 'ultimate':
            if ($has_professional_license) {
                $discount = 199;
            } elseif ($has_plus_license) {
                $discount = 99;
            } elseif ($has_personal_license) {
                $discount = 49;
            } else {
                // Hasn't purchased, so go back to pricing
                wp_redirect(home_url('/pricing'));
                exit;
            }
            $price_id = 3;
            break;
        case 'professional':
            if ($has_plus_license) {
                $discount = 99;
            } elseif ($has_personal_license) {
                $discount = 49;
            } else {
                // Hasn't purchased, so go back to pricing
                wp_redirect(home_url('/pricing'));
                exit;
            }
            $price_id = 2;
            break;
        case 'plus':
            if ($has_personal_license) {
                $discount = 49;
            } else {
                // Hasn't purchased, so go back to pricing
                wp_redirect(home_url('/pricing'));
                exit;
            }
            $price_id = 1;
            break;
    }
    // end switch
    // Remove anything in the cart
    edd_empty_cart();
    // Add the correct license
    edd_add_to_cart($affwp_id, array('price_id' => $price_id, 'upgrade' => $license));
    EDD()->session->set('is_upgrade', '1');
    EDD()->session->set('upgrade_price_id', $price_id);
    EDD()->session->set('upgrade_key', $license);
    EDD()->session->set('upgrade_discount', $discount);
    wp_redirect(edd_get_checkout_uri());
    exit;
}
 /**
  * Simple wrapper for the api call / response treatement
  *
  * @param string $url
  * @param array $fields
  */
 private function performPayment($url, $fields)
 {
     $result = $this->curlAction($url, $fields);
     $result = $this->getDataTransaction($result);
     if ($result['CODEREPONSE'] == '00000') {
         edd_update_payment_status($this->payment, 'publish');
         edd_complete_purchase($this->payment, 'publish', 'pending');
         foreach ($this->purchaseDatas['downloads'] as $download) {
             $log = edd_record_log('Payment', 'Payment', $download['id'], 'sale');
             update_post_meta($log, '_edd_log_payment_id', $this->payment);
         }
         edd_empty_cart();
         edd_send_to_success_page();
     } else {
         if ($result['CODEREPONSE'] == '00001' || $result['CODEREPONSE'] == '00003') {
             $settings = $this->getSettings();
             // if the first prod url failed try the second
             if (!$settings['preprod'] && $url !== $settings['url_prod_2'] && isset($settings['url_prod_2'])) {
                 $this->performPayment($settings['url_prod_2'], $fields);
             }
             edd_record_gateway_error(__('Payment Error', 'edd'), __('Payment gateways unavailable', 'edd'));
             edd_send_back_to_checkout('?payment-mode=' . $this->gateway);
         } else {
             edd_record_gateway_error(__('Payment Error', 'edd'), $result['COMMENTAIRE']);
             edd_send_back_to_checkout('?payment-mode=' . $this->gateway);
         }
     }
 }
Ejemplo n.º 30
0
/**
 * Process stripe checkout submission
 *
 * @access      public
 * @since       1.0
 * @return      void
 */
function edds_process_stripe_payment($purchase_data)
{
    global $edd_options;
    if (!class_exists('Stripe')) {
        require_once EDDS_PLUGIN_DIR . '/Stripe/Stripe.php';
    }
    if (edd_is_test_mode()) {
        $secret_key = trim($edd_options['test_secret_key']);
    } else {
        $secret_key = trim($edd_options['live_secret_key']);
    }
    $purchase_summary = edd_get_purchase_summary($purchase_data, false);
    // make sure we don't have any left over errors present
    edd_clear_errors();
    if (!isset($_POST['edd_stripe_token'])) {
        // check for fallback mode
        if (isset($edd_options['stripe_js_fallback'])) {
            if (!isset($_POST['card_name']) || strlen(trim($_POST['card_name'])) == 0) {
                edd_set_error('no_card_name', __('Please enter a name for the credit card.', 'edds'));
            }
            if (!isset($_POST['card_number']) || strlen(trim($_POST['card_number'])) == 0) {
                edd_set_error('no_card_number', __('Please enter a credit card number.', 'edds'));
            }
            if (!isset($_POST['card_cvc']) || strlen(trim($_POST['card_cvc'])) == 0) {
                edd_set_error('no_card_cvc', __('Please enter a CVC/CVV for the credit card.', 'edds'));
            }
            if (!isset($_POST['card_exp_month']) || strlen(trim($_POST['card_exp_month'])) == 0) {
                edd_set_error('no_card_exp_month', __('Please enter a expiration month.', 'edds'));
            }
            if (!isset($_POST['card_exp_year']) || strlen(trim($_POST['card_exp_year'])) == 0) {
                edd_set_error('no_card_exp_year', __('Please enter a expiration year.', 'edds'));
            }
            $card_data = array('number' => $purchase_data['card_info']['card_number'], 'name' => $purchase_data['card_info']['card_name'], 'exp_month' => $purchase_data['card_info']['card_exp_month'], 'exp_year' => $purchase_data['card_info']['card_exp_year'], 'cvc' => $purchase_data['card_info']['card_cvc'], 'address_line1' => $purchase_data['card_info']['card_address'], 'address_line2' => $purchase_data['card_info']['card_address_2'], 'address_city' => $purchase_data['card_info']['card_city'], 'address_zip' => $purchase_data['card_info']['card_zip'], 'address_state' => $purchase_data['card_info']['card_state'], 'address_country' => $purchase_data['card_info']['card_country']);
        } else {
            // no Stripe token
            edd_set_error('no_token', __('Missing Stripe token. Please contact support.', 'edds'));
            edd_record_gateway_error(__('Missing Stripe Token', 'edds'), __('A Stripe token failed to be generated. Please check Stripe logs for more information', ' edds'));
        }
    } else {
        $card_data = $_POST['edd_stripe_token'];
    }
    $errors = edd_get_errors();
    if (!$errors) {
        try {
            Stripe::setApiKey($secret_key);
            // setup the payment details
            $payment_data = array('price' => $purchase_data['price'], 'date' => $purchase_data['date'], 'user_email' => $purchase_data['user_email'], 'purchase_key' => $purchase_data['purchase_key'], 'currency' => edd_get_currency(), 'downloads' => $purchase_data['downloads'], 'cart_details' => $purchase_data['cart_details'], 'user_info' => $purchase_data['user_info'], 'status' => 'pending', 'gateway' => 'stripe');
            $customer_exists = false;
            if (is_user_logged_in()) {
                $user = get_user_by('email', $purchase_data['user_email']);
                if ($user) {
                    $customer_id = get_user_meta($user->ID, edd_stripe_get_customer_key(), true);
                    if ($customer_id) {
                        $customer_exists = true;
                        try {
                            // Update the customer to ensure their card data is up to date
                            $cu = Stripe_Customer::retrieve($customer_id);
                            if (isset($cu->deleted) && $cu->deleted) {
                                // This customer was deleted
                                $customer_exists = false;
                            } else {
                                $cu->card = $card_data;
                                $cu->save();
                            }
                            // No customer found
                        } catch (Exception $e) {
                            $customer_exists = false;
                        }
                    }
                }
            }
            if (!$customer_exists) {
                // Create a customer first so we can retrieve them later for future payments
                $customer = Stripe_Customer::create(array('description' => $purchase_data['user_email'], 'email' => $purchase_data['user_email'], 'card' => $card_data));
                $customer_id = is_array($customer) ? $customer['id'] : $customer->id;
                if (is_user_logged_in()) {
                    update_user_meta($user->ID, edd_stripe_get_customer_key(), $customer_id);
                }
            }
            if (edds_is_recurring_purchase($purchase_data) && (!empty($customer) || $customer_exists)) {
                // Process a recurring subscription purchase
                $cu = Stripe_Customer::retrieve($customer_id);
                /**********************************************************
                 * Taxes, fees, and discounts have to be handled differently
                 * with recurring subscriptions, so each is added as an
                 * invoice item and then charged as one time items
                 **********************************************************/
                $invoice_items = array();
                $needs_invoiced = false;
                if ($purchase_data['tax'] > 0 && !edd_prices_include_tax()) {
                    if (edds_is_zero_decimal_currency()) {
                        $tax = $purchase_data['tax'];
                    } else {
                        $tax = $purchase_data['tax'] * 100;
                    }
                    $invoice = Stripe_InvoiceItem::create(array('customer' => $customer_id, 'amount' => $tax, 'currency' => edd_get_currency(), 'description' => sprintf(__('Sales tax for order %s', 'edds'), $purchase_data['purchase_key'])));
                    if (!empty($invoice->id)) {
                        $invoice_items[] = $invoice->id;
                    }
                    $needs_invoiced = true;
                }
                if (!empty($purchase_data['fees'])) {
                    foreach ($purchase_data['fees'] as $fee) {
                        if (edds_is_zero_decimal_currency()) {
                            $fee_amount = $fee['amount'];
                        } else {
                            $fee_amount = $fee['amount'] * 100;
                        }
                        $invoice = Stripe_InvoiceItem::create(array('customer' => $customer_id, 'amount' => $fee_amount, 'currency' => edd_get_currency(), 'description' => $fee['label']));
                        if (!empty($invoice->id)) {
                            $invoice_items[] = $invoice->id;
                        }
                    }
                    $needs_invoiced = true;
                }
                if ($purchase_data['discount'] > 0) {
                    if (edds_is_zero_decimal_currency()) {
                        $discount_amount = $purchase_data['discount'];
                    } else {
                        $discount_amount = $purchase_data['discount'] * 100;
                    }
                    $invoice = Stripe_InvoiceItem::create(array('customer' => $customer_id, 'amount' => $discount_amount * -1, 'currency' => edd_get_currency(), 'description' => $purchase_data['user_info']['discount']));
                    if (!empty($invoice->id)) {
                        $invoice_items[] = $invoice->id;
                    }
                    $needs_invoiced = true;
                }
                try {
                    $plan_id = edds_get_plan_id($purchase_data);
                    // record the pending payment
                    $payment = edd_insert_payment($payment_data);
                    set_transient('_edd_recurring_payment_' . $payment, '1', DAY_IN_SECONDS);
                    // Store the parent payment ID in the user meta
                    EDD_Recurring_Customer::set_customer_payment_id($user->ID, $payment);
                    // Update the customer's subscription in Stripe
                    $customer_response = $cu->updateSubscription(array('plan' => $plan_id));
                    // Set user as subscriber
                    EDD_Recurring_Customer::set_as_subscriber($user->ID);
                    // store the customer recurring ID
                    EDD_Recurring_Customer::set_customer_id($user->ID, $customer_id);
                    // Set the customer status
                    EDD_Recurring_Customer::set_customer_status($user->ID, 'active');
                    // Calculate the customer's new expiration date
                    $new_expiration = EDD_Recurring_Customer::calc_user_expiration($user->ID, $payment);
                    // Set the customer's new expiration date
                    EDD_Recurring_Customer::set_customer_expiration($user->ID, $new_expiration);
                } catch (Stripe_CardError $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    if (isset($err['message'])) {
                        edd_set_error('payment_error', $err['message']);
                    } else {
                        edd_set_error('payment_error', __('There was an error processing your payment, please ensure you have entered your card number correctly.', 'edds'));
                    }
                    edd_record_gateway_error(__('Stripe Error', 'edds'), sprintf(__('There was an error while processing a Stripe payment. Payment data: %s', ' edds'), json_encode($err)), 0);
                } catch (Stripe_ApiConnectionError $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    edd_set_error('payment_error', __('There was an error processing your payment (Stripe\'s API is down), please try again', 'edds'));
                    edd_record_gateway_error(__('Stripe Error', 'edds'), sprintf(__('There was an error processing your payment (Stripe\'s API was down). Error: %s', 'edds'), json_encode($err['message'])), 0);
                } catch (Stripe_InvalidRequestError $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    // Bad Request of some sort. Maybe Christoff was here ;)
                    if (isset($err['message'])) {
                        edd_set_error('request_error', $err['message']);
                    } else {
                        edd_set_error('request_error', sprintf(__('The Stripe API request was invalid, please try again. Error: %s', 'edds'), json_encode($err['message'])));
                    }
                } catch (Stripe_ApiError $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    if (isset($err['message'])) {
                        edd_set_error('request_error', $err['message']);
                    } else {
                        edd_set_error('request_error', __('The Stripe API request was invalid, please try again', 'edds'));
                    }
                    edd_record_gateway_error(__('Stripe Error', 'edds'), sprintf(__('There was an error with Stripe\'s API: ', 'edds'), json_encode($err['message'])), 0);
                } catch (Stripe_AuthenticationError $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    // Authentication error. Stripe keys in settings are bad.
                    if (isset($err['message'])) {
                        edd_set_error('request_error', $err['message']);
                    } else {
                        edd_set_error('api_error', __('The API keys entered in settings are incorrect', 'edds'));
                    }
                } catch (Stripe_Error $e) {
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    // generic stripe error
                    if (isset($err['message'])) {
                        edd_set_error('request_error', $err['message']);
                    } else {
                        edd_set_error('api_error', __('Something went wrong.', 'edds'));
                    }
                } catch (Exception $e) {
                    // some sort of other error
                    $body = $e->getJsonBody();
                    $err = $body['error'];
                    if (isset($err['message'])) {
                        edd_set_error('request_error', $err['message']);
                    } else {
                        edd_set_error('api_error', __('Something went wrong.', 'edds'));
                    }
                }
                if (!empty($err)) {
                    // Delete any invoice items we created for fees, taxes, and other
                    foreach ($invoice_items as $invoice) {
                        $ii = Stripe_InvoiceItem::retrieve($invoice);
                        $ii->delete();
                    }
                    edd_send_back_to_checkout('?payment-mode=stripe');
                }
            } elseif (!empty($customer) || $customer_exists) {
                // Process a normal one-time charge purchase
                if (!isset($edd_options['stripe_preapprove_only'])) {
                    if (edds_is_zero_decimal_currency()) {
                        $amount = $purchase_data['price'];
                    } else {
                        $amount = $purchase_data['price'] * 100;
                    }
                    $charge = Stripe_Charge::create(array("amount" => $amount, "currency" => edd_get_currency(), "customer" => $customer_id, "description" => html_entity_decode($purchase_summary, ENT_COMPAT, 'UTF-8'), 'statement_description' => substr($purchase_summary, 0, 15), 'metadata' => array('email' => $purchase_data['user_info']['email'])));
                }
                // record the pending payment
                $payment = edd_insert_payment($payment_data);
            } else {
                edd_record_gateway_error(__('Customer Creation Failed', 'edds'), sprintf(__('Customer creation failed while processing a payment. Payment Data: %s', ' edds'), json_encode($payment_data)), $payment);
            }
            if ($payment && (!empty($customer_id) || !empty($charge))) {
                if (!empty($needs_invoiced)) {
                    try {
                        // Create the invoice containing taxes / discounts / fees
                        $invoice = Stripe_Invoice::create(array('customer' => $customer_id));
                        $invoice = $invoice->pay();
                    } catch (Exception $e) {
                        // If there is nothing to pay, it just means the invoice item was taken care of with the subscription payment
                    }
                }
                if (isset($edd_options['stripe_preapprove_only'])) {
                    edd_update_payment_status($payment, 'preapproval');
                    add_post_meta($payment, '_edds_stripe_customer_id', $customer_id);
                } else {
                    edd_update_payment_status($payment, 'publish');
                }
                // You should be using Stripe's API here to retrieve the invoice then confirming it's been paid
                if (!empty($charge)) {
                    edd_insert_payment_note($payment, 'Stripe Charge ID: ' . $charge->id);
                    if (function_exists('edd_set_payment_transaction_id')) {
                        edd_set_payment_transaction_id($payment, $charge->id);
                    }
                } elseif (!empty($customer_id)) {
                    edd_insert_payment_note($payment, 'Stripe Customer ID: ' . $customer_id);
                }
                edd_empty_cart();
                edd_send_to_success_page();
            } else {
                edd_set_error('payment_not_recorded', __('Your payment could not be recorded, please contact the site administrator.', 'edds'));
                // if errors are present, send the user back to the purchase page so they can be corrected
                edd_send_back_to_checkout('?payment-mode=stripe');
            }
        } catch (Stripe_CardError $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            if (isset($err['message'])) {
                edd_set_error('payment_error', $err['message']);
            } else {
                edd_set_error('payment_error', __('There was an error processing your payment, please ensure you have entered your card number correctly.', 'edds'));
            }
            edd_record_gateway_error(__('Stripe Error', 'edds'), sprintf(__('There was an error while processing a Stripe payment. Payment data: %s', ' edds'), json_encode($err)), 0);
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Stripe_ApiConnectionError $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            edd_set_error('payment_error', __('There was an error processing your payment (Stripe\'s API is down), please try again', 'edds'));
            edd_record_gateway_error(__('Stripe Error', 'edds'), sprintf(__('There was an error processing your payment (Stripe\'s API was down). Error: %s', 'edds'), json_encode($err['message'])), 0);
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Stripe_InvalidRequestError $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            // Bad Request of some sort. Maybe Christoff was here ;)
            if (isset($err['message'])) {
                edd_set_error('request_error', $err['message']);
            } else {
                edd_set_error('request_error', __('The Stripe API request was invalid, please try again', 'edds'));
            }
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Stripe_ApiError $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            if (isset($err['message'])) {
                edd_set_error('request_error', $err['message']);
            } else {
                edd_set_error('request_error', __('The Stripe API request was invalid, please try again', 'edds'));
            }
            edd_set_error('request_error', sprintf(__('The Stripe API request was invalid, please try again. Error: %s', 'edds'), json_encode($err['message'])));
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Stripe_AuthenticationError $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            // Authentication error. Stripe keys in settings are bad.
            if (isset($err['message'])) {
                edd_set_error('request_error', $err['message']);
            } else {
                edd_set_error('api_error', __('The API keys entered in settings are incorrect', 'edds'));
            }
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Stripe_Error $e) {
            $body = $e->getJsonBody();
            $err = $body['error'];
            // generic stripe error
            if (isset($err['message'])) {
                edd_set_error('request_error', $err['message']);
            } else {
                edd_set_error('api_error', __('Something went wrong.', 'edds'));
            }
            edd_send_back_to_checkout('?payment-mode=stripe');
        } catch (Exception $e) {
            // some sort of other error
            $body = $e->getJsonBody();
            $err = $body['error'];
            if (isset($err['message'])) {
                edd_set_error('request_error', $err['message']);
            } else {
                edd_set_error('api_error', __('Something went wrong.', 'edds'));
            }
            edd_send_back_to_checkout('?payment-mode=stripe');
        }
    } else {
        edd_send_back_to_checkout('?payment-mode=stripe');
    }
}