array('HIKA_USERNAME', 'input'), 'password' => array('HIKA_PASSWORD', 'input'), 'signature' => array('SIGNATURE', 'input'), 'environnement' => array('ENVIRONNEMENT', 'list',array( 'production' => 'HIKA_PRODUCTION', 'sandbox' => 'HIKA_SANDBOX', 'beta-sandbox' => 'Beta-Sandbox' )), 'instant_capture' => array('Instant Capture', 'boolean','0'), 'ask_ccv' => array('Ask CCV', 'boolean','1'), 'details' => array('SEND_DETAILS_OF_ORDER', 'boolean','1'), 'send_order_id' => array('Send order id', 'boolean','0'), 'send_notification' => array('ORDER_NOTIFICATION', 'boolean','0'), 'debug' => array('DEBUG', 'boolean','0'), 'cancel_url' => array('CANCEL_URL', 'input'), 'return_url' => array('RETURN_URL', 'input'), 'verified_status' => array('VERIFIED_STATUS', 'orderstatus') ); function needCC(&$method) { $method->ask_cc = true; if( $method->payment_params->ask_ccv ) { $method->ask_ccv = true; } return true; } function onBeforeOrderCreate(&$order, &$do) { if(parent::onBeforeOrderCreate($order, $do) === true) return true; $this->ccLoad(); $amount = round($order->cart->full_total->prices[0]->price_value_with_tax,(int)$this->currency->currency_locale['int_frac_digits']); $vars = array( 'USER' => $this->payment_params->login, 'PWD' => $this->payment_params->password, 'SIGNATURE' => $this->payment_params->signature, 'VERSION' => '51.0', 'METHOD' => 'DoDirectPayment', 'PAYMENTACTION' => $this->payment_params->instant_capture?'Sale':'Authorization', 'AMT' => $amount, 'ACCT' => $this->cc_number, 'EXPDATE' => $this->cc_month.'20'.$this->cc_year, 'FIRSTNAME' => $order->cart->billing_address->address_firstname, 'LASTNAME' => $order->cart->billing_address->address_lastname, 'CURRENCYCODE' => $this->currency->currency_code, 'EMAIL' => $this->user->user_email, 'STREET' => @$order->cart->billing_address->address_street, 'STREET2' => @$order->cart->billing_address->address_street2, 'CITY' => @$order->cart->billing_address->address_city, 'STATE' => @$order->cart->billing_address->address_state->zone_name, 'COUNTRYCODE' => @$order->cart->billing_address->address_country->zone_code_2, 'ZIP' => @$order->cart->billing_address->address_post_code, 'BUTTONSOURCE' => 'HikariSoftware_Cart_DP' ); if(@$this->payment_params->send_order_id){ $database = JFactory::getDBO(); $database->setQuery('SELECT MAX(order_id) FROM #__hikashop_order;'); $max = (int)$database->loadResult(); $vars['INVNUM'] = $max+1; } if(!empty($order->cart->billing_address->address_street2)){ $vars['STREET2'] = substr($order->cart->billing_address->address_street2,0,99); } if(!empty($order->cart->shipping_address)){ $vars['SHIPTONAME'] = @$order->cart->shipping_address->address_firstname.' '.@$order->cart->shipping_address->address_lastname; $vars['SHIPTOSTREET'] = @$order->cart->shipping_address->address_street; $vars['SHIPTOSTREET2'] = @$order->cart->shipping_address->address_street2; $vars['SHIPTOCITY'] = @$order->cart->shipping_address->address_city; if(in_array(@$order->cart->shipping_address->address_country->zone_code_2, array('US'))){ $vars['SHIPTOSTATE'] = @$order->cart->shipping_address->address_state->zone_code_3; }else{ $vars['SHIPTOSTATE'] = @$order->cart->shipping_address->address_state->zone_name; } $vars['SHIPTOCOUNTRY'] = @$order->cart->shipping_address->address_country->zone_code_2; $vars['SHIPTOZIP'] = @$order->cart->shipping_address->address_post_code; $vars['SHIPTOPHONENUM'] = @$order->cart->shipping_address->address_phone; } if(!isset($this->payment_params->details)) $this->payment_params->details = 1; if(!empty($this->payment_params->details)){ $i = 1; $tax = 0; $config =& hikashop_config(); $group = $config->get('group_options',0); foreach($order->cart->products as $product){ if($group && $product->order_product_option_parent_id) continue; if($product->order_product_quantity<1) continue; $vars["L_NAME".$i] = substr(strip_tags($product->order_product_name),0,127); $vars["L_NUMBER".$i] = $product->order_product_code; $vars["L_AMT".$i] = round($product->order_product_price,(int)$this->currency->currency_locale['int_frac_digits']); $vars["L_QTY".$i] = $product->order_product_quantity; $vars["L_TAXAMT".$i] = round($product->order_product_tax,(int)$this->currency->currency_locale['int_frac_digits']); $tax += round($product->order_product_tax,(int)$this->currency->currency_locale['int_frac_digits'])*$product->order_product_quantity; $i++; } if(bccomp($tax,0,5)){ $vars['TAXAMT'] = round($tax+$order->order_shipping_tax+$order->order_payment_tax-$order->order_discount_tax,(int)$this->currency->currency_locale['int_frac_digits']); } if(!empty($order->cart->coupon)){ $discount = - round($order->order_discount_price,(int)$this->currency->currency_locale['int_frac_digits']); $vars["L_NAME".$i] = JText::_('HIKASHOP_COUPON'); $vars["L_NUMBER".$i] = 'coupon'; $vars["L_AMT".$i] = $discount; $vars["L_QTY".$i] = 1; $vars["L_TAXAMT".$i] = 0; $i++; } if(!empty($order->order_payment_price) && bccomp($order->order_payment_price,0,5)){ $vars["L_NAME".$i] = JText::_('HIKASHOP_PAYMENT'); $vars["L_NUMBER".$i] = 'payment'; $vars["L_AMT".$i] = round($order->order_payment_price-$order->order_payment_tax,(int)$this->currency->currency_locale['int_frac_digits']); $vars["L_QTY".$i] = 1; $vars["L_TAXAMT".$i] = round($order->order_payment_tax,(int)$this->currency->currency_locale['int_frac_digits']); $i++; } if(!empty($order->order_shipping_price) && bccomp($order->order_shipping_price,0,5)){ $vars['SHIPPINGAMT'] = round($order->order_shipping_price,(int)$this->currency->currency_locale['int_frac_digits']); } $vars['ITEMAMT']=$vars['AMT']-(@$vars['TAXAMT']+@$vars['SHIPPINGAMT']); } if( $this->payment_params->ask_ccv ) { $vars['CVV2'] = $this->cc_CCV; } if( $this->payment_params->debug ) { echo print_r($vars, true) . "\n\n\n"; } $session = curl_init(); curl_setopt($session, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($session, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($session, CURLOPT_POST, 1); curl_setopt($session, CURLOPT_RETURNTRANSFER, 1); curl_setopt($session, CURLOPT_VERBOSE, 1); curl_setopt($session, CURLOPT_FOLLOWLOCATION, 0); curl_setopt($session, CURLOPT_FAILONERROR, true); $httpsHikashop = str_replace('http://','https://', HIKASHOP_LIVE); $url = 'api-3t.paypal.com/nvp'; if( $this->payment_params->environnement != 'production' ) { $url = 'api-3t.'.$this->payment_params->environnement.'.paypal.com/nvp'; } if( $this->payment_params->debug ) { echo print_r($url, true) . "\n\n\n"; } $tmp = array(); foreach($vars as $k => $v) { $tmp[] = $k . '=' . urlencode(trim($v)); } $tmp = implode('&', $tmp); curl_setopt($session, CURLOPT_URL, 'https://' . $url); curl_setopt($session, CURLOPT_REFERER, $httpsHikashop); curl_setopt($session, CURLOPT_POSTFIELDS, $tmp); $ret = curl_exec($session); $error = curl_errno($session); if( !$error ) { $params = explode('&', $ret); $ret = array(); foreach($params as $p) { $t = explode('=', $p); $ret[strtoupper($t[0])] = $t[1]; } if( $this->payment_params->debug ) { echo print_r($ret, true) . "\n\n\n"; } $responseCode = null; if( isset($ret['ACK']) ) { $responseCode = strtoupper($ret['ACK']); } if( isset($responseCode) ) { if( $responseCode == 'SUCCESS' || $responseCode == 'SUCCESSWITHWARNING' ) { $history = array( 'notified' => (int)@$this->payment_params->send_notification, 'data' => 'PayPal transaction id: ' .$ret['TRANSACTIONID'], ); $this->modifyOrder($order, $this->payment_params->verified_status, $history, false); $this->transaction_id = $ret['TRANSACTIONID']; } else { $message = 'Error'; if(!empty($ret['ERRORCODE'])){ $message.=' '.$ret['ERRORCODE']; }elseif(!empty($ret['L_ERRORCODE0'])){ $message.=' '.$ret['L_ERRORCODE0']; } if(!empty($ret['LONGMESSAGE'])){ $message.=': '.urldecode($ret['LONGMESSAGE']); }elseif(!empty($ret['L_LONGMESSAGE0'])){ $message.=': '.urldecode($ret['L_LONGMESSAGE0']); } $this->app->enqueueMessage($message); $do = false; } } else { $this->app->enqueueMessage('An error occurred. No response code in PayPal Pro server\'s response'); $do = false; } } else { $this->app->enqueueMessage('An error occurred. The connection to the PayPal Pro server could not be established: '.curl_error($session)); $do = false; } curl_close($session); $this->ccClear(); return true; } function onAfterOrderCreate(&$order, &$do) { $this->loadOrderData($order); $this->loadPaymentParams($order); if($this->app->isAdmin()) return true; if(empty($order->order_payment_method) || $order->order_payment_method != $this->name) return true; if(empty($this->payment_params)) return false; if(!empty($this->transaction_id)){ $do = true; $email = new stdClass(); $email->subject = JText::sprintf('PAYMENT_NOTIFICATION_FOR_ORDER','PayPal Pro','SUCCESS',$order->order_number); $url = HIKASHOP_LIVE.'administrator/index.php?option=com_hikashop&ctrl=order&task=listing'; $order_text = "\r\n".JText::sprintf('NOTIFICATION_OF_ORDER_ON_WEBSITE',$order->order_number,HIKASHOP_LIVE); $order_text .= "\r\n".str_replace('
',"\r\n",JText::sprintf('ACCESS_ORDER_WITH_LINK',$url)); $body = str_replace('
',"\r\n",JText::sprintf('PAYMENT_NOTIFICATION_STATUS','PayPal Pro','SUCCESS')).' '.JText::sprintf('ORDER_STATUS_CHANGED',$order->order_status)."\r\n\r\n".$order_text; $email->body = $body; $this->modifyOrder($order,$order->order_status,false,$email); $class = hikashop_get('class.cart'); $class->cleanCartFromSession(); } } function onAfterOrderConfirm(&$order,&$methods,$method_id){ parent::onAfterOrderConfirm($order,$methods,$method_id); return $this->showPage('thanks'); } function onPaymentConfiguration(&$element){ parent::onPaymentConfiguration($element); $obj = $element; $field = ''; if(empty($obj->payment_params->login)){ $field = JText::_( 'USERNAME' ); }elseif(empty($obj->payment_params->password)){ $field = JText::_( 'PASSWORD' ); }elseif(empty($obj->payment_params->signature)){ $field = JText::_( 'SIGNATURE' ); } if(!empty($field)){ $app = JFactory::getApplication(); $lang = JFactory::getLanguage(); $locale=strtolower(substr($lang->get('tag'),0,2)); $app->enqueueMessage(JText::sprintf('ENTER_INFO_REGISTER_IF_NEEDED','PayPal Pro',$field,'PayPal Pro','https://www.paypal.com/'.$locale.'/mrb/pal=SXL9FKNKGAEM8')); } } function getPaymentDefaultValues(&$element) { $element->payment_name='PayPal Pro'; $element->payment_description='You can pay by credit card using this payment method'; $element->payment_images='MasterCard,VISA,Credit_card'; $element->payment_params->login=''; $element->payment_params->password=''; $element->payment_params->ask_ccv = true; $element->payment_params->pending_status='created'; $element->payment_params->verified_status='confirmed'; } }