Jump to content
  • Checkout
  • Login
  • Get in touch

osCommerce

The e-commerce.

beanstream transaction validation


jimlongo

Recommended Posts

Hi, I would like to pass username/password validation with each request to beanstream.

 

I'm using osC v2.3.3.4 and the following files to transact with Beanstream.  Any help would be greatly appreciated.  Thanks.

 

beanstream_cdn.php

<?php
/*
  Beanstream Payment Module beanstream.php version 0.3.1
  Contributing Authors:
  Mike Bridge ([email protected]) ---- v0.1 and v0.2 
  Paul 01ynek (paul@[member=AllCrystalClear].com) - v0.3.0
  Bill Ng     ([email protected]) ---- v0.3.1 
  version 0.3.1 Copyright (C)2004 www.Beanstream.com
	Paul 01ynek (paul@[member=AllCrystalClear].com) - v0.3.2
	Dean Wang   (dean@[member=AllCrystalClear].com) - v0.3.3 
	Vincent Demers ([email protected]) = v0.3.4 //cvv integration	
  This program is free software; you can redistribute it and/or modify it under the terms
  of the GNU General Public License as published by the Free Software Foundation.
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU General Public License for more details.
  File resides in: catalog/includes/modules/payment/
*/


  class beanstream_cdn {
  var $code, $title, $description, $enabled, $bean_cc_owner, $bean_cc_number, $bean_cc_cvd;


// class constructor
    function beanstream_cdn() {
      global $order;
      $this->bean_cc_owner ='null' ;
      $this->bean_cc_cvd ='null' ;
      $this->code = 'beanstream_cdn';
      $this->title = MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_TITLE;
      $this->description = MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_DESCRIPTION;
      $this->sort_order = MODULE_PAYMENT_BEANSTREAM_CDN_SORT_ORDER;
      $this->enabled = ((MODULE_PAYMENT_BEANSTREAM_CDN_STATUS == 'True') ? true : false);

      if ((int)MODULE_PAYMENT_BEANSTREAM_CDN_ORDER_STATUS_ID > 0) {
        $this->order_status = MODULE_PAYMENT_BEANSTREAM_CDN_ORDER_STATUS_ID;
      }

      if (is_object($order)) $this->update_status();

			// CUSTOMIZATION: customized for each OsCommerce website
	  $this->form_action_url = 'bean_webobject.php';
    }


// class methods
    function update_status() {
      global $order;

      if ( ($this->enabled == true) && ((int)MODULE_PAYMENT_BEANSTREAM_CDN_ZONE > 0) ) {
        $check_flag = false;
        $check_query = tep_db_query("select zone_id from " . TABLE_ZONES_TO_GEO_ZONES . " where geo_zone_id = '" . MODULE_PAYMENT_BEANSTREAM_CDN_ZONE . "' and zone_country_id = '" . $order->billing['country']['id'] . "' order by zone_id");
        while ($check = tep_db_fetch_array($check_query)) {
          if ($check['zone_id'] < 1) {
            $check_flag = true;
            break;
          } elseif ($check['zone_id'] == $order->billing['zone_id']) {
            $check_flag = true;
            break;
          }
        }

        if ($check_flag == false) {
          $this->enabled = false;
        }
      }
    }


				   

    function javascript_validation() {
      $js = '  if (payment_value == "' . $this->code . '") {' . "\n" .
            '    var cc_owner = document.checkout_payment.beanstream_cdn_cc_owner.value;' . "\n" .
            '    var cc_number = document.checkout_payment.beanstream_cdn_cc_number.value;' . "\n" .
            '    if (cc_owner == "" || cc_owner.length < ' . CC_OWNER_MIN_LENGTH . ') {' . "\n" .
            '      error_message = error_message + "' . MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_JS_CC_OWNER . '";' . "\n" .
            '      error = 1;' . "\n" .
            '    }' . "\n" .
            '    if (cc_number == "" || cc_number.length < ' . CC_NUMBER_MIN_LENGTH . ') {' . "\n" .
            '      error_message = error_message + "' . MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_JS_CC_NUMBER . '";' . "\n" .
            '      error = 1;' . "\n" .
            '    }' . "\n" .
            '  }' . "\n";

      return $js;
    }


    function selection() {
      global $order;
	  $jscript_url33 = '<a style="cursor: pointer; cursor: hand;"' . " onclick=\"javascript:popup=window.open(\'" . tep_href_link('cvv_popup_help.php') . "\',\'popup\',\'scrollbars,resizable,width=625,height=400,left=50,top=50\'); popup.focus(); return false;\">";

      $my_ccv_explain = "<script>document.writeln('" . $jscript_url33 .
                    MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_POPUP_CVV_LINK . "</a>');</script>" .
                    '<noscript><a href="' . $this->cc_explain_url . '" target="_blank">' .
                    MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_POPUP_CVV_LINK . '</noscript>' ."\n" ;

      for ($i=1; $i < 13; $i++) {
        $expires_month[] = array('id' => sprintf('%02d', $i), 'text' => strftime('%B',mktime(0,0,0,$i,1,2000)));
      }

      $today = getdate(); 
      for ($i=$today['year']; $i < $today['year']+10; $i++) {
        $expires_year[] = array('id' => strftime('%y',mktime(0,0,0,1,1,$i)), 'text' => strftime('%Y',mktime(0,0,0,1,1,$i)));
      }

      $selection = array('id' => $this->code,
		 'module' => $this->title,
		  
		 'fields' => array(array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_OWNER,
								 'field' => tep_draw_input_field('beanstream_cdn_cc_owner', $customer['customers_firstname'] . ' ' . $customer['customers_lastname'])),
						   array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_NUMBER,
								 'field' => tep_draw_input_field('beanstream_cdn_cc_number')),
						   array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_CVD,
								 'field' => tep_draw_input_field('beanstream_cdn_cc_cvd', '', "size=4, maxlength=4"). ' ' . tep_image('images/mini_cvv2.gif',' CCV ','','','align="absmiddle"')  . ' ' .  $my_ccv_explain),
						   array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_EXPIRES,
								 'field' => tep_draw_pull_down_menu('beanstream_cdn_cc_expires_month', $expires_month) . ' ' . tep_draw_pull_down_menu('beanstream_cdn_cc_expires_year', $expires_year))));

      return $selection;
    }


    function pre_confirmation_check() {
      global $HTTP_POST_VARS;

      include(DIR_WS_CLASSES . 'cc_validation.php');

      $cc_validation = new cc_validation();
      $result = $cc_validation->validate($HTTP_POST_VARS['beanstream_cdn_cc_number'], $HTTP_POST_VARS['beanstream_cdn_cc_expires_month'], $HTTP_POST_VARS['beanstream_cdn_cc_expires_year']);

      $error = '';
      switch ($result) {
        case -1:
          $error = sprintf(TEXT_CCVAL_ERROR_UNKNOWN_CARD, substr($cc_validation->cc_number, 0, 4));
          break;
        case -2:
        case -3:
        case -4:
          $error = TEXT_CCVAL_ERROR_INVALID_DATE;
          break;
        case false:
          $error = TEXT_CCVAL_ERROR_INVALID_NUMBER;
          break;
      }

      if ( ($result == false) || ($result < 1) ) {
        $payment_error_return = 'payment_error=' . $this->code . '&error=' . urlencode($error) . '&beanstream_cdn_cc_owner_firstname=' . urlencode($HTTP_POST_VARS['beanstream_cdn_cc_owner_firstname']) . '&beanstream_cdn_cc_owner_lastname=' . urlencode($HTTP_POST_VARS['beanstream_cdn_cc_owner_lastname']) . '&beanstream_cdn_cc_expires_month=' . $HTTP_POST_VARS['beanstream_cdn_cc_expires_month'] . '&beanstream_cdn_cc_expires_year=' . $HTTP_POST_VARS['beanstream_cdn_cc_expires_year']. '&beanstream_cdn_cc_cvd=' . $HTTP_POST_VARS['beanstream_cdn_cc_cvd'];

        tep_redirect(tep_href_link(FILENAME_CHECKOUT_PAYMENT, $payment_error_return, 'SSL', true, false));
      }

      $this->cc_card_type = $cc_validation->cc_type;
      $this->cc_card_number = $cc_validation->cc_number;
      $this->cc_expiry_month = $cc_validation->cc_expiry_month;
      $this->cc_expiry_year = $cc_validation->cc_expiry_year;
    }


    function confirmation() {
      global $HTTP_POST_VARS; 
      
      $this->bean_cc_owner = $HTTP_POST_VARS['beanstream_cdn_cc_owner'];
      $this->bean_cc_number = $HTTP_POST_VARS['beanstream_cdn_cc_number'];
      $this->bean_cc_cvd = $HTTP_POST_VARS['beanstream_cdn_cc_cvd'];
       
      $confirmation = array('title' => $this->title . ': ' . $this->cc_card_type,
                            'fields' => array(array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_OWNER,
                                                    'field' => $this->bean_cc_owner),
                                              array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_NUMBER,
                                                    'field' => substr($this->cc_card_number, 0, 4) . str_repeat('X', (strlen($this->cc_card_number) - 8)) . substr($this->cc_card_number, -4)),
                                              array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CVD,
                                                    'field' => str_repeat('X', (strlen($this->bean_cc_cvd)))),
                                              array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_CREDIT_CARD_EXPIRES,
                                                    'field' => strftime('%B, %Y', mktime(0,0,0,$HTTP_POST_VARS['beanstream_cdn_cc_expires_month'], 1, '20' . $HTTP_POST_VARS['beanstream_cdn_cc_expires_year'])))));

      return $confirmation;
    }


    function process_button() {
      global $HTTP_POST_VARS, $order, $currencies, $currency;
      
      $domain="https://";
      if (!$_SERVER['HTTPS']) {
		$domain="http://";
      }
      $domain .= $_SERVER['SERVER_NAME'];
      
      $successpage=tep_href_link('beanstreamgateway.php', '', 'SSL', false);
      //      echo "SUCCESS:".$successpage."<BR>";
	  
      $process_button_string =tep_draw_hidden_field('RequestType', "BACKEND") . 
	               tep_draw_hidden_field('merchant_id', MODULE_PAYMENT_BEANSTREAM_CDN_LOGIN) .
tep_draw_hidden_field('trnOrderNumber', $order->order_id) .
tep_draw_hidden_field('trnType', "P") .
tep_draw_hidden_field('errorPage', $domain . "/catalog/beanstreamerror.php") . 
tep_draw_hidden_field('approvedPage', $successpage) .
tep_draw_hidden_field('trnCardOwner',$HTTP_POST_VARS['beanstream_cdn_cc_owner']) .
tep_draw_hidden_field('trnCardNumber', $HTTP_POST_VARS['beanstream_cdn_cc_number']) .
tep_draw_hidden_field('trnExpMonth', $this->cc_expiry_month) .
tep_draw_hidden_field('trnExpYear', substr($this->cc_expiry_year, -2)) .
tep_draw_hidden_field('trnCardCvd', $HTTP_POST_VARS['beanstream_cdn_cc_cvd']) .
tep_draw_hidden_field('ordName', $order->customer['firstname'] . ' ' . $order->customer['lastname']) .
tep_draw_hidden_field('ordEmailAddress', $order->customer['email_address']) .
tep_draw_hidden_field('ordPhoneNumber', $order->customer['telephone']) .
tep_draw_hidden_field('ordAddress1', $order->customer['street_address']) .
tep_draw_hidden_field('ordCity', $order->customer['city']);
	
      // beanstream uses state only for canada/us.
      $countryid=null;
      $countryid=$order->customer['country']['id'];
      $state_canus=$this->getStateAbbrev($countryid, $order->customer['state']);
      $state_zone=$order->customer['state'];
      if ($state_canus) {
	    $process_button_string .= tep_draw_hidden_field('ordProvince', $state_canus);
      } else {
	    $process_button_string .= tep_draw_hidden_field('ordProvince', "--");
      }
	  
      $countryabbrev=$order->customer['country']['iso_code_2'];
      $process_button_string .= tep_draw_hidden_field('ordPostalCode', $order->customer['postcode']) . tep_draw_hidden_field('ordCountry', $countryabbrev);
      $process_button_string .= tep_draw_hidden_field('shipName', $order->delivery['firstname'] . ' ' . $order->delivery['lastname']) .tep_draw_hidden_field('shipAddress1', $order->delivery['street_address']) .
								tep_draw_hidden_field('shipCity', $order->delivery['city']) ;
      
      // beanstream uses state only for canada/us.
      $country_delivery_id=null;
      $country_delivery_id=$order->delivery['country']['id'];
      $state_delivery_canus=$this->getStateAbbrev($country_delivery_id, $order->delivery['state']);
      if ($state_delivery_canus) {
	    $process_button_string .= tep_draw_hidden_field('shipProvince', $state_delivery_canus);
      } else {
	    $process_button_string .= tep_draw_hidden_field('shipProvince', "--");
      }
	  
      $country_delivery_abbrev=$order->delivery['country']['iso_code_2'];
      $process_button_string .= tep_draw_hidden_field('shipPostalCode', $order->delivery['postcode']) .
								tep_draw_hidden_field('shipCountry', $country_delivery_abbrev) .
								tep_draw_hidden_field('ordItemPrice', number_format($order->item['subtotal'], 2)) .
								tep_draw_hidden_field('ordShippingPrice', number_format($order->item['shipping_cost'], 2)) .
								tep_draw_hidden_field('ordTax1Price', number_format($order->item['tax'], 2)) .
  							    tep_draw_hidden_field('trnAmount', number_format($order->info['total'], 2)) .
// CUSTOMIZATION: previous line for CDN currency account, next line used for USD currency account
//							tep_draw_hidden_field('trnAmount', number_format($order->info['total'] * $currencies->get_value('CDN') /  $currencies->get_value(DEFAULT_CURRENCY), 2)) .
//							tep_draw_hidden_field('trnCardNumber', $CardNumber) .
//              tep_draw_hidden_field('trnExpMonth', $beanstream_cdn_cc_expires_month) .
//              tep_draw_hidden_field('trnExpYear', $beanstream_cdn_cc_expires_year) .
								tep_draw_hidden_field("ref1", tep_session_name()) .
								tep_draw_hidden_field("ref2", tep_session_id()) .
								tep_draw_hidden_field("ref3", tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', false));
								
      //echo $process_button_string;
	return $process_button_string;
    }


    function before_process() {
      return false;
    }


    function after_process() {
    global $insert_id;
        tep_db_query("insert into " . TABLE_ORDERS_STATUS_HISTORY . " 
            (orders_id, orders_status_id, date_added, customer_notified, comments) values ('" .$insert_id . "', '1', now(), '0', 'payment confirmed')");  
        tep_db_query("update " . TABLE_ORDERS . " set orders_status = 1 where orders_id = ".$insert_id."");      	
    
      return false;
    }


    function get_error() {
      global $HTTP_GET_VARS;

      $error = array('title' => MODULE_PAYMENT_BEANSTREAM_CDN_TEXT_ERROR,
                     'error' => '<br />' . stripslashes(urldecode($HTTP_GET_VARS['error'])));

      return $error;
    }


    function check() {
      if (!isset($this->_check)) {
        $check_query = tep_db_query("select configuration_value from " . TABLE_CONFIGURATION . " where configuration_key = 'MODULE_PAYMENT_BEANSTREAM_CDN_STATUS'");
        $this->_check = tep_db_num_rows($check_query);
      }
      return $this->_check;
    }


    function install() {
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Enable Beanstream Module', 'MODULE_PAYMENT_BEANSTREAM_CDN_STATUS', 'True', 'Do you want to accept Beanstream payments?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Login/Store Number', 'MODULE_PAYMENT_BEANSTREAM_CDN_LOGIN', '99999', 'Login/Store Number used for the Beanstream service', '6', '0', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Transaction Mode', 'MODULE_PAYMENT_BEANSTREAM_CDN_TESTMODE', 'Test', 'Transaction mode used for the Beanstream service', '6', '0', 'tep_cfg_select_option(array(\'Test\', \'Production\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) values ('Merchant Notifications', 'MODULE_PAYMENT_BEANSTREAM_CDN_EMAIL_MERCHANT', 'True', 'Should Beanstream e-mail a receipt to the store owner?', '6', '0', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) values ('Sort order of display.', 'MODULE_PAYMENT_BEANSTREAM_CDN_SORT_ORDER', '0', 'Sort order of display. Lowest is displayed first.', '6', '0', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, use_function, set_function, date_added) values ('Payment Zone', 'MODULE_PAYMENT_BEANSTREAM_CDN_ZONE', '0', 'If a zone is selected, only enable this payment method for that zone.', '6', '2', 'tep_get_zone_class_title', 'tep_cfg_pull_down_zone_classes(', now())");
      tep_db_query("insert into " . TABLE_CONFIGURATION . " (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, use_function, date_added) values ('Set Order Status', 'MODULE_PAYMENT_BEANSTREAM_CDN_ORDER_STATUS_ID', '0', 'Set the status of orders made with this payment module to this value', '6', '0', 'tep_cfg_pull_down_order_statuses(', 'tep_get_order_status_name', now())");
    }

    function remove() {
      tep_db_query("delete from " . TABLE_CONFIGURATION . " where configuration_key in ('" . implode("', '", $this->keys()) . "')");
    }

    function keys() {
      return array('MODULE_PAYMENT_BEANSTREAM_CDN_STATUS', 'MODULE_PAYMENT_BEANSTREAM_CDN_LOGIN', 'MODULE_PAYMENT_BEANSTREAM_CDN_TESTMODE', 'MODULE_PAYMENT_BEANSTREAM_CDN_EMAIL_MERCHANT', 'MODULE_PAYMENT_BEANSTREAM_CDN_ZONE', 'MODULE_PAYMENT_BEANSTREAM_CDN_ORDER_STATUS_ID', 'MODULE_PAYMENT_BEANSTREAM_CDN_SORT_ORDER');
    }
	
    /**
     * return the state abbreviation if Canada or US, else '--'.
     */
    function getStateAbbrev($countryid, $statename) {
      $state_canus='--';
      //      echo "statename is $statename";
      if ($countryid == 38 || $countryid == 223) {
	    $sql="select zone_code from " . TABLE_ZONES . " where zone_name = '".tep_db_input($statename). "' and zone_country_id=". $countryid;
	 	//	echo $sql;
		$states_resultset = tep_db_query($sql);
		$allstates = tep_db_fetch_array($states_resultset);
		if ($allstates) {
	  	  $state_canus = $allstates['zone_code'];
		}
      }
      return $state_canus;
    }
	
  }
?>

bean_webobject.php

<?php
/*
  Beanstream server to server web object bean_webobject.php version 0.1
  Contributing Authors:
  Bill Ng     ([email protected]) ---- v0.1   
  version 0.1 Copyright (C)2004 www.Beanstream.com
  Mike Auser  (mauser@[member=MicroSolution].sk.ca) - v0.3.4
  This program is free software; you can redistribute it and/or modify it under the terms
  of the GNU General Public License as published by the Free Software Foundation.
  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU General Public License for more details.
  File resides in: catalog/
*/

ini_set('include_path', "");

require('includes/configure.php');
require(DIR_WS_INCLUDES . 'filenames.php');
require(DIR_WS_INCLUDES . 'application_top.php');

$osCsid = tep_session_id();

// Initialize curl
$ch = curl_init();
// Ignore SSL Verification
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// Get curl to POST
curl_setopt( $ch, CURLOPT_POST, 1 );
// Instruct curl to suppress the output from Beanstream, and to directly
// return the transfer instead. (Output will be stored in $txResult.)
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
// This is the location of the Beanstream payment gateway
curl_setopt( $ch, CURLOPT_URL, "https://www.beanstream.com/scripts/process_transaction.asp" );

reset($HTTP_POST_VARS);
while (list($key, $val) = each($HTTP_POST_VARS)){
	if ($key == "osCsid")
		$osCsession = $val;
	elseif ($key == "code")
		$payment_error = $val;
	else
		$tolString .= "$key=$val&" ;
}

reset($HTTP_GET_VARS);
while (list($key, $val) = each($HTTP_GET_VARS)){
	if ($key == "osCsid")
		$osCsession = $val;
	elseif ($key == "code")
		$payment_error = $val;
	else
		$tolString .= "$key=$val&" ;
}
 
// These are the transaction parameters that we will POST
curl_setopt( $ch, CURLOPT_POSTFIELDS, $tolString);
// Now POST the transaction. $txResult will contain Beanstream's response
$txResult = curl_exec( $ch );

//changed split() to explode() PHP5.3 Nov 2012 - Needs verification
foreach (explode("&", $txResult) as $value) {
	$aryElement = explode("=", $value);
	eval('$aryResult["' . $aryElement[0] . '"] = "' . $aryElement[1] . '";');
}

if ($aryResult['trnApproved'] == '1') {
//echo $http_string . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/" . "checkout_process.php?osCsid=" . $osCsession;
	header("location:" . tep_href_link(FILENAME_CHECKOUT_PROCESS, '', 'SSL', true) . "?osCsid=" . $osCsid); 
} else {
//echo "<p>" . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true) . "?osCsid=" . $osCsession . "&payment_error=$payment_error&error=" . $aryResult['messageText'] . "</p>";
	header("location:" . tep_href_link(FILENAME_CHECKOUT_PAYMENT, '', 'SSL', true) . "?osCsid=" . $osCsid . "&error_message=" . $aryResult['messageText']);
//	header("location:" . $http_string . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . "/" . "checkout_payment.php?osCsid=" . $osCsession . "&payment_error=beanstream&error=" . $aryResult['messageText']); 
}
curl_close( $ch );

?>
 
Link to comment
Share on other sites

  • 4 weeks later...

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...