Payement gateways and update to woocommerce 2.0.4
-
Hi, I had some code that I added to the plugin to add DineroMail as a gateway. It worked fine before the last version of woocommerce came up, when I updated the fix no longer worked. What I would like to know is if anyone knows what changed in the last woocommerce version (2.0.4) that I should have to change in the code I have.
I’ll copy it below so you can see.
First the gateway had to be added to woocommerce.php by adding
include( 'classes/gateways/dineromail/class-wc-dineromail.php' );Second the DineroMail icon had to be added to the icons folder and finally in the classes folder add a file named class-wc-dineromail.php that contained:
<?php /** * DineroMail Standard Payment Gateway * * Provides a Dineromail Standard Payment Gateway. * * @class WC_Dineromail * @extends WC_Payment_Gateway */ class WC_Dineromail extends WC_Payment_Gateway { /** * Constructor for the gateway. * * @access public * @return void */ public function __construct() { global $woocommerce; $this->id = 'dineromail'; $this->icon = apply_filters('woocommerce_dineromail_icon', $woocommerce->plugin_url() . '/assets/images/icons/dineromail.png'); $this->has_fields = false; $this->liveurl = 'https://checkout.dineromail.com/CheckOut'; $this->testurl = 'https://checkout.dineromail.com/CheckOut'; $this->method_title = __( 'DineroMail', 'woocommerce' ); // Load the form fields. $this->init_form_fields(); // Load the settings. $this->init_settings(); // Define user set variables $this->title = $this->settings['title']; $this->description = $this->settings['description']; $this->cuenta = $this->settings['cuenta']; $this->email = $this->settings['email']; $this->country = $this->settings['country']; $this->logo = $this->settings['logo']; $this->ipnpass = $this->settings['ipnpass']; $this->form_submission_method = ( isset( $this->settings['form_submission_method'] ) && $this->settings['form_submission_method'] == 'yes' ) ? true : false; // Logs $this->log = $woocommerce->logger(); // Actions add_action( 'init', array(&$this, 'check_ipn_response') ); add_action('valid-dineromail-standard-ipn-request', array(&$this, 'successful_request') ); add_action('woocommerce_receipt_dineromail', array(&$this, 'receipt_page')); add_action('woocommerce_update_options_payment_gateways', array(&$this, 'process_admin_options')); if ( !$this->is_valid_for_use() ) $this->enabled = false; } function is_valid_for_use() { if (!in_array(get_woocommerce_currency(), array('ARS', 'BRL', 'CLP', 'MXN', 'USD'))) return false; return true; } public function admin_options() { ?> <h3><?php _e('DineroMail standard', 'woocommerce'); ?></h3> <p><?php _e('DineroMail standard works by sending the user to DineroMail to enter their payment information.', 'woocommerce'); ?></p> <table class="form-table"> <?php if ( $this->is_valid_for_use() ) : // Generate the HTML For the settings form. $this->generate_settings_html(); else : ?> <div class="inline error"><p><strong><?php _e( 'Gateway Disabled', 'woocommerce' ); ?></strong>: <?php _e( 'DineroMail does not support your store currency.', 'woocommerce' ); ?></p></div> <?php endif; ?> </table><!--/.form-table--> <?php } function init_form_fields() { $this->form_fields = array( 'enabled' => array( 'title' => __( 'Activar/Desactivar', 'woocommerce' ), 'type' => 'checkbox', 'label' => __( 'Activar DineroMail Estándar', 'woocommerce' ), 'default' => 'yes' ), 'title' => array( 'title' => __( 'Title', 'woocommerce' ), 'type' => 'text', 'description' => __( '<br />Este el título que el usuario mira en el checkout de WordPress.', 'woocommerce' ), 'default' => __( 'DineroMail', 'woocommerce' ) ), 'description' => array( 'title' => __( 'Description', 'woocommerce' ), 'type' => 'textarea', 'description' => __( 'Esta és la descripción que el usuario mira en el checkout de WordPress.', 'woocommerce' ), 'default' => __("Pago con DineroMail", 'woocommerce') ), 'cuenta' => array( 'title' => __( 'Número de la Cuenta', 'woocommerce' ), 'type' => 'text', 'description' => __( '<br />Debe ser insertado sin la barra(/) y sin el último dígito.', 'woocommerce' ), 'default' => '' ), 'email' => array( 'title' => __( 'Mail de Registro en DineroMail', 'woocommerce' ), 'type' => 'text', 'description' => __( '<br />Informe el mail que usou para se registrar en DineroMail.', 'woocommerce' ), 'default' => '' ), 'country' => array( 'title' => __( 'País de Registro', 'woocommerce' ), 'type' => 'select', 'description' => __( '<br />Informe el país de registro de su cuenta de DineroMail.', 'woocommerce' ), 'options' => array( 'Argentina' => __( 'Argentina', 'woocommerce' ), 'Brasil' => __( 'Brasil', 'woocommerce' ), 'Chile' => __( 'Chile', 'woocommerce' ), 'México' => __( 'México', 'woocommerce' ) ) ), 'logo' => array( 'title' => __( 'Logo de la Tienda', 'woocommerce' ), 'type' => 'text', 'description' => __( '<br />Informe la url donde está alojada la imagen. Ejemplo: http://www.meusite/imagens/logo.jpg<br />Tamaño máximo que debes tener <b>756x100</b>.', 'woocommerce' ), 'default' => '', 'readyonli' ), 'ipnpass' => array( 'title' => __( 'Contraseña IPN', 'woocommerce' ), 'type' => 'text', 'description' => __( '<br />Informe la contraseña IPN caso vás usar la notificación de DienroMail.<br />Use la URL informada abajo para configurar la Notificación de DineroMail.<br />Para más informaciones sobre la IPN, consulte el manual IPN disponible en la url <a href="https://br.dineromail.com/biblioteca" target="_blank">https://br.dineromail.com/biblioteca</a>.', 'woocommerce' ), 'default' => '' ), 'ipnurl' => array( 'title' => __( 'URL IPN', 'woocommerce' ), 'type' => 'textarea', 'description' => __( 'Caso vás usar la notificacion de DineroMail use la url ariba.<br />Para más informaciones sobre la URL IPN consulte el Manual IPN disponible en la url <a href="https://br.dineromail.com/biblioteca" target="_blank">https://br.dineromail.com/biblioteca</a>', 'woocommerce' ), 'default' => trailingslashit( home_url() ) . '?dineromailListener=dineromail_standard_IPN' ) ); } function get_dineromail_args( $order ) { global $woocommerce; $order_id = $order->id; if($this->country == "Argentina") { $currency = "ars"; $language = "es"; $countryid = 1; } elseif($this->country == "Brasil") { $currency = "brl"; $language = "pt"; $countryid = 2; } elseif($this->country == "Chile") { $currency = "clp"; $language = "es"; $countryid = 3; } elseif($this->country == "México") { $currency = "mxn"; $language = "es"; $countryid = 4; } if ($this->debug=='yes') $this->log->add( 'dineromail', 'Generating payment form for order #' . $order_id . '. Notify URL: ' . trailingslashit(home_url()).'?dineromailListener=dineromail_standard_IPN'); $dineromail_args = array_merge( array( 'change_quantity' => '0', 'payment_method_available' => 'all', 'merchant' => $this->cuenta, 'country_id' => $countryid, 'header_image' => $this->logo, 'seller_name' => get_bloginfo( 'name' ), 'language' => $language, 'transaction_id' => $order_id, 'currency' => $currency, 'ok_url' => add_query_arg( 'utm_nooverride', '1', $this->get_return_url( $order ) ), 'pending_url' => add_query_arg( 'utm_nooverride', '1', $this->get_return_url( $order ) ), 'error_url' => $order->get_cancel_order_url(), // Billing Address info 'buyer_name' => $order->billing_first_name, 'buyer_lastname' => $order->billing_last_name, 'buyer_email' => $order->billing_email, 'buyer_phone' => str_replace( array( '(', '-', ' ', ')', '.' ), '', $order->billing_phone ) ) ); // If prices include tax or have order discounts, send the whole order as a single item if ( get_option('woocommerce_prices_include_tax')=='yes' || $order->get_order_discount() > 0 ) : $pricediscount = sprintf('%.1f',$order->get_order_discount()); // Discount $dineromail_args['display_additional_charge'] = 1; $dineromail_args['additional_fixed_charge'] = $pricediscount.'-'; $dineromail_args['additional_fixed_charge_currency'] = get_woocommerce_currency(); endif; $item_names = array(); if (sizeof($order->get_items())>0) : foreach ($order->get_items() as $item) : if ($item['qty']) : $item_loop++; $product = $order->get_product_from_item($item); $item_name = $item['name']; $item_meta = new WC_Order_Item_Meta( $item['item_meta'] ); if ($meta = $item_meta->display( true, true )) : $item_name .= ' ('.$meta.')'; endif; $dineromail_args['item_name_'.$item_loop] = $item_name; $dineromail_args['item_quantity_'.$item_loop] = $item['qty']; $dineromail_args['item_ammount_'.$item_loop] = $order->get_item_total( $item, false );//$order->get_item_total( $item, true, true ); $dineromail_args['item_currency_'.$item_loop] = get_woocommerce_currency(); endif; endforeach; endif; // Shipping Cost if ( ( $order->get_shipping() + $order->get_shipping_tax() ) > 0 ) : $item_loop++; $dineromail_args['item_name_'.$item_loop] ='WPW - Tasa de Flete'; $dineromail_args['item_quantity_'.$item_loop] = '1'; $dineromail_args['item_ammount_'.$item_loop] = number_format( $order->get_shipping(), 2, '.', '' );//number_format( $order->get_shipping() + $order->get_shipping_tax() , 2, '.', '' ); $dineromail_args['item_currency_'.$item_loop] = get_woocommerce_currency(); endif; if ( $order->get_total_tax() > 0 ) : $item_loop++; $dineromail_args['item_name_'.$item_loop] ='WPW - Tasa de Impuesto'; $dineromail_args['item_quantity_'.$item_loop] = '1'; $dineromail_args['item_ammount_'.$item_loop] = number_format( $order->get_total_tax() , 2, '.', '' ); $dineromail_args['item_currency_'.$item_loop] = get_woocommerce_currency(); endif; $dineromail_args = apply_filters( 'woocommerce_dineromail_args', $dineromail_args ); return $dineromail_args; } function generate_dineromail_form( $order_id ) { global $woocommerce; $order = new WC_Order( $order_id ); $dineromail_adr = $this->liveurl; $dineromail_args = $this->get_dineromail_args( $order ); $dineromail_args_array = array(); foreach ($dineromail_args as $key => $value) { $dineromail_args_array[] = '<input type="hidden" name="'.esc_attr( $key ).'" value="'.esc_attr( $value ).'" />'; } $woocommerce->add_inline_js(' jQuery("body").block({ message: "<img src=\"' . esc_url( apply_filters( 'woocommerce_ajax_loader_url', $woocommerce->plugin_url() . '/assets/images/ajax-loader.gif' ) ) . '\" alt=\"Redirecting…\" style=\"float:left; margin-right: 10px;\" />'.__('Gracias por su pedido. Ahora estamos te redirigiremos a DineroMail para hacer el pago.', 'woocommerce').'", overlayCSS: { background: "#fff", opacity: 0.6 }, css: { padding: 28, textAlign: "center", color: "#555", border: "3px solid #aaa", backgroundColor:"#fff", cursor: "wait", lineHeight: "32px" } }); jQuery("#submit_dineromail_payment_form").click(); '); return '<form action="'.esc_url( $dineromail_adr ).'" method="post" id="dineromail_payment_form" target="_top"> ' . implode('', $dineromail_args_array) . ' <input type="submit" class="button-alt" id="submit_dineromail_payment_form" value="'.__('Pay via DineroMail', 'woocommerce').'" /> <a class="button cancel" href="'.esc_url( $order->get_cancel_order_url() ).'">'.__('Cancel order & restore cart', 'woocommerce').'</a> </form>'; } function process_payment( $order_id ) { $order = new WC_Order( $order_id ); if ( $this->form_submission_method ) { $dineromail_args = $this->get_dineromail_args( $order ); $dineromail_args = http_build_query( $dineromail_args, '', '&' ); $dineromail_adr = $this->liveurl . '?'; return array( 'result' => 'success', 'redirect' => $dineromail_adr . $dineromail_args ); } else { return array( 'result' => 'success', 'redirect' => add_query_arg('order', $order->id, add_query_arg('key', $order->order_key, get_permalink(woocommerce_get_page_id('pay')))) ); } } function receipt_page( $order ) { echo '<p>'.__('Thank you for your order, please click the button below to pay with DineroMail.', 'woocommerce').'</p>'; echo $this->generate_dineromail_form( $order ); } /** * Check DineroMail IPN validity **/ function check_ipn_request_is_valid() { global $woocommerce; if ($this->debug=='yes') $this->log->add( 'dineromail', 'Checking IPN response is valid...' ); // Get recieved values from post data $received_values = (array) stripslashes_deep( $_POST ); // Add cmd to the post array $received_values['cmd'] = '_notify-validate'; // Send back post vars to dineromail $params = array( 'body' => $received_values, 'sslverify' => false, 'timeout' => 30, 'user-agent' => 'WooCommerce/' . $woocommerce->version ); // Get url if ( $this->testmode == 'yes' ): $dineromail_adr = $this->testurl; else : $dineromail_adr = $this->liveurl; endif; // Post back to get a response $response = wp_remote_post( $dineromail_adr, $params ); if ($this->debug=='yes') $this->log->add( 'dineromail', 'IPN Response: ' . print_r($response, true) ); // check to see if the request was valid if ( !is_wp_error($response) && $response['response']['code'] >= 200 && $response['response']['code'] < 300 && (strcmp( $response['body'], "VERIFIED") == 0)) { if ($this->debug=='yes') $this->log->add( 'dineromail', 'Received valid response from DineroMail' ); return true; } if ($this->debug=='yes') : $this->log->add( 'dineromail', 'Received invalid response from DineroMail' ); if (is_wp_error($response)) : $this->log->add( 'dineromail', 'Error response: ' . $result->get_error_message() ); endif; endif; return false; } /** * Check for DineroMail IPN Response * * @access public * @return void */ function check_ipn_response() { if (isset($_GET['dineromailListener']) && $_GET['dineromailListener'] == 'dineromail_standard_IPN'): $_POST = stripslashes_deep($_POST); if($_REQUEST['Notificacion']){ ini_set("allow_url_fopen", 1); ini_set("allow_url_include", 1); $notificacion = htmlspecialchars_decode($_REQUEST['Notificacion']); $notificacion = str_replace("<?xml version='1.0'encoding='ISO-8859-1'?>", "", $notificacion); $notificacion = str_replace("<?xml version=\'1.0\'encoding=\'ISO-8859-1\'?>", "", $notificacion); $notificacion = str_replace("<?xmlversion=\'1.0\'encoding=\'ISO-8859-1\'?>", "", $notificacion); $notificacion = str_replace("<?xmlversion='1.0'encoding='ISO-8859-1'?>", "", $notificacion); $notificacion = str_replace("<?xml version='1.0' encoding='ISO-8859-1'?>", "", $notificacion); $notificacion = str_replace("<?xml version=\'1.0\' encoding=\'ISO-8859-1\'?>", "", $notificacion); $doc = new SimpleXMLElement($notificacion); $tipo_notificacion = $doc ->tiponotificacion; foreach ($doc ->operaciones ->operacion as $OPERACION){ $id_operacion = $OPERACION->id; $this->successful_request($id_operacion); } } endif; } /** * Successful Payment! * * @access public * @param array $posted * @return void */ function successful_request( $id_operacion ) { global $woocommerce; $order = new WC_Order( (int)$id_operacion ); $nrocta = $this->cuenta; $senhaipn = $this->ipnpass; //var_dump($order); if($this->country == "Argentina") { $url="https://argentina.dineromail.com/Vender/Consulta_IPN.asp"; } elseif($this->country == "Brasil") { $url="https://brasil.dineromail.com/Vender/Consulta_IPN.asp"; } elseif($this->country == "Chile") { $url="https://chile.dineromail.com/Vender/Consulta_IPN.asp"; } elseif($this->country == "México") { $url="https://mexico.dineromail.com/Vender/Consulta_IPN.asp"; } $data = 'DATA=<REPORTE><NROCTA>'.$nrocta.'</NROCTA><DETALLE><CONSULTA><CLAVE>'.$senhaipn.'</CLAVE><TIPO>1</TIPO><OPERACIONES><ID>'.$id_operacion.'</ID></OPERACIONES></CONSULTA></DETALLE></REPORTE>'; $url = parse_url($url); $host = $url['host']; $path = $url['path']; $fp = fsockopen($host, 80); fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); //fputs($fp, "Referer: $referer\r\n"); fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ". strlen($data) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $data); $result = ''; while(!feof($fp)) { // resultado del request $result .= fgets($fp, 128); } // cierra conexion fclose($fp); // separa el header del content $result = explode("\r\n\r\n", $result, 2); //$header = isset($result[0]) ? $result[0] : ''; $content = isset($result[1]) ? $result[1] : ''; $xml = new SimpleXMLElement($content); $estadoxml = $xml ->ESTADOREPORTE; if($estadoxml==1){ foreach ($xml ->DETALLE->OPERACIONES->OPERACION as $OPERACION){ $trx_id= $OPERACION->ID; $estadotrans= $OPERACION->ESTADO; if($estadotrans==1){ $order->update_status( 'pending' ); } elseif($estadotrans==2){ $order->update_status( 'completed' ); } elseif($estadotrans==3){ $order->update_status( 'cancelled' ); } } } } } /** * Add the gateway to WooCommerce * * @access public * @param array $methods * @package WooCommerce/Classes/Payment * @return array */ function add_dineromail_gateway( $methods ) { $methods[] = 'WC_Dineromail'; return $methods; } add_filter('woocommerce_payment_gateways', 'add_dineromail_gateway' );if anyone understands spanish the whole explanation is here
Could anyone help me out here?
Thanks so much.
Lili
The topic ‘Payement gateways and update to woocommerce 2.0.4’ is closed to new replies.