cancel
Showing results forย 
Search instead forย 
Did you mean:ย 

Convert from AIM to CIM

I have this cart and it uses the AIM method. I need to use the CIM.  Searching through allthe files there is only one file called Authorize.net.php  Below is the code on this page.

 

<?php

class AuthorizeNet extends GatewayFramework implements GatewayModule {

	var $cards = array("visa", "mc", "amex", "disc", "jcb", "dc");

	var $liveurl = 'https://secure.authorize.net/gateway/transact.dll';
	var $testurl = 'https://secure.authorize.net/gateway/transact.dll';

	function AuthorizeNet () {
		parent::__construct();
		$this->setup('login','password','testmode');
	}

	function actions () {
		add_action('mycart_process_order',array(&$this,'process'));
	}

	function process () {
		$transaction = $this->build();
		$Response = $this->send($transaction);
		if ($Response->code == '1') { // success
			$this->Order->transaction($this->txnid($Response),'CHARGED');
			return;
		} elseif ($Response->code == '4') { // flagged for merchant review or risk management
			$this->Order->transaction($this->txnid($Response),'PENDING');
			return;
		} else $this->error($Response);
	}

	function txnid ($Response) {
		if (empty($Response->transactionid)) return parent::txnid();
		return $Response->transactionid;
	}

	function error ($Response) {
		return new MycartError($Response->reason,'authorize_net_error',MYCART_TRXN_ERR,
			array('code'=>$Response->reasoncode));
	}

	function build () {
		$Order = $this->Order;
		$_ = array();

		// Options
		$_['x_test_request']		= ($this->settings['testmode'] == "on")?"TRUE":"FALSE"; // Set "TRUE" while testing
		$_['x_login'] 				= $this->settings['login'];
		$_['x_password'] 			= $this->settings['password'];
		$_['x_Delim_Data'] 			= "TRUE";
		$_['x_Delim_Char'] 			= ",";
		$_['x_Encap_Char'] 			= "";
		$_['x_version'] 			= "3.1";
		$_['x_relay_response']		= "FALSE";
		$_['x_type'] 				= "AUTH_ONLY";
		//= "AUTH_CAPTURE";
		$_['x_method']				= "CC";
		$_['x_email_customer']		= "FALSE";
		$_['x_merchant_email']		= $this->settings['merchant_email'];

		// Required Fields
		$_['x_amount']				= $Order->Cart->Totals->total;
		$_['x_customer_ip']			= $_SERVER["REMOTE_ADDR"];
		$_['x_fp_sequence']			= mktime();
		$_['x_fp_timestamp']		= time();
		// $_['x_fp_hash']				= hash_hmac("md5","{$_['x_login']}^{$_['x_fp_sequence']}^{$_['x_fp_timestamp']}^{$_['x_amount']}",$_['x_password']);

		// Customer Contact
		$_['x_first_name']			= $Order->Customer->firstname;
		$_['x_last_name']			= $Order->Customer->lastname;
		$_['x_email']				= $Order->Customer->email;
		$_['x_phone']				= $Order->Customer->phone;

		// Billing
		$_['x_card_num']			= $Order->Billing->card;
		$_['x_exp_date']			= date("my",$Order->Billing->cardexpires);
		$_['x_card_code']			= $Order->Billing->cvv;
		$_['x_address']				= $Order->Billing->address;
		$_['x_city']				= $Order->Billing->city;
		$_['x_state']				= $Order->Billing->state;
		$_['x_zip']					= $Order->Billing->postcode;
		$_['x_country']				= $Order->Billing->country;

		// Shipping
		$_['x_ship_to_first_name']  = $Order->Customer->firstname;
		$_['x_ship_to_last_name']	= $Order->Customer->lastname;
		$_['x_ship_to_address']		= $Order->Shipping->address;
		$_['x_ship_to_city']		= $Order->Shipping->city;
		$_['x_ship_to_state']		= $Order->Shipping->state;
		$_['x_ship_to_zip']			= $Order->Shipping->postcode;
		$_['x_ship_to_country']		= $Order->Shipping->country;

		// Transaction
		$_['x_freight']				= $Order->Cart->Totals->shipping;
		$_['x_tax']					= $Order->Cart->Totals->tax;

		// Line Items
		$i = 1;
		foreach($Order->Cart->contents as $Item) {
			$_['x_line_item'][] = ($i++)."<|>".substr($Item->name,0,31)."<|>".((sizeof($Item->options) > 1)?" (".substr($Item->option->label,0,253).")":"")."<|>".(int)$Item->quantity."<|>".number_format($Item->unitprice,$this->precision,'.','')."<|>".(($Item->tax)?"Y":"N");
		}

		return $this->encode($_);
	}

