__('PayPal Settings', 'galaxyfunder'), 'type' => 'title', 'desc' => '', 'id' => '_cf_payments_inbuilt_text' ), array( 'name' => __('Send Payment to Campaign Creator if PayPal ID is Provided', 'galaxyfunder'), 'desc' => __('PayPal Payments are Directly Sent to Campaign Creator', 'galaxyfunder'), 'tip' => '', 'css' => 'min-width:550px;', 'id' => 'cf_enable_paypal_campaign_email_id', 'std' => 'no', 'type' => 'checkbox', 'newids' => 'cf_enable_paypal_campaign_email_id', 'desc_tip' => false, ), array('type' => 'sectionend', 'id' => '_cf_payments_inbuilt_text'), )); } public static function crowdfunding_process_payments_admin_settings() { woocommerce_admin_fields(CFPaymentsAdmin::crowdfunding_payments_admin_options()); } public static function crowdfunding_process_payments_update_settings() { woocommerce_update_options(CFPaymentsAdmin::crowdfunding_payments_admin_options()); } public static function crowdfunding_payments_default_settings() { global $woocommerce; foreach (CFPaymentsAdmin::crowdfunding_payments_admin_options() as $setting) { if (isset($setting['newids']) && ($setting['std'])) { if (get_option($setting['newids']) == FALSE) { add_option($setting['newids'], $setting['std']); } } } } public static function cf_payments_reset_values() { global $woocommerce; if (isset($_POST['reset'])) { foreach (CFPaymentsAdmin::crowdfunding_payments_admin_options() as $setting) if (isset($setting['newids']) && ($setting['std'])) { delete_option($setting['newids']); add_option($setting['newids'], $setting['std']); } } } } new CFPaymentsAdmin(); add_action('woocommerce_update_options_crowdfunding_payments', array('CFPaymentsAdmin', 'crowdfunding_process_payments_update_settings')); add_action('init', array('CFPaymentsAdmin', 'crowdfunding_payments_default_settings')); add_action('woocommerce_cf_settings_tabs_crowdfunding_payments', array('CFPaymentsAdmin', 'crowdfunding_process_payments_admin_settings')); add_filter('woocommerce_cf_settings_tabs_array', array('CFPaymentsAdmin', 'crowdfunding_admin_payments_tab'), 2000); add_action('admin_init', array('CFPaymentsAdmin', 'cf_payments_reset_values'), 2); function init_cf_paypal_adaptive_payment() { if (!class_exists('WC_Payment_Gateway')) return; class CFPaypalAdaptivePayment extends WC_Payment_Gateway { function __construct() { $this->id = 'cf_paypal_adaptive'; $this->method_title = 'Galaxy Funder - PayPal Adaptive Split Payment'; $this->has_fields = true; //$this->icon = plugins_url('images/paypal.jpg', __FILE__); $this->inits_form_fields(); $this->init_settings(); $this->title = $this->get_option('title'); $this->description = $this->get_option('description'); add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options')); } function inits_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __('Enable/Disable', 'galaxyfunder'), 'type' => 'checkbox', 'label' => __('Galaxy Funder - PayPal Adaptive Split Payment', 'galaxyfunder'), 'default' => 'yes' ), 'cf_payment_mode' => array( 'title' => __('Payment Mode', 'woocommerce'), 'type' => 'select', 'label' => __('Payment Mode', 'woocommerce'), 'default' => 'chained', 'options' => array('parallel' => __('Parallel', 'galaxyfunder'), 'chained' => __('Chained', 'galaxyfunder')) ), 'title' => array( 'title' => __('Title', 'galaxyfunder'), 'type' => 'text', 'description' => __('This controls the title which the user sees during checkout.', 'galaxyfunder'), 'default' => __('Galaxy Funder - PayPal Adaptive Split Payment', 'galaxyfunder'), 'desc_tip' => true, ), 'description' => array( 'title' => __('Description', 'galaxyfunder'), 'type' => 'textarea', 'default' => 'PayPal Adaptive Payment for Galaxy Funder', 'desc_tip' => true, 'description' => __('Enter Detail Description about PayPal Adaptive Payment Gateway for Galaxy Funder', 'galaxyfunder'), ), 'primary_paypal_email' => array( 'title' => __('PayPal Email', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter Admin PayPal Email Address', 'galaxyfunder'), ), 'percentage_to_receiver' => array( 'title' => __('Percentage for Admin', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter the Percentage Value of between for Admin 0 to 100', 'galaxyfunder'), ), 'cf_paypal_application_id' => array( 'title' => __('PayPal Application ID', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter PayPal Application ID', 'galaxyfunder'), ), 'cf_paypal_security_userid' => array( 'title' => __('PayPal Security UserID', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter the PayPal Security UserID', 'galaxyfunder'), ), 'cf_paypal_security_password' => array( 'title' => __('PayPal Security Password', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter the PayPal Security Password', 'galaxyfunder'), ), 'cf_paypal_security_signature' => array( 'title' => __('PayPal Security Signature', 'galaxyfunder'), 'type' => 'text', 'default' => '', 'desc_tip' => true, 'description' => __('Please Enter PayPal Security Signature', 'galaxyfunder'), ), 'cf_paypal_cancel_url' => array( 'title' => __('Payment Cancel URL', 'woocommerce'), 'type' => 'text', 'description' => __('If Payment is cancelled Where should they be redirected', 'woocommerce'), 'default' => __(site_url(), 'woocommerce'), 'desc_tip' => true, ), 'cf_paypal_testmode' => array( 'title' => __('PayPal Adaptive sandbox', 'woocommerce'), 'type' => 'checkbox', 'label' => __('Enable PayPal Adaptive sandbox', 'woocommerce'), 'default' => 'no', 'description' => sprintf(__('PayPal Adaptive sandbox can be used to test payments. Sign up for a developer account here.', 'woocommerce'), 'https://developer.paypal.com/'), ), ); } function process_payment($order_id) { global $woocommerce; $order = new WC_Order($order_id); $payment_url = ""; $re = ""; // Mark as on-hold (we're awaiting the cheque) //$order->update_status('pending', __('Awaiting cheque payment', 'woocommerce')); //$order->payment_complete(); // Reduce stock levels $order->reduce_order_stock(); // Remove cart // $woocommerce->cart->empty_cart(); // var_dump($order->get_items()); // // print_r($order->get_items(), true); // return; $primary_receiver_mail = $this->get_option('primary_paypal_email'); $getprimary_percentage = $this->get_option('percentage_to_receiver'); $secondary_remaining_percentage = 100 - $this->get_option('percentage_to_receiver'); foreach ($order->get_items() as $item) { if (get_post_meta($item['product_id'], '_crowdfundingcheckboxvalue', true) == 'yes') { $productprice = $item['line_total']; $primary_user_amount [] = ($productprice * $getprimary_percentage) / 100; $secondary_user_email[] = get_post_meta($item['product_id'], 'cf_campaigner_paypal_id', true); $emailpaypal = get_post_meta($item['product_id'], 'cf_campaigner_paypal_id', true); $secondaryamount = ($productprice * $secondary_remaining_percentage) / 100; $newsecondary_email[] = array($emailpaypal => $secondaryamount); $secondary_user_amount[] = ($productprice * $secondary_remaining_percentage) / 100; } } //var_dump(array_sum($newsecondary_email)); $result = array(); foreach ($secondary_user_email as $i => $v) { if (!isset($result[$v])) { $result[$v] = 0; } $result[$v] += $secondary_user_amount[$i]; } // var_dump(count(array_unique($secondary_user_email))); // return; // var_dump($result); // var_dump(array_combine($secondary_user_email, $secondary_user_amount)); // var_dump($secondary_user_email); //var_dump(array_unique($secondary_user_email)); //var_dump(count($result)); //var_dump($result); // return; // var_dump($primary_user_amount); //var_dump(array_sum($primary_user_amount)); //$variablearray[] = (array) "receiverList.receiver(0).amount' => $primary_user_amount"; $primary_sum_of_amount = array_sum($primary_user_amount); // $variablearray = array(); // var_dump(array_filter($variablearray)); // var_dump(array_filter($receiveremailarray)); // return; if (count(array_unique($secondary_user_email)) > 5) { if (function_exists('wc_add_notice')) { wc_add_notice(__('Payment error: Maximum Receiver Count has been Reached', 'woothemes'), 'error'); } else { $woocommerce->add_error(__('Payment error: Maximum Receiver Count has been Reached', 'woothemes')); } return; } $items = $order->get_items(); foreach ($items as $item) { $productid[] = $item['product_id']; } //var_dump(get_woocommerce_currency()); $campaigner_email = get_post_meta($productid[0], 'cf_campaigner_paypal_id', true); // var_dump($campaigner_email); //adaptive payment option $primary_receiver_mail = $this->get_option('primary_paypal_email'); //$primary_user_percentage = $this->get_option('primary_r_amount_percentage'); $secondary_percentage = 100 - $this->get_option('percentage_to_receiver'); $order_total_amount = $order->order_total; if ($this->get_option('cf_payment_mode') == 'chained') { $primary_user_amount = $order_total_amount; } else { $primary_user_amount = ($order_total_amount * $this->get_option('percentage_to_receiver')) / 100; } $secondary_user1_amount = ($order_total_amount * $secondary_percentage) / 100; $success_url = $this->get_return_url($order); $cancel_url = $this->get_option('cf_paypal_cancel_url'); if ("yes" == $this->get_option('cf_paypal_testmode')) { $paypal_pay_action_url = "https://svcs.sandbox.paypal.com/AdaptivePayments/Pay"; $paypal_pay_auth_without_key_url = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_ap-payment&paykey="; } else { $paypal_pay_action_url = "https://svcs.paypal.com/AdaptivePayments/Pay"; $paypal_pay_auth_without_key_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_ap-payment&paykey="; } $ipnNotificationUrl = esc_url_raw(add_query_arg(array('ipn' => 'set', 'self_custom' => $order_id), site_url('/'))); $headers_array = array("X-PAYPAL-SECURITY-USERID" => $this->get_option('cf_paypal_security_userid'), "X-PAYPAL-SECURITY-PASSWORD" => $this->get_option('cf_paypal_security_password'), "X-PAYPAL-SECURITY-SIGNATURE" => $this->get_option('cf_paypal_security_signature'), "X-PAYPAL-APPLICATION-ID" => $this->get_option('cf_paypal_application_id'), "X-PAYPAL-REQUEST-DATA-FORMAT" => "NV", "X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON", ); if ($this->get_option('cf_payment_mode') == 'parallel') { $data_array = array(); $data_array['actionType'] = 'PAY'; $data_array['currencyCode'] = get_woocommerce_currency(); $data_array['ipnNotificationUrl'] = $ipnNotificationUrl; $data_array['receiverList.receiver(0).amount'] = $primary_sum_of_amount; $data_array['receiverList.receiver(0).email'] = $primary_receiver_mail; for ($x = 1; $x <= count(array_unique($secondary_user_email)); $x++) { $newvalues = $x - 1; $array_search_email = array_search($result[$secondary_user_email[$newvalues]], $result); $data_array["receiverList.receiver($x).amount"] = $result[$secondary_user_email[$newvalues]]; $data_array["receiverList.receiver($x).email"] = $array_search_email; } $data_array['returnUrl'] = $success_url; $data_array['cancelUrl'] = $cancel_url; $data_array['requestEnvelope.errorLanguage'] = 'en_US'; } else { $data_array = array(); $data_array['actionType'] = 'PAY'; $data_array['currencyCode'] = get_woocommerce_currency(); $data_array['ipnNotificationUrl'] = $ipnNotificationUrl; $data_array["receiverList.receiver(0).amount"] = $order->order_total; $data_array["receiverList.receiver(0).email"] = $primary_receiver_mail; $data_array["receiverList.receiver(0).primary"] = 'true'; for ($x = 1; $x <= count(array_unique($secondary_user_email)); $x++) { $newvalues = $x - 1; $array_search_email = array_search($result[$secondary_user_email[$newvalues]], $result); $data_array["receiverList.receiver($x).amount"] = $result[$secondary_user_email[$newvalues]]; $data_array["receiverList.receiver($x).email"] = $array_search_email; $data_array["receiverList.receiver($x).primary"] = 'false'; } $data_array["returnUrl"] = $success_url; $data_array["cancelUrl"] = $cancel_url; $data_array["requestEnvelope.errorLanguage"] = 'en_US'; } $post_result = wp_remote_request($paypal_pay_action_url, array('method' => 'POST', 'timeout' => 10, 'headers' => $headers_array, 'body' => $data_array)); if (is_wp_error($post_result)) { // $jso = json_decode($pay_result['body']); $re = print_r($post_result->get_error_message(), true); if (function_exists('wc_add_notice')) { wc_add_notice(__('Payment error:', 'woothemes') . $re, 'error'); } else { $woocommerce->add_error(__('Payment error:', 'woothemes') . $re); } return; } $jso = json_decode($post_result['body']); // echo $jso->responseEnvelope->ack; // echo $jso->payKey; if (isset($jso->payKey)) { $payment_url = $paypal_pay_auth_without_key_url . $jso->payKey; } //header('Location:https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_ap-payment&paykey=' . $jso->payKey); // Return thankyou redirect if ("Success" == $jso->responseEnvelope->ack) { return array( 'result' => 'success', 'redirect' => $payment_url ); } else { // update_post_meta('fppap_error_id', ); if (function_exists('wc_add_notice')) { $error_code = "
Error Code: " . $jso->error[0]->errorId; $error_message = $jso->error[0]->message; wc_add_notice(__("$error_message $error_code", 'galaxyfunder'), 'error'); } else { //$woocommerce->add_error(__('Payment error: Please Report to admin about this problem', 'woothemes') . $re); $error_code = "
Error Code: " . $jso->error[0]->errorId; $error_message = $jso->error[0]->message; $woocommerce->add_error(__("$error_message $error_code", 'galaxyfunder')); } return; } } } function cf_paypal_adaptive_payment($methods) { $methods[] = 'CFPaypalAdaptivePayment'; return $methods; } add_filter('woocommerce_payment_gateways', 'cf_paypal_adaptive_payment'); } add_action('init', 'init_cf_paypal_adaptive_payment'); function cfpap_check_ipn() { if (isset($_GET['ipn'])) { $paypal_adaptive_payment = new CFPaypalAdaptivePayment(); if ("yes" == $paypal_adaptive_payment->get_option('cf_paypal_testmode')) { $paypal_ipn_url = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate"; } elseif ("no" == $paypal_adaptive_payment->get_option('cf_paypal_testmode')) { $paypal_ipn_url = "https://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate"; } $ipn_post = !empty($_POST) ? $_POST : false; if ($ipn_post) { header('HTTP/1.1 200 OK'); $self_custom = $_GET['self_custom']; $received_post = file_get_contents("php://input"); // adaptive payment ipn message is different from normal so we handle like this $posted_response = wp_remote_request($paypal_ipn_url, array('method' => 'POST', 'timeout' => 20, 'body' => $received_post)); update_option('adaptive_verify', $posted_response['body']); $received_raw_post_array = explode('&', $received_post); $post_maded = array(); // making post from raw foreach ($received_raw_post_array as $keyval) { $keyval = explode('=', $keyval); if (count($keyval) == 2) $post_maded[urldecode($keyval[0])] = urldecode($keyval[1]); } if (strcmp($posted_response['body'], "VERIFIED") == 0) { $received_order_id = $self_custom; $total = 0; if ($paypal_adaptive_payment->get_option('cf_payment_mode') == 'parallel') { for ($i = 0; $i <= 5; $i++) { if (isset($post_maded["transaction[$i].amount"])) { $total = $total + preg_replace("/[^0-9,.]/", "", $post_maded["transaction[$i].amount"]); } } } else { $total = preg_replace("/[^0-9,.]/", "", $post_maded["transaction[0].amount"]); } update_option('pay_amount', $total); $payment_status = $post_maded['transaction[0].status']; // first user status if ($payment_status == CrowdFunding::get_order_status_for_contribution()) { $order = new WC_Order($received_order_id); if (isset($order->id)) { if ($total == $order->order_total) { $order->update_status(CrowdFunding::get_order_status_for_contribution()); } update_post_meta($order->id, 'Transaction ID', $post_maded['transaction[0].id']); } } } } update_option('adaptive_ipn', $received_post); update_option('adaptive_ipn_post_ar', $_POST); update_option('adaptive_self_cus', $_GET['self_custom']); update_option('ipn_url_decoded', $post_maded); } } add_action('init', 'cfpap_check_ipn'); ?>