/** * do_payment * * Makes the request to PayPal's DoDirectPayment API * * @access public * @param mixed $order * @param mixed $card_number * @param mixed $card_type * @param mixed $card_exp_month * @param mixed $card_exp_year * @param mixed $card_csc * @param string $centinelPAResStatus (default: '') * @param string $centinelEnrolled (default: '') * @param string $centinelCavv (default: '') * @param string $centinelEciFlag (default: '') * @param string $centinelXid (default: '') * @return void */ function do_payment($order, $card_number, $card_type, $card_exp_month, $card_exp_year, $card_csc, $centinelPAResStatus = '', $centinelEnrolled = '', $centinelCavv = '', $centinelEciFlag = '', $centinelXid = '') { /* * Display message to user if session has expired. */ if (sizeof(WC()->cart->get_cart()) == 0) { $pc_session_expired_error = apply_filters('angelleye_pc_session_expired_error', sprintf(__('Sorry, your session has expired. <a href=%s>Return to homepage →</a>', 'paypal-for-woocommerce'), '"' . home_url() . '"')); wc_add_notice($pc_session_expired_error, "error"); } /* * Check if the PayPal class has already been established. */ if (!class_exists('Angelleye_PayPal')) { require_once 'lib/angelleye/paypal-php-library/includes/paypal.class.php'; } /* * Create PayPal object. */ $PayPalConfig = array('Sandbox' => $this->testmode == 'yes' ? TRUE : FALSE, 'APIUsername' => $this->api_username, 'APIPassword' => $this->api_password, 'APISignature' => $this->api_signature); $PayPal = new Angelleye_PayPal($PayPalConfig); if (empty($GLOBALS['wp_rewrite'])) { $GLOBALS['wp_rewrite'] = new WP_Rewrite(); } $card_exp = $card_exp_month . $card_exp_year; /** * Generate PayPal request */ $DPFields = array('paymentaction' => $this->payment_action == 'Authorization' ? 'Authorization' : 'Sale', 'ipaddress' => $this->get_user_ip(), 'returnfmfdetails' => ''); $CCDetails = array('creditcardtype' => $card_type, 'acct' => $card_number, 'expdate' => $card_exp, 'cvv2' => $card_csc, 'startdate' => '', 'issuenumber' => ''); $PayerInfo = array('email' => $order->billing_email, 'firstname' => $order->billing_first_name, 'lastname' => $order->billing_last_name); $BillingAddress = array('street' => $order->billing_address_1, 'street2' => $order->billing_address_2, 'city' => $order->billing_city, 'state' => $order->billing_state, 'countrycode' => $order->billing_country, 'zip' => $order->billing_postcode, 'phonenum' => $order->billing_phone); $ShippingAddress = array('shiptoname' => $order->shipping_first_name . ' ' . $order->shipping_last_name, 'shiptostreet' => $order->shipping_address_1, 'shiptostreet2' => $order->shipping_address_2, 'shiptocity' => $order->shipping_city, 'shiptostate' => $order->shipping_state, 'shiptozip' => $order->shipping_postcode, 'shiptocountry' => $order->shipping_country, 'shiptophonenum' => $order->shipping_phone); $PaymentDetails = array('amt' => number_format($order->get_total(), 2, '.', ''), 'currencycode' => get_woocommerce_currency(), 'insuranceamt' => '', 'shipdiscamt' => '0.00', 'handlingamt' => '0.00', 'desc' => '', 'custom' => $order->customer_note ? substr(preg_replace("/[^A-Za-z0-9 ]/", "", $order->customer_note), 0, 256) : '', 'invnum' => $invoice_number = $this->invoice_id_prefix . preg_replace("/[^0-9,.]/", "", $order->id), 'notifyurl' => '', 'recurring' => ''); $PaymentData = AngellEYE_Gateway_Paypal::calculate($order, $this->send_items); $OrderItems = array(); if ($this->send_items) { foreach ($PaymentData['order_items'] as $item) { $Item = array('l_name' => $item['name'], 'l_desc' => '', 'l_amt' => $item['amt'], 'l_number' => $item['number'], 'l_qty' => $item['qty'], 'l_taxamt' => '', 'l_ebayitemnumber' => '', 'l_ebayitemauctiontxnid' => '', 'l_ebayitemorderid' => ''); array_push($OrderItems, $Item); } } /** * Shipping/tax/item amount */ $PaymentDetails['taxamt'] = $PaymentData['taxamt']; $PaymentDetails['shippingamt'] = $PaymentData['shippingamt']; $PaymentDetails['itemamt'] = $PaymentData['itemamt']; /** * 3D Secure Params */ if ($this->enable_3dsecure) { $Secure3D = array('authstatus3d' => $centinelPAResStatus, 'mpivendor3ds' => $centinelEnrolled, 'cavv' => $centinelCavv, 'eci3ds' => $centinelEciFlag, 'xid' => $centinelXid); } else { $Secure3D = array(); } $PayPalRequestData = array('DPFields' => $DPFields, 'CCDetails' => $CCDetails, 'PayerInfo' => $PayerInfo, 'BillingAddress' => $BillingAddress, 'ShippingAddress' => $ShippingAddress, 'PaymentDetails' => $PaymentDetails, 'OrderItems' => $OrderItems, 'Secure3D' => $Secure3D); if ($this->debug) { $log = $PayPalRequestData; $log['CCDetails']['acct'] = '****'; $log['CCDetails']['cvv2'] = '****'; $this->log->add('paypal-pro', 'Do payment request ' . print_r($log, true)); } // Pass data into class for processing with PayPal and load the response array into $PayPalResult $PayPalResult = $PayPal->DoDirectPayment($PayPalRequestData); if ($this->debug) { $PayPalRequest = isset($PayPalResult['RAWREQUEST']) ? $PayPalResult['RAWREQUEST'] : ''; $PayPalResponse = isset($PayPalResult['RAWRESPONSE']) ? $PayPalResult['RAWRESPONSE'] : ''; $this->log->add('paypal-pro', 'Request: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalRequest)), true)); $this->log->add('paypal-pro', 'Response: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalResponse)), true)); } if (empty($PayPalResult['RAWRESPONSE'])) { $pc_empty_response = apply_filters('angelleye_pc_empty_response', __('Empty PayPal response.', 'paypal-for-woocommerce'), $PayPalResult); throw new Exception($pc_empty_response); } if ($PayPal->APICallSuccessful($PayPalResult['ACK'])) { // Add order note $order->add_order_note(sprintf(__('PayPal Pro payment completed (Transaction ID: %s, Correlation ID: %s)', 'paypal-for-woocommerce'), $PayPalResult['TRANSACTIONID'], $PayPalResult['CORRELATIONID'])); //$order->add_order_note("PayPal Results: ".print_r($PayPalResult,true)); /* Checkout Note */ if (isset($_POST) && !empty($_POST['order_comments'])) { // Update post 37 $checkout_note = array('ID' => $order->id, 'post_excerpt' => $_POST['order_comments']); wp_update_post($checkout_note); } /** * Add order notes for AVS result */ $avs_response_code = isset($PayPalResult['AVSCODE']) ? $PayPalResult['AVSCODE'] : ''; $avs_response_message = $PayPal->GetAVSCodeMessage($avs_response_code); $avs_response_order_note = __('Address Verification Result', 'paypal-for-woocommerce'); $avs_response_order_note .= "\n"; $avs_response_order_note .= $avs_response_code; $avs_response_order_note .= $avs_response_message != '' ? ' - ' . $avs_response_message : ''; $order->add_order_note($avs_response_order_note); /** * Add order notes for CVV2 result */ $cvv2_response_code = isset($PayPalResult['CVV2MATCH']) ? $PayPalResult['CVV2MATCH'] : ''; $cvv2_response_message = $PayPal->GetCVV2CodeMessage($cvv2_response_code); $cvv2_response_order_note = __('Card Security Code Result', 'paypal-for-woocommerce'); $cvv2_response_order_note .= "\n"; $cvv2_response_order_note .= $cvv2_response_code; $cvv2_response_order_note .= $cvv2_response_message != '' ? ' - ' . $cvv2_response_message : ''; $order->add_order_note($cvv2_response_order_note); // Payment complete $order->payment_complete($PayPalResult['TRANSACTIONID']); // Remove cart WC()->cart->empty_cart(); // Return thank you page redirect return array('result' => 'success', 'redirect' => $this->get_return_url($order)); } else { // Get error message $error_code = isset($PayPalResult['ERRORS'][0]['L_ERRORCODE']) ? $PayPalResult['ERRORS'][0]['L_ERRORCODE'] : ''; $long_message = isset($PayPalResult['ERRORS'][0]['L_LONGMESSAGE']) ? $PayPalResult['ERRORS'][0]['L_LONGMESSAGE'] : ''; $error_message = $error_code . '-' . $long_message; // Notice admin if has any issue from PayPal if ($this->error_email_notify) { $admin_email = get_option("admin_email"); $message = __("DoDirectPayment API call failed.", "paypal-for-woocommerce") . "\n\n"; $message .= __('Error Code: ', 'paypal-for-woocommerce') . $error_code . "\n"; $message .= __('Detailed Error Message: ', 'paypal-for-woocommerce') . $long_message . "\n"; $message .= __('Order ID: ') . $order->id . "\n"; $message .= __('Customer Name: ') . $order->billing_first_name . ' ' . $order->billing_last_name . "\n"; $message .= __('Customer Email: ') . $order->billing_email . "\n"; $pc_error_email_message = apply_filters('angelleye_pc_error_email_notify_message', $message, $error_code, $long_message); $pc_error_email_subject = apply_filters('angelleye_pc_error_email_notify_subject', "PayPal Pro Error Notification", $error_code, $long_message); wp_mail($admin_email, $pc_error_email_subject, $pc_error_email_message); } if ($this->debug) { $this->log->add('paypal-pro', 'Error ' . print_r($PayPalResult['ERRORS'], true)); } $order->update_status('failed', sprintf(__('PayPal Pro payment failed (Correlation ID: %s). Payment was rejected due to an error: %s', 'paypal-for-woocommerce'), $PayPalResult['CORRELATIONID'], '(' . $PayPalResult['L_ERRORCODE0'] . ') ' . '"' . $error_message . '"')); // Generate error message based on Error Display Type setting if ($this->error_display_type == 'detailed') { $pc_display_type_error = __($error_message, 'paypal-for-woocommerce'); $pc_display_type_notice = __('Payment error:', 'paypal-for-woocommerce') . ' ' . $error_message; } else { $pc_display_type_error = __('There was a problem connecting to the payment gateway.', 'paypal-for-woocommerce'); $pc_display_type_notice = __('Payment error:', 'paypal-for-woocommerce') . ' ' . $error_message; } $pc_display_type_error = apply_filters('angelleye_pc_display_type_error', $pc_display_type_error, $error_code, $long_message); $pc_display_type_notice = apply_filters('angelleye_pc_display_type_notice', $pc_display_type_notice, $error_code, $long_message); wc_add_notice($pc_display_type_notice, "error"); throw new Exception($pc_display_type_error); return; } }
/** * ConfirmPayment * * Finalizes the checkout with PayPal's DoExpressCheckoutPayment API * * @FinalPaymentAmt (double) Final payment amount for the order. */ function ConfirmPayment($FinalPaymentAmt) { /* * Display message to user if session has expired. */ if (sizeof(WC()->cart->get_cart()) == 0 || empty(WC()->session->TOKEN)) { $ms = sprintf(__('Sorry, your session has expired. <a href=%s>Return to homepage →</a>', 'paypal-for-woocommerce'), '"' . home_url() . '"'); $ec_confirm_message = apply_filters('angelleye_ec_confirm_message', $ms); wc_add_notice($ec_confirm_message, "error"); wp_redirect(get_permalink(wc_get_page_id('cart'))); } /* * Check if the PayPal class has already been established. */ if (!class_exists('Angelleye_PayPal')) { require_once PAYPAL_FOR_WOOCOMMERCE_PLUGIN_DIR . '/classes/lib/angelleye/paypal-php-library/includes/paypal.class.php'; } /* * Create PayPal object. */ $PayPalConfig = array('Sandbox' => $this->testmode == 'yes' ? TRUE : FALSE, 'APIUsername' => $this->api_username, 'APIPassword' => $this->api_password, 'APISignature' => $this->api_signature); $PayPal = new Angelleye_PayPal($PayPalConfig); /* * Get data from WooCommerce object */ if (!empty($this->confirm_order_id)) { $order = new WC_Order($this->confirm_order_id); $invoice_number = preg_replace("/[^0-9,.]/", "", $order->get_order_number()); if ($order->customer_note) { $customer_notes = wptexturize($order->customer_note); } $shipping_first_name = $order->shipping_first_name; $shipping_last_name = $order->shipping_last_name; $shipping_address_1 = $order->shipping_address_1; $shipping_address_2 = $order->shipping_address_2; $shipping_city = $order->shipping_city; $shipping_state = $order->shipping_state; $shipping_postcode = $order->shipping_postcode; $shipping_country = $order->shipping_country; } // Prepare request arrays $DECPFields = array('token' => urlencode($this->get_session('TOKEN')), 'payerid' => urlencode($this->get_session('payer_id')), 'returnfmfdetails' => '', 'giftmessage' => $this->get_session('giftmessage'), 'giftreceiptenable' => $this->get_session('giftreceiptenable'), 'giftwrapname' => $this->get_session('giftwrapname'), 'giftwrapamount' => $this->get_session('giftwrapamount'), 'buyermarketingemail' => '', 'surveyquestion' => '', 'surveychoiceselected' => '', 'allowedpaymentmethod' => ''); $Payments = array(); $Payment = array('amt' => AngellEYE_Gateway_Paypal::number_format($FinalPaymentAmt), 'currencycode' => get_woocommerce_currency(), 'shippingdiscamt' => '', 'insuranceoptionoffered' => '', 'handlingamt' => '', 'desc' => '', 'custom' => '', 'invnum' => $this->invoice_id_prefix . $invoice_number, 'notifyurl' => '', 'shiptoname' => $shipping_first_name . ' ' . $shipping_last_name, 'shiptostreet' => $shipping_address_1, 'shiptostreet2' => $shipping_address_2, 'shiptocity' => $shipping_city, 'shiptostate' => $shipping_state, 'shiptozip' => $shipping_postcode, 'shiptocountrycode' => $shipping_country, 'shiptophonenum' => '', 'notetext' => $this->get_session('customer_notes'), 'allowedpaymentmethod' => '', 'paymentaction' => $this->payment_action == 'Authorization' ? 'Authorization' : 'Sale', 'paymentrequestid' => '', 'sellerpaypalaccountid' => '', 'sellerid' => '', 'sellerusername' => '', 'sellerregistrationdate' => '', 'softdescriptor' => ''); $PaymentData = AngellEYE_Gateway_Paypal::calculate($order, $this->send_items); $PaymentOrderItems = array(); if ($this->send_items) { foreach ($PaymentData['order_items'] as $item) { $Item = array('name' => $item['name'], 'desc' => '', 'amt' => $item['amt'], 'number' => $item['number'], 'qty' => $item['qty'], 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); array_push($PaymentOrderItems, $Item); } } /* * Set tax, shipping, itemamt */ $Payment['taxamt'] = $PaymentData['taxamt']; // Required if you specify itemized L_TAXAMT fields. Sum of all tax items in this order. $Payment['shippingamt'] = $PaymentData['shippingamt']; // Total shipping costs for this order. If you specify SHIPPINGAMT you mut also specify a value for ITEMAMT. $Payment['itemamt'] = $PaymentData['itemamt']; // Total shipping costs for this order. If you specify SHIPPINGAMT you mut also specify a value for ITEMAMT. $Payment['order_items'] = $PaymentOrderItems; array_push($Payments, $Payment); $UserSelectedOptions = array('shippingcalculationmode' => '', 'insuranceoptionselected' => '', 'shippingoptionisdefault' => '', 'shippingoptionamount' => '', 'shippingoptionname' => ''); $PayPalRequestData = array('DECPFields' => $DECPFields, 'Payments' => $Payments); // Pass data into class for processing with PayPal and load the response array into $PayPalResult $PayPalResult = $PayPal->DoExpressCheckoutPayment($PayPalRequestData); /** * cURL Error Handling #146 * @since 1.1.8 */ AngellEYE_Gateway_Paypal::angelleye_paypal_for_woocommerce_curl_error_handler($PayPalResult, $methos_name = 'DoExpressCheckoutPayment', $gateway = 'PayPal Express Checkout', $this->error_email_notify); /* * Log API result */ $this->add_log('Test Mode: ' . $this->testmode); $this->add_log('Endpoint: ' . $this->API_Endpoint); $PayPalRequest = isset($PayPalResult['RAWREQUEST']) ? $PayPalResult['RAWREQUEST'] : ''; $PayPalResponse = isset($PayPalResult['RAWRESPONSE']) ? $PayPalResult['RAWRESPONSE'] : ''; $this->add_log('Request: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalRequest)), true)); $this->add_log('Response: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalResponse)), true)); /* * Error handling */ if ($PayPal->APICallSuccessful($PayPalResult['ACK'])) { // $this->remove_session('TOKEN'); } /* * Return the class library result array. */ return $PayPalResult; }
$shipping_country_code = isset($_POST['SHIPTOCOUNTRY']) ? $_POST['SHIPTOCOUNTRY'] : ''; // Here, we may setup static shipping and tax options, or we could hit a 3rd party // web service API (eg. UPS, FedEx, USPS) to gather rates in real-time. // // // // Now we can generate a response for PayPal based on our new shipping values we got back from our carrier API. $CBFields = array(); // Gather shipping options. If you're pulling rates from a carrier API you would be looping through // their response in order to populate $ShippingOptions. Here, we're doing it manually for sample purposes. $ShippingOptions = array(); $Option = array('l_shippingoptionisdefault' => 'true', 'l_shippingoptionname' => 'UPS', 'l_shipingpoptionlabel' => 'UPS', 'l_shippingoptionamount' => '5.00', 'l_taxamt' => '0.00', 'l_insuranceamount' => '1.00'); array_push($ShippingOptions, $Option); $Option = array('l_shippingoptionisdefault' => 'false', 'l_shippingoptionname' => 'UPS', 'l_shipingpoptionlabel' => 'UPS', 'l_shippingoptionamount' => '20.00', 'l_taxamt' => '0.00', 'l_insuranceamount' => '1.00'); array_push($ShippingOptions, $Option); $callback_data_request_array = array('CBFields' => $CBFields, 'ShippingOptions' => $ShippingOptions); // Now we pass the data into the class library which will return an NVP string $callback_data_response = $paypal->CallbackResponse($callback_data_request_array); // Gather the request data that PayPal sent us in case we need to log it somehow to see what's available. $request_content = ''; foreach ($_POST as $var => $val) { $request_content .= '&' . $var . '=' . urldecode($val); } // Pass the shipping/tax data into the library to obtain an NVP string that we'll // simply output as a web service response back to PayPal. $response_content_body = ''; $response_content = $paypal->NVPToArray($callback_data_response); foreach ($response_content as $var => $val) { $response_content_body .= $var . ': ' . urldecode($val) . '<br />'; } echo $callback_data_response;
/** * ConfirmPayment * * Finalizes the checkout with PayPal's DoExpressCheckoutPayment API * * @FinalPaymentAmt (double) Final payment amount for the order. */ function ConfirmPayment($FinalPaymentAmt) { /* * Display message to user if session has expired. */ if (sizeof(WC()->cart->get_cart()) == 0) { $ms = sprintf(__('Sorry, your session has expired. <a href=%s>Return to homepage →</a>', 'paypal-for-woocommerce'), '"' . home_url() . '"'); $ec_confirm_message = apply_filters('angelleye_ec_confirm_message', $ms); wc_add_notice($ec_confirm_message, "error"); } /* * Check if the PayPal class has already been established. */ if (!class_exists('Angelleye_PayPal')) { require_once 'lib/angelleye/paypal-php-library/includes/paypal.class.php'; } /* * Create PayPal object. */ $PayPalConfig = array('Sandbox' => $this->testmode == 'yes' ? TRUE : FALSE, 'APIUsername' => $this->api_username, 'APIPassword' => $this->api_password, 'APISignature' => $this->api_signature); $PayPal = new Angelleye_PayPal($PayPalConfig); /* * Get data from WooCommerce object */ if (!empty($this->confirm_order_id)) { $order = new WC_Order($this->confirm_order_id); $invoice_number = preg_replace("/[^0-9]/", "", $order->get_order_number()); if ($order->customer_note) { $customer_notes = wptexturize($order->customer_note); } $shipping_first_name = $order->shipping_first_name; $shipping_last_name = $order->shipping_last_name; $shipping_address_1 = $order->shipping_address_1; $shipping_address_2 = $order->shipping_address_2; $shipping_city = $order->shipping_city; $shipping_state = $order->shipping_state; $shipping_postcode = $order->shipping_postcode; $shipping_country = $order->shipping_country; } // Prepare request arrays $DECPFields = array('token' => urlencode($this->get_session('TOKEN')), 'payerid' => urlencode($this->get_session('payer_id')), 'returnfmfdetails' => '', 'giftmessage' => $this->get_session('giftmessage'), 'giftreceiptenable' => $this->get_session('giftreceiptenable'), 'giftwrapname' => $this->get_session('giftwrapname'), 'giftwrapamount' => $this->get_session('giftwrapamount'), 'buyermarketingemail' => '', 'surveyquestion' => '', 'surveychoiceselected' => '', 'allowedpaymentmethod' => ''); $Payments = array(); $order_items_own = array(); $final_order_total = $order->get_order_item_totals(); $current_currency = get_woocommerce_currency_symbol(get_woocommerce_currency()); $final_order_total_amt_strip_ec = strip_tags($final_order_total['order_total']['value']); $final_order_total_amt_strip = str_replace(',', '', $final_order_total_amt_strip_ec); $final_order_total_amt = str_replace($current_currency, '', $final_order_total_amt_strip); $Payment = array('amt' => number_format($final_order_total_amt, 2, '.', ''), 'currencycode' => get_woocommerce_currency(), 'shippingdiscamt' => '', 'insuranceoptionoffered' => '', 'handlingamt' => '', 'desc' => '', 'custom' => '', 'invnum' => preg_replace("/[^0-9]/", "", $this->confirm_order_id), 'notifyurl' => '', 'shiptoname' => $shipping_first_name . ' ' . $shipping_last_name, 'shiptostreet' => $shipping_address_1, 'shiptostreet2' => $shipping_address_2, 'shiptocity' => $shipping_city, 'shiptostate' => $shipping_state, 'shiptozip' => $shipping_postcode, 'shiptocountrycode' => $shipping_country, 'shiptophonenum' => '', 'notetext' => $this->get_session('customer_notes'), 'allowedpaymentmethod' => '', 'paymentaction' => $this->payment_action == 'Authorization' ? 'Authorization' : 'Sale', 'paymentrequestid' => '', 'sellerpaypalaccountid' => '', 'sellerid' => '', 'sellerusername' => '', 'sellerregistrationdate' => '', 'softdescriptor' => ''); $PaymentOrderItems = array(); $ctr = $total_items = $total_discount = $total_tax = $shipping = 0; $ITEMAMT = 0; $counter = 1; if (sizeof($order->get_items()) > 0) { // if ($this->send_items) { foreach ($order->get_items() as $values) { $_product = $order->get_product_from_item($values); $qty = absint($values['qty']); $sku = $_product->get_sku(); $values['name'] = html_entity_decode($values['name'], ENT_NOQUOTES, 'UTF-8'); if ($_product->product_type == 'variation') { if (empty($sku)) { $sku = $_product->parent->get_sku(); } //$item_meta = new WC_Order_Item_Meta($values['item_meta']); $item_meta = new WC_Order_Item_Meta($values, $_product); $meta = $item_meta->display(true, true); if (!empty($meta)) { $values['name'] .= " - " . str_replace(", \n", " - ", $meta); } } //////////////////////////////////////////***************************//////////////////////////////////// $lineitems_prepare = $this->prepare_line_items($order); $lineitems = $_SESSION['line_item']; if (in_array($values['product_id'], $lineitems)) { $arraykey = array_search($values['product_id'], $lineitems); $item_position = str_replace('product_number_', '', $arraykey); $get_amountkey = 'amount_' . $counter; $get_qtykey = 'quantity_' . $counter; $switcher_amt = $lineitems[$get_amountkey]; $switcher_qty = $lineitems[$get_qtykey]; $counter = $counter + 1; } //////////////////////////////////////////***************************//////////////////////////////////// $Item = array('name' => $values['name'], 'desc' => '', 'amt' => round($switcher_amt, 2), 'number' => $sku, 'qty' => $qty, 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); array_push($PaymentOrderItems, $Item); $ITEMAMT += round($switcher_amt, 2) * $switcher_qty; $order_items_own[] = round($switcher_amt, 2) * $switcher_qty; } /** * Add custom Woo cart fees as line items */ foreach (WC()->cart->get_fees() as $fee) { $Item = array('name' => $fee->name, 'desc' => '', 'amt' => number_format($fee->amount, 2, '.', ''), 'number' => $fee->id, 'qty' => 1, 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); /** * The gift wrap amount actually has its own parameter in * DECP, so we don't want to include it as one of the line * items. */ if ($Item['number'] != 'gift-wrap') { array_push($PaymentOrderItems, $Item); $ITEMAMT += $fee->amount * $Item['qty']; $order_items_own[] = $fee->amount * $Item['qty']; } $ctr++; } if (!$this->is_wc_version_greater_2_3()) { /* * Get discounts */ if ($order->get_order_discount() > 0) { // foreach (WC()->cart->get_coupons('cart') as $code => $coupon) { $Item = array('name' => 'Cart Discount', 'number' => 'Coupons', 'qty' => '1', 'amt' => '-' . number_format(WC()->cart->coupon_discount_amounts[$code], 2, '.', '')); array_push($PaymentOrderItems, $Item); //} $total_discount -= $order->get_cart_discount(); $order_items_own[] = $fee->amount * $Item['qty']; } if ($order->get_order_discount() > 0) { // foreach (WC()->cart->get_coupons('order') as $code => $coupon) { $Item = array('name' => 'Order Discount', 'number' => 'Coupons', 'qty' => '1', 'amt' => '-' . number_format($order->get_order_discount(), 2, '.', '')); array_push($PaymentOrderItems, $Item); // } $total_discount -= $order->get_order_discount(); $order_items_own[] = round($total_discount, 2); } } else { if ($order->get_total_discount() > 0) { $Item = array('name' => 'Total Discount', 'qty' => 1, 'amt' => -number_format($order->get_total_discount(), 2, '.', '')); array_push($PaymentOrderItems, $Item); $total_discount -= $order->get_total_discount(); $order_items_own[] = round($total_discount, 2); } } // } if(this->senditem)1876 /* * Set shipping and tax values. */ /* * *****************************MD******************************** */ foreach ($order->get_tax_totals() as $code => $tax) { $tax_string_array[] = $tax->formatted_amount; } $current_currency = get_woocommerce_currency_symbol(get_woocommerce_currency()); if (isset($tax_string_array) && !empty($tax_string_array)) { $striped_amt = strip_tags($tax_string_array[0]); if (isset($striped_amt) && !empty($striped_amt)) { $tot_tax = str_replace($current_currency, '', $striped_amt); } } /* * ****************************MD******************************** */ if (get_option('woocommerce_prices_include_tax') == 'yes') { $shipping = $order->get_total_shipping(); //+ $order->get_shipping_tax(); $tax = 0; } else { $shipping = $order->get_total_shipping(); if (isset($tot_tax) && !empty($tot_tax)) { $tax = $tot_tax; } else { $tax = 0; } } if ('yes' === get_option('woocommerce_calc_taxes') && 'yes' === get_option('woocommerce_prices_include_tax')) { if (isset($tot_tax) && !empty($tot_tax)) { $tax = $tot_tax; } else { $tax = 0; } } if ($tax > 0) { $tax = number_format($tot_tax, 2, '.', ''); } if ($shipping > 0) { $shipping = number_format($shipping, 2, '.', ''); } if ($total_discount) { $total_discount = round($total_discount, 2); } if ($this->send_items) { /* * Now that we have all items and subtotals * we can fill in necessary values. */ $Payment['itemamt'] = number_format($ITEMAMT + $total_discount, 2, '.', ''); } else { $PaymentOrderItems = array(); $Payment['itemamt'] = number_format($ITEMAMT + $total_discount, 2, '.', ''); } /* * Set tax */ if ($tax > 0) { $Payment['taxamt'] = number_format($tot_tax, 2, '.', ''); // Required if you specify itemized L_TAXAMT fields. Sum of all tax items in this order. } /* * Set shipping */ if ($shipping > 0) { $Payment['shippingamt'] = number_format($shipping, 2, '.', ''); // Total shipping costs for this order. If you specify SHIPPINGAMT you mut also specify a value for ITEMAMT. } } $Payment['order_items'] = $PaymentOrderItems; array_push($Payments, $Payment); $UserSelectedOptions = array('shippingcalculationmode' => '', 'insuranceoptionselected' => '', 'shippingoptionisdefault' => '', 'shippingoptionamount' => '', 'shippingoptionname' => ''); $PayPalRequestData = array('DECPFields' => $DECPFields, 'Payments' => $Payments); // Rounding amendment if (isset($tax) && !empty($tax)) { $tax = $tax; } else { $tax = '0.00'; } if (isset($shipping) && !empty($shipping)) { $shipping = $shipping; } else { $shipping = '0.00'; } if (trim(number_format($final_order_total_amt, 2, '.', '')) !== trim(number_format($Payment['itemamt'] + number_format($tax, 2, '.', '') + number_format($shipping, 2, '.', ''), 2, '.', ''))) { $diffrence_amount = $this->get_diffrent($final_order_total_amt, $Payment['itemamt'] + $tax + number_format($shipping, 2, '.', '')); if ($shipping > 0) { $PayPalRequestData['Payments'][0]['shippingamt'] = round($shipping + $diffrence_amount, 2); } elseif ($tax > 0) { $PayPalRequestData['Payments'][0]['taxamt'] = round($tax + $diffrence_amount, 2); } else { $PayPalRequestData['Payments'][0]['itemamt'] = round($PayPalRequestData['Payments'][0]['itemamt'] + $diffrence_amount, 2); } } /* rounding amount */ $order_item_total = 0; foreach ($order_items_own as $keypayment => $valuepayment) { $order_item_total = $order_item_total + $valuepayment; } if ($shipping <= 0 && $tax <= 0) { $diffrence_amount_rounded = $this->get_diffrent($final_order_total_amt, $order_item_total); $PayPalRequestData['Payments'][0]['itemamt'] = round($PayPalRequestData['Payments'][0]['itemamt'] - $diffrence_amount_rounded, 2); $PayPalRequestData['Payments'][0]['amt'] = round($PayPalRequestData['Payments'][0]['amt'] - $diffrence_amount_rounded, 2); } // Pass data into class for processing with PayPal and load the response array into $PayPalResult $PayPalResult = $PayPal->DoExpressCheckoutPayment($PayPalRequestData); /* * Log API result */ $this->add_log('Test Mode: ' . $this->testmode); $this->add_log('Endpoint: ' . $this->API_Endpoint); $PayPalRequest = isset($PayPalResult['RAWREQUEST']) ? $PayPalResult['RAWREQUEST'] : ''; $PayPalResponse = isset($PayPalResult['RAWRESPONSE']) ? $PayPalResult['RAWRESPONSE'] : ''; $this->add_log('Request: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalRequest)), true)); $this->add_log('Response: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalResponse)), true)); /* * Error handling */ if ($PayPal->APICallSuccessful($PayPalResult['ACK'])) { $this->remove_session('TOKEN'); if (isset($_SESSION['line_item'])) { unset($_SESSION['line_item']); } } /* * Return the class library result array. */ return $PayPalResult; }
/** * ConfirmPayment * * Finalizes the checkout with PayPal's DoExpressCheckoutPayment API * * @FinalPaymentAmt (double) Final payment amount for the order. */ function ConfirmPayment($FinalPaymentAmt) { /* * Display message to user if session has expired. */ if (sizeof(WC()->cart->get_cart()) == 0) { wc_add_notice(sprintf(__('Sorry, your session has expired. <a href=%s>Return to homepage →</a>', 'paypal-for-woocommerce'), '"' . home_url() . '"'), "error"); } /* * Check if the PayPal class has already been established. */ if (!class_exists('Angelleye_PayPal')) { require_once 'lib/angelleye/paypal-php-library/includes/paypal.class.php'; } /* * Create PayPal object. */ $PayPalConfig = array('Sandbox' => $this->testmode == 'yes' ? TRUE : FALSE, 'APIUsername' => $this->api_username, 'APIPassword' => $this->api_password, 'APISignature' => $this->api_signature); $PayPal = new Angelleye_PayPal($PayPalConfig); /* * Get data from WooCommerce object */ if (!empty($this->confirm_order_id)) { $order = new WC_Order($this->confirm_order_id); $invoice_number = preg_replace("/[^0-9,.]/", "", $order->get_order_number()); if ($order->customer_note) { $customer_notes = wptexturize($order->customer_note); } $shipping_first_name = $order->shipping_first_name; $shipping_last_name = $order->shipping_last_name; $shipping_address_1 = $order->shipping_address_1; $shipping_address_2 = $order->shipping_address_2; $shipping_city = $order->shipping_city; $shipping_state = $order->shipping_state; $shipping_postcode = $order->shipping_postcode; $shipping_country = $order->shipping_country; } // Prepare request arrays $DECPFields = array('token' => urlencode($this->get_session('TOKEN')), 'payerid' => urlencode($this->get_session('payer_id')), 'returnfmfdetails' => '', 'giftmessage' => $this->get_session('giftmessage'), 'giftreceiptenable' => $this->get_session('giftreceiptenable'), 'giftwrapname' => $this->get_session('giftwrapname'), 'giftwrapamount' => $this->get_session('giftwrapamount'), 'buyermarketingemail' => '', 'surveyquestion' => '', 'surveychoiceselected' => '', 'allowedpaymentmethod' => ''); $Payments = array(); $Payment = array('amt' => number_format($FinalPaymentAmt, 2, '.', ''), 'currencycode' => get_woocommerce_currency(), 'shippingdiscamt' => '', 'insuranceoptionoffered' => '', 'handlingamt' => '', 'desc' => '', 'custom' => '', 'invnum' => $this->invoice_id_prefix . $invoice_number, 'notifyurl' => '', 'shiptoname' => $shipping_first_name . ' ' . $shipping_last_name, 'shiptostreet' => $shipping_address_1, 'shiptostreet2' => $shipping_address_2, 'shiptocity' => $shipping_city, 'shiptostate' => $shipping_state, 'shiptozip' => $shipping_postcode, 'shiptocountrycode' => $shipping_country, 'shiptophonenum' => '', 'notetext' => $this->get_session('customer_notes'), 'allowedpaymentmethod' => '', 'paymentaction' => 'Sale', 'paymentrequestid' => '', 'sellerpaypalaccountid' => '', 'sellerid' => '', 'sellerusername' => '', 'sellerregistrationdate' => '', 'softdescriptor' => ''); $PaymentOrderItems = array(); $ctr = 0; $ITEMAMT = 0; if (sizeof($order->get_items()) > 0) { foreach ($order->get_items() as $values) { $_product = $order->get_product_from_item($values); $qty = absint($values['qty']); $sku = $_product->get_sku(); $values['name'] = html_entity_decode($values['name'], ENT_NOQUOTES, 'UTF-8'); if ($_product->product_type == 'variation') { if (empty($sku)) { $sku = $_product->parent->get_sku(); } $item_meta = new WC_Order_Item_Meta($values['item_meta']); $meta = $item_meta->display(true, true); if (!empty($meta)) { $values['name'] .= " - " . str_replace(", \n", " - ", $meta); } } /* * Set price based on tax option. */ if (get_option('woocommerce_prices_include_tax') == 'yes') { $product_price = $order->get_item_subtotal($values, true, false); } else { $product_price = $order->get_item_subtotal($values, false, true); } $Item = array('name' => $values['name'], 'desc' => '', 'amt' => $product_price, 'number' => $sku, 'qty' => $qty, 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); array_push($PaymentOrderItems, $Item); $ITEMAMT += $product_price * $values['qty']; } /** * Add custom Woo cart fees as line items */ foreach (WC()->cart->get_fees() as $fee) { $Item = array('name' => $fee->name, 'desc' => '', 'amt' => number_format($fee->amount, 2, '.', ''), 'number' => $fee->id, 'qty' => 1, 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); /** * The gift wrap amount actually has its own parameter in * DECP, so we don't want to include it as one of the line * items. */ if ($Item['number'] != 'gift-wrap') { array_push($PaymentOrderItems, $Item); $ITEMAMT += $fee->amount * $Item['qty']; } $ctr++; } /* * Get discounts */ if ($order->get_cart_discount() > 0) { foreach (WC()->cart->get_coupons('cart') as $code => $coupon) { $Item = array('name' => 'Cart Discount', 'number' => $code, 'qty' => '1', 'amt' => '-' . number_format(WC()->cart->coupon_discount_amounts[$code], 2, '.', '')); array_push($PaymentOrderItems, $Item); } $ITEMAMT -= $order->get_cart_discount(); } if ($order->get_order_discount() > 0) { foreach (WC()->cart->get_coupons('order') as $code => $coupon) { $Item = array('name' => 'Order Discount', 'number' => $code, 'qty' => '1', 'amt' => '-' . number_format(WC()->cart->coupon_discount_amounts[$code], 2, '.', '')); array_push($PaymentOrderItems, $Item); } $ITEMAMT -= $order->get_order_discount(); } /* * Set shipping and tax values. */ if (get_option('woocommerce_prices_include_tax') == 'yes') { $shipping = $order->get_total_shipping() + $order->get_shipping_tax(); $tax = 0; } else { $shipping = $order->get_total_shipping(); $tax = $order->get_total_tax(); } /* * Now that we have all items and subtotals * we can fill in necessary values. */ $Payment['itemamt'] = number_format($ITEMAMT, 2, '.', ''); // Required if you specify itemized L_AMT fields. Sum of cost of all items in this order. /* * Set tax */ if ($tax > 0) { $Payment['taxamt'] = number_format($tax, 2, '.', ''); // Required if you specify itemized L_TAXAMT fields. Sum of all tax items in this order. } /* * Set shipping */ if ($shipping > 0) { $Payment['shippingamt'] = number_format($shipping, 2, '.', ''); // Total shipping costs for this order. If you specify SHIPPINGAMT you mut also specify a value for ITEMAMT. } } $Payment['order_items'] = $PaymentOrderItems; array_push($Payments, $Payment); $UserSelectedOptions = array('shippingcalculationmode' => '', 'insuranceoptionselected' => '', 'shippingoptionisdefault' => '', 'shippingoptionamount' => '', 'shippingoptionname' => ''); $PayPalRequestData = array('DECPFields' => $DECPFields, 'Payments' => $Payments); // Pass data into class for processing with PayPal and load the response array into $PayPalResult $PayPalResult = $PayPal->DoExpressCheckoutPayment($PayPalRequestData); /* * Log API result */ $this->add_log('Test Mode: ' . $this->testmode); $this->add_log('Endpoint: ' . $this->API_Endpoint); $PayPalRequest = isset($PayPalResult['RAWREQUEST']) ? $PayPalResult['RAWREQUEST'] : ''; $PayPalResponse = isset($PayPalResult['RAWRESPONSE']) ? $PayPalResult['RAWRESPONSE'] : ''; $this->add_log('Request: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalRequest)), true)); $this->add_log('Response: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalResponse)), true)); /* * Error handling */ if ($PayPal->APICallSuccessful($PayPalResult['ACK'])) { $this->remove_session('TOKEN'); } /* * Return the class library result array. */ return $PayPalResult; }
/** * do_payment * * Makes the request to PayPal's DoDirectPayment API * * @access public * @param mixed $order * @param mixed $card_number * @param mixed $card_type * @param mixed $card_exp_month * @param mixed $card_exp_year * @param mixed $card_csc * @param string $centinelPAResStatus (default: '') * @param string $centinelEnrolled (default: '') * @param string $centinelCavv (default: '') * @param string $centinelEciFlag (default: '') * @param string $centinelXid (default: '') * @return void */ function do_payment($order, $card_number, $card_type, $card_exp_month, $card_exp_year, $card_csc, $centinelPAResStatus = '', $centinelEnrolled = '', $centinelCavv = '', $centinelEciFlag = '', $centinelXid = '') { /* * Display message to user if session has expired. */ if (sizeof(WC()->cart->get_cart()) == 0) { $pc_session_expired_error = apply_filters('angelleye_pc_session_expired_error', sprintf(__('Sorry, your session has expired. <a href=%s>Return to homepage →</a>', 'paypal-for-woocommerce'), '"' . home_url() . '"')); wc_add_notice($pc_session_expired_error, "error"); } /* * Check if the PayPal class has already been established. */ if (!class_exists('Angelleye_PayPal')) { require_once 'lib/angelleye/paypal-php-library/includes/paypal.class.php'; } /* * Create PayPal object. */ $PayPalConfig = array('Sandbox' => $this->testmode == 'yes' ? TRUE : FALSE, 'APIUsername' => $this->api_username, 'APIPassword' => $this->api_password, 'APISignature' => $this->api_signature); $PayPal = new Angelleye_PayPal($PayPalConfig); if (empty($GLOBALS['wp_rewrite'])) { $GLOBALS['wp_rewrite'] = new WP_Rewrite(); } $card_exp = $card_exp_month . $card_exp_year; /** * Generate PayPal request */ $DPFields = array('paymentaction' => $this->payment_action == 'Authorization' ? 'Auth' : 'Sale', 'ipaddress' => $this->get_user_ip(), 'returnfmfdetails' => ''); $CCDetails = array('creditcardtype' => $card_type, 'acct' => $card_number, 'expdate' => $card_exp, 'cvv2' => $card_csc, 'startdate' => '', 'issuenumber' => ''); $PayerInfo = array('email' => $order->billing_email, 'firstname' => $order->billing_first_name, 'lastname' => $order->billing_last_name); $BillingAddress = array('street' => $order->billing_address_1, 'street2' => $order->billing_address_2, 'city' => $order->billing_city, 'state' => $order->billing_state, 'countrycode' => $order->billing_country, 'zip' => $order->billing_postcode, 'phonenum' => $order->billing_phone); $ShippingAddress = array('shiptoname' => $order->shipping_first_name . ' ' . $order->shipping_last_name, 'shiptostreet' => $order->shipping_address_1, 'shiptostreet2' => $order->shipping_address_2, 'shiptocity' => $order->shipping_city, 'shiptostate' => $order->shipping_state, 'shiptozip' => $order->shipping_postcode, 'shiptocountry' => $order->shipping_country, 'shiptophonenum' => $order->shipping_phone); $PaymentDetails = array('amt' => number_format($order->get_total(), 2, '.', ''), 'currencycode' => get_woocommerce_currency(), 'insuranceamt' => '', 'shipdiscamt' => '0.00', 'handlingamt' => '0.00', 'desc' => '', 'custom' => $order->customer_note ? wptexturize($order->customer_note) : '', 'invnum' => $invoice_number = $this->invoice_id_prefix . preg_replace("/[^0-9,.]/", "", $order->id), 'notifyurl' => '', 'recurring' => ''); $OrderItems = array(); $item_loop = 0; if (sizeof($order->get_items()) > 0) { $ITEMAMT = $TAXAMT = 0; $inc_tax = get_option('woocommerce_prices_include_tax') == 'yes' ? true : false; foreach ($order->get_items() as $item) { $_product = $order->get_product_from_item($item); if ($item['qty']) { $sku = $_product->get_sku(); if ($_product->product_type == 'variation') { if (empty($sku)) { $sku = $_product->parent->get_sku(); } //$this->log->add('paypal-pro', print_r($item['item_meta'], true)); $item_meta = new WC_Order_Item_Meta($item['item_meta']); $meta = $item_meta->display(true, true); $item['name'] = html_entity_decode($item['name'], ENT_NOQUOTES, 'UTF-8'); if (!empty($meta)) { $item['name'] .= " - " . str_replace(", \n", " - ", $meta); } } $Item = array('l_name' => $item['name'], 'l_desc' => '', 'l_amt' => round($item['line_subtotal'] / $item['qty'], 2), 'l_number' => $sku, 'l_qty' => $item['qty'], 'l_taxamt' => '', 'l_ebayitemnumber' => '', 'l_ebayitemauctiontxnid' => '', 'l_ebayitemorderid' => ''); array_push($OrderItems, $Item); $ITEMAMT += round($item['line_subtotal'] / $item['qty'], 2) * $item['qty']; $item_loop++; } } if (!$this->is_wc_version_greater_2_3()) { //Cart Discount if ($order->get_cart_discount() > 0) { foreach (WC()->cart->get_coupons('cart') as $code => $coupon) { $Item = array('l_name' => 'Cart Discount', 'l_desc' => '', 'l_amt' => '-' . WC()->cart->coupon_discount_amounts[$code], 'l_number' => $code, 'l_qty' => '1', 'l_taxamt' => '', 'l_ebayitemnumber' => '', 'l_ebayitemauctiontxnid' => '', 'l_ebayitemorderid' => ''); array_push($OrderItems, $Item); } $ITEMAMT = $ITEMAMT - $order->get_cart_discount(); } //Order Discount if ($order->get_order_discount() > 0) { foreach (WC()->cart->get_coupons('order') as $code => $coupon) { $Item = array('l_name' => 'Order Discount', 'l_desc' => '', 'l_amt' => '-' . WC()->cart->coupon_discount_amounts[$code], 'l_number' => $code, 'l_qty' => '1', 'l_taxamt' => '', 'l_ebayitemnumber' => '', 'l_ebayitemauctiontxnid' => '', 'l_ebayitemorderid' => ''); array_push($OrderItems, $Item); } $ITEMAMT = $ITEMAMT - $order->get_order_discount(); } } else { if ($order->get_total_discount() > 0) { $Item = array('name' => 'Total Discount', 'qty' => 1, 'amt' => -number_format($order->get_total_discount(), 2, '.', '')); array_push($OrderItems, $Item); $ITEMAMT -= number_format($order->get_total_discount(), 2, '.', ''); } } /** * Get shipping and tax. */ if (get_option('woocommerce_prices_include_tax') == 'yes') { $shipping = $order->get_total_shipping() + $order->get_shipping_tax(); $tax = 0; } else { $shipping = $order->get_total_shipping(); $tax = $order->get_total_tax(); } if ('yes' === get_option('woocommerce_calc_taxes') && 'yes' === get_option('woocommerce_prices_include_tax')) { $tax = $order->get_total_tax(); } if ($tax > 0) { $PaymentDetails['taxamt'] = number_format($tax, 2, '.', ''); // Required if you specify itemized cart tax details. Sum of tax for all items on the order. Total sales tax. } if ($shipping > 0) { $PaymentDetails['shippingamt'] = number_format($shipping, 2, '.', ''); // Total shipping costs for the order. If you specify shippingamt, you must also specify itemamt. } } /** * Add custom Woo cart fees as line items */ $item_loop = 0; foreach (WC()->cart->get_fees() as $fee) { $Item = array('name' => $fee->name, 'desc' => '', 'amt' => number_format($fee->amount, 2, '.', ''), 'number' => $fee->id, 'qty' => 1, 'taxamt' => '', 'itemurl' => '', 'itemcategory' => '', 'itemweightvalue' => '', 'itemweightunit' => '', 'itemheightvalue' => '', 'itemheightunit' => '', 'itemwidthvalue' => '', 'itemwidthunit' => '', 'itemlengthvalue' => '', 'itemlengthunit' => '', 'ebayitemnumber' => '', 'ebayitemauctiontxnid' => '', 'ebayitemorderid' => '', 'ebayitemcartid' => ''); array_push($OrderItems, $Item); $ITEMAMT += $fee->amount * $Item['qty']; $item_loop++; } if (!$this->send_items) { $OrderItems = array(); $PaymentDetails['itemamt'] = number_format($ITEMAMT, 2, '.', ''); // Required if you include itemized cart details. (L_AMTn, etc.) Subtotal of items not including S&H, or tax. } else { $PaymentDetails['itemamt'] = number_format($ITEMAMT, 2, '.', ''); // Required if you include itemized cart details. (L_AMTn, etc.) Subtotal of items not including S&H, or tax. } /** * 3D Secure Params */ if ($this->enable_3dsecure) { $Secure3D = array('authstatus3d' => $centinelPAResStatus, 'mpivendor3ds' => $centinelEnrolled, 'cavv' => $centinelCavv, 'eci3ds' => $centinelEciFlag, 'xid' => $centinelXid); } else { $Secure3D = array(); } $PayPalRequestData = array('DPFields' => $DPFields, 'CCDetails' => $CCDetails, 'PayerInfo' => $PayerInfo, 'BillingAddress' => $BillingAddress, 'ShippingAddress' => $ShippingAddress, 'PaymentDetails' => $PaymentDetails, 'OrderItems' => $OrderItems, 'Secure3D' => $Secure3D); if ($this->debug) { $log = $PayPalRequestData; $log['CCDetails']['acct'] = '****'; $log['CCDetails']['cvv2'] = '****'; $this->log->add('paypal-pro', 'Do payment request ' . print_r($log, true)); } // Rounding amendment if (trim(number_format(WC()->cart->total, 2, '.', '')) !== trim(number_format($ITEMAMT, 2, '.', '') + number_format($tax, 2, '.', '') + number_format($shipping, 2, '.', ''))) { $diffrence_amount = $this->get_diffrent(WC()->cart->total, $ITEMAMT + $tax + number_format($shipping, 2, '.', '')); if ($shipping > 0) { $PayPalRequestData['PaymentDetails']['shippingamt'] = number_format($shipping + $diffrence_amount, 2, '.', ''); } elseif ($tax > 0) { $PayPalRequestData['PaymentDetails']['taxamt'] = number_format($tax + $diffrence_amount, 2, '.', ''); } else { $PayPalRequestData['PaymentDetails']['itemamt'] = number_format($PayPalRequestData['PaymentDetails']['itemamt'] + $diffrence_amount, 2); } } // Pass data into class for processing with PayPal and load the response array into $PayPalResult $PayPalResult = $PayPal->DoDirectPayment($PayPalRequestData); if ($this->debug) { $PayPalRequest = isset($PayPalResult['RAWREQUEST']) ? $PayPalResult['RAWREQUEST'] : ''; $PayPalResponse = isset($PayPalResult['RAWRESPONSE']) ? $PayPalResult['RAWRESPONSE'] : ''; $this->log->add('paypal-pro', 'Request: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalRequest)), true)); $this->log->add('paypal-pro', 'Response: ' . print_r($PayPal->NVPToArray($PayPal->MaskAPIResult($PayPalResponse)), true)); } if (empty($PayPalResult['RAWRESPONSE'])) { $pc_empty_response = apply_filters('angelleye_pc_empty_response', __('Empty PayPal response.', 'paypal-for-woocommerce'), $PayPalResult); throw new Exception($pc_empty_response); } if ($PayPal->APICallSuccessful($PayPalResult['ACK'])) { // Add order note $order->add_order_note(sprintf(__('PayPal Pro payment completed (Transaction ID: %s, Correlation ID: %s)', 'paypal-for-woocommerce'), $PayPalResult['TRANSACTIONID'], $PayPalResult['CORRELATIONID'])); //$order->add_order_note("PayPal Results: ".print_r($PayPalResult,true)); /** * Add order notes for AVS result */ $avs_response_code = isset($PayPalResult['AVSCODE']) ? $PayPalResult['AVSCODE'] : ''; $avs_response_message = $PayPal->GetAVSCodeMessage($avs_response_code); $avs_response_order_note = __('Address Verification Result', 'paypal-for-woocommerce'); $avs_response_order_note .= "\n"; $avs_response_order_note .= $avs_response_code; $avs_response_order_note .= $avs_response_message != '' ? ' - ' . $avs_response_message : ''; $order->add_order_note($avs_response_order_note); /** * Add order notes for CVV2 result */ $cvv2_response_code = isset($PayPalResult['CVV2MATCH']) ? $PayPalResult['CVV2MATCH'] : ''; $cvv2_response_message = $PayPal->GetCVV2CodeMessage($cvv2_response_code); $cvv2_response_order_note = __('Card Security Code Result', 'paypal-for-woocommerce'); $cvv2_response_order_note .= "\n"; $cvv2_response_order_note .= $cvv2_response_code; $cvv2_response_order_note .= $cvv2_response_message != '' ? ' - ' . $cvv2_response_message : ''; $order->add_order_note($cvv2_response_order_note); // Payment complete $order->payment_complete($PayPalResult['TRANSACTIONID']); // Remove cart WC()->cart->empty_cart(); // Return thank you page redirect return array('result' => 'success', 'redirect' => $this->get_return_url($order)); } else { // Get error message $error_code = isset($PayPalResult['ERRORS'][0]['L_ERRORCODE']) ? $PayPalResult['ERRORS'][0]['L_ERRORCODE'] : ''; $long_message = isset($PayPalResult['ERRORS'][0]['L_LONGMESSAGE']) ? $PayPalResult['ERRORS'][0]['L_LONGMESSAGE'] : ''; $error_message = $error_code . '-' . $long_message; // Notice admin if has any issue from PayPal if ($this->error_email_notify) { $admin_email = get_option("admin_email"); $message = __("DoDirectPayment API call failed.", "paypal-for-woocommerce") . "\n\n"; $message .= __('Error Code: ', 'paypal-for-woocommerce') . $error_code . "\n"; $message .= __('Detailed Error Message: ', 'paypal-for-woocommerce') . $long_message . "\n"; $message .= __('Order ID: ') . $order->id . "\n"; $message .= __('Customer Name: ') . $order->billing_first_name . ' ' . $order->billing_last_name . "\n"; $message .= __('Customer Email: ') . $order->billing_email . "\n"; $pc_error_email_message = apply_filters('angelleye_pc_error_email_notify_message', $message, $error_code, $long_message); $pc_error_email_subject = apply_filters('angelleye_pc_error_email_notify_subject', "PayPal Pro Error Notification", $error_code, $long_message); wp_mail($admin_email, $pc_error_email_subject, $pc_error_email_message); } if ($this->debug) { $this->log->add('paypal-pro', 'Error ' . print_r($PayPalResult['ERRORS'], true)); } $order->update_status('failed', sprintf(__('PayPal Pro payment failed (Correlation ID: %s). Payment was rejected due to an error: %s', 'paypal-for-woocommerce'), $PayPalResult['CORRELATIONID'], '(' . $PayPalResult['L_ERRORCODE0'] . ') ' . '"' . $error_message . '"')); // Generate error message based on Error Display Type setting if ($this->error_display_type == 'detailed') { $pc_display_type_error = __($error_message, 'paypal-for-woocommerce'); $pc_display_type_notice = __('Payment error:', 'paypal-for-woocommerce') . ' ' . $error_message; } else { $pc_display_type_error = __('There was a problem connecting to the payment gateway.', 'paypal-for-woocommerce'); $pc_display_type_notice = __('Payment error:', 'paypal-for-woocommerce') . ' ' . $error_message; } $pc_display_type_error = apply_filters('angelleye_pc_display_type_error', $pc_display_type_error, $error_code, $long_message); $pc_display_type_notice = apply_filters('angelleye_pc_display_type_notice', $pc_display_type_notice, $error_code, $long_message); wc_add_notice($pc_display_type_notice, "error"); throw new Exception($pc_display_type_error); return; } }