	function send ($data) {
		if ($this->settings['testmode'] == "on") $url = $this->testurl;
		else $url = $this->liveurl;
		$url = apply_filters('mycart_authorize_net_url',$url);
		return $this->response(parent::send($data,$url));
	}

	function response ($buffer) {
		$_ = new stdClass();

		list($_->code,
			 $_->subcode,
			 $_->reasoncode,
			 $_->reason,
			 $_->authcode,
			 $_->avs,
			 $_->transactionid,
			 $_->invoicenum,
			 $_->description,
			 $_->amount,
			 $_->method,
			 $_->type,
			 $_->customerid,
			 $_->firstname,
			 $_->lastname,
			 $_->company,
			 $_->address,
			 $_->city,
			 $_->state,
			 $_->zip,
			 $_->country,
			 $_->phone,
			 $_->fax,
			 $_->email,
			 $_->ship_to_first_name,
			 $_->ship_to_last_name,
			 $_->ship_to_company,
			 $_->ship_to_address,
			 $_->ship_to_city,
			 $_->ship_to_state,
			 $_->ship_to_zip,
			 $_->ship_to_country,
			 $_->tax,
			 $_->duty,
			 $_->freight,
			 $_->taxexempt,
			 $_->ponum,
			 $_->md5hash,
			 $_->cvv2code,
			 $_->cvv2response) = explode(",",$buffer);
		return $_;
	}

	function settings () {
		$this->ui->cardmenu(0,array(
			'name' => 'cards',
			'selected' => $this->settings['cards']
		),$this->cards);

		$this->ui->text(1,array(
			'name' => 'login',
			'value' => $this->settings['login'],
			'size' => '16',
			'label' => __('Enter your AuthorizeNet Login ID.','Mycart')
		));

		$this->ui->password(1,array(
			'name' => 'password',
			'value' => $this->settings['password'],
			'size' => '24',
			'label' => __('Enter your AuthorizeNet Password or Transaction Key.','Mycart')
		));

		$this->ui->checkbox(1,array(
			'name' => 'testmode',
			'checked' => $this->settings['testmode'],
			'label' => __('Enable test mode','Mycart')
		));

	}

} // END class AuthorizeNet

?>


 I was thinking I need to add the XML part to this page. Somehow to have it parse the XML.


//build xml to post
$content =
	"<?xml version=\"1.0\" encoding=\"utf-8\"?>" .
	"<createCustomerProfileTransactionRequest xmlns=\"AnetApi/xml/v1/schema/AnetApiSchema.xsd\">" .
	//MerchantAuthenticationBlock().
	"<transaction>".
	"<profileTransAuthOnly>".
	"<amount>" . $_['x_amount'] . "</amount>". // should include tax, shipping, and everything.
	"<shipping>".
	"<amount></amount>".
	"<name>Free Shipping</name>".
	"<description>Free UPS Ground shipping. Ships in 5-10 days.</description>".
	"</shipping>".
	"<lineItems>". $_['x_amount'] ."</lineItems>".
	//"<unitPrice>" . ($_POST["amount"] - 1.00) . "</unitPrice>".
	"<customerProfileId>12711484</customerProfileId>".
	"<customerPaymentProfileId>11714901</customerPaymentProfileId>".
	"<customerShippingAddressId>11804938</customerShippingAddressId>".
	"<order>".
	"<invoiceNumber>INV12345</invoiceNumber>".
	"</order>".
	"</profileTransAuthOnly>".
	"</transaction>".
	"</createCustomerProfileTransactionRequest>";

echo "Raw request: " . htmlspecialchars($content) . "<br><br>";
$response = send_xml_request($content);
echo "Raw response: " . htmlspecialchars($response) . "<br><br>";
$parsedresponse = parse_api_response($response);
if ("Ok" == $parsedresponse->messages->resultCode) {
	echo "A transaction was successfully created for customerProfileId <b>"
		. htmlspecialchars($_POST["customerProfileId"])
		. "</b>.<br><br>";
}
if (isset($parsedresponse->directResponse)) {
	echo "direct response: <br>"
		. htmlspecialchars($parsedresponse->directResponse)
		. "<br><br>";
		
	$directResponseFields = explode(",", $parsedresponse->directResponse);
	$responseCode = $directResponseFields[0]; // 1 = Approved 2 = Declined 3 = Error
	$responseReasonCode = $directResponseFields[2]; // See http://www.authorize.net/support/AIM_guide.pdf
	$responseReasonText = $directResponseFields[3];
	$approvalCode = $directResponseFields[4]; // Authorization code
	$transId = $directResponseFields[6];
	
	if ("1" == $responseCode) echo "The transaction was successful.<br>";
	else if ("2" == $responseCode) echo "The transaction was declined.<br>";
	else echo "The transaction resulted in an error.<br>";
	
	echo "responseReasonCode = " . htmlspecialchars($responseReasonCode) . "<br>";
	echo "responseReasonText = " . htmlspecialchars($responseReasonText) . "<br>";
	echo "approvalCode = " . htmlspecialchars($approvalCode) . "<br>";
	echo "transId = " . htmlspecialchars($transId) . "<br>";
}

echo "<br><a href=index.php?customerProfileId=" 
	. urlencode($_POST["customerProfileId"])
	. "&customerPaymentProfileId="
	. urlencode($_POST["customerPaymentProfileId"])
	. "&customerShippingAddressId="
	. urlencode($_POST["customerShippingAddressId"])
	. ">Continue</a><br>";

 

mallen
Regular Contributor
58 REPLIES 58

Look like the code have echo the raw xml request. It the data there? Is the url on the vars.php correct?

Not sure what you are asking about the echo. I didn't change the URL.

$g_loginname = "xxxxx"; // Keep this secure.
$g_transactionkey = "xxxxx"; // Keep this secure.
$g_apihost = "apitest.authorize.net";
$g_apipath = "/xml/v1/request.api";

 

mallen
Regular Contributor

And you are using a test account not your production/live account?

Yes I am using the account they gave me when I signed up with https://test.authorize.net/
Maybe the logic is not correct in the code that checks if its in test mode or not. The old setting inthe build() function had this.

//$_['x_test_request'] = ($this->settings['testmode'] == "on")?"TRUE":"FALSE"; // Set "TRUE" while testing
		//$_['x_login'] 				= $this->settings['login'];
		//$_['x_password'] 			= $this->settings['password'];

 

mallen
Regular Contributor

I made a change to this function to try to see if  this might work.


From this....
function send ($data) { if ($this->settings['testmode'] == "off") $url = $this->testurl; else $url = $this->liveurl; $url = apply_filters('mycart_authorize_net_url',$url); return $this->response(parent::send($data,$url)); }
to this... function send ($data) { $url = 'https://apitest.authorize.net/xml/v1/request.api'; $url = apply_filters('mycart_authorize_net_url',$url); return $this->response(parent::send($data,$url)); }

 

 

mallen
Regular Contributor

Isn't send() is only use for AIM?

I'm not sure but I commented out the send () function to see if that would effect it. But it didn't. Seems the build() function not triggering. It might not get any response from the function error($Response)

mallen
Regular Contributor

Look to me you are using the SDKs CIM method and adding the sample code CIM. And it only using the SDKs CIM code.

Did you set

define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN");
define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY");
define("AUTHORIZENET_SANDBOX", true);

Just realized it was trying to read another copy of the file Ihave inthe same folder. So. Now getting Fatal error: Class 'AuthorizeNetCustomer' not found.

 

Where should I put
define("AUTHORIZENET_API_LOGIN_ID", "YOURLOGIN");
define("AUTHORIZENET_TRANSACTION_KEY", "YOURKEY");
define("AUTHORIZENET_SANDBOX", true);

mallen
Regular Contributor

I got this

Fatal error: Class 'AuthorizeNetRequest' not found in C:\inetpub\wwwroot\.....\AuthorizeNet\lib\AuthorizeNetCIM.php on line 19.. I have this at the top of the page.

 

include_once ('XML/util.php'); 
include_once ('XML/vars.php'); 
include_once ('lib/AuthorizeNetCIM.php');
include_once ('lib/shared/AuthorizeNetRequest.php');
include_once ('lib/shared/AuthorizeNetResponse.php');
include_once ('lib/shared/AuthorizeNetTypes.php');
include_once ('lib/shared/AuthorizeNetXMLResponse.php');

$METHOD_TO_USE = "CIM";

class AuthorizeNet extends GatewayFramework implements GatewayModule {

 

mallen
Regular Contributor