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>";
Solved! Go to Solution.
03-01-2013 06:34 AM
Finally working. After 51 posts and 12 days. Thanks again to RaynorC1emen7 and especially John Conde for this tutorial and code. https://github.com/stymiee/Authorize.Net-XML I had modified this line and had left off USE_DEVELOPMENT_SERVER and then I got the error that the account was in test mode. So atleast it is connecting and creating a profile. Now I will work on other parts such as transactions and integrating to my cart.
$xml = new AuthnetXML(AUTHNET_LOGIN, AUTHNET_TRANSKEY,AuthnetXML::USE_DEVELOPMENT_SERVER);
03-12-2013 05:19 AM
This is what I have now. I can't find how to convert the posted values. I get error : "Authorize.net malformed"
<?php
require ('/lib/shared/AuthorizeNetRequest.php');
require ('/lib/shared/AuthorizeNetTypes.php');
require ('/lib/shared/AuthorizeNetXMLResponse.php');
require ('/lib/shared/AuthorizeNetResponse.php');
require ('/lib/AuthorizeNetAIM.php');
require ('/lib/AuthorizeNetCIM.php');
require_once("/XML/util.php");
require_once("/XML/vars.php");
//require ('AuthorizeNetCIM.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";
$amount = $Order->Cart->Totals->total;
// Shipping
//$Order->Customer->firstname;
//$$Order->Customer->lastname;
//$Order->Shipping->address;
//$Order->Shipping->city;
//$Order->Shipping->state;
//$Order->Shipping->postcode;
//Order->Shipping->country;
// Transaction
//$Order->Cart->Totals->shipping;
//$Order->Cart->Totals->tax;
}
/**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 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
// Create Auth & Capture Transaction
$request = new AuthorizeNetCIM;
$customerProfileId = "1274411484";
$customerPaymentProfileId = "1171444901";
$customerShippingAddressId = "1144804938";
$transaction = new AuthorizeNetTransaction;
$transaction->amount = $amount;
$transaction->customerProfileId = $customerProfileId;
$transaction->customerPaymentProfileId = $paymentProfileId;
$transaction->customerShippingAddressId = $customerAddressId;
$lineItem = new AuthorizeNetLineItem;
$lineItem->itemId = "4";
$lineItem->name = "Cookies";
$lineItem->description = "Chocolate Chip";
$lineItem->quantity = "4";
$lineItem->unitPrice = "1.00";
$lineItem->taxable = "true";
$transaction->lineItems[] = $lineItem;
$transaction->lineItems[] = $lineItem2;
$response = $request->createCustomerProfileTransaction("AuthCapture", $transaction);
$transactionResponse = $response->getTransactionResponse();
$transactionId = $transactionResponse->transaction_id;
?>
03-01-2013 09:05 AM - edited 03-01-2013 09:05 AM
Is this correct? I figured since the customer id exists in the online CIM I could declare it. Pull the customer Profile ID from that.
$request = new AuthorizeNetCIM;
$customerId = "12346";
$response = $request->getCustomerProfileIds();
$transaction = new AuthorizeNetTransaction;
$transaction->customerProfileId = $customerProfileId;
$transaction->customerPaymentProfileId = $paymentProfileId;
$transaction->customerShippingAddressId = $customerAddressId;
$transaction->amount = $amount;
$lineItem = new AuthorizeNetLineItem;
$lineItem->itemId = "4";
$lineItem->name = "Cookies";
$lineItem->description = "Chocolate Chip";
$lineItem->quantity = "4";
$lineItem->unitPrice = "1.00";
$lineItem->taxable = "true";
$transaction->lineItems[] = $lineItem;
$response = $request->createCustomerProfileTransaction("AuthCapture", $transaction);
$transactionResponse = $response->getTransactionResponse();
$transactionId = $transactionResponse->transaction_id;
03-01-2013 01:49 PM
I keep getting I the error : "Authorize.net malformed" I turned on my errors in php.ini to see if I could get more details. Please help.
03-04-2013 06:57 AM
The XML is malformed. echo out the xml and see if it match what is in the documentation.
03-04-2013 07:05 AM
I'm not sure how to echo what the XML is.
03-04-2013 07:52 AM
I tried <?php echo ($status_response->xml); ?> but didn't work.
03-04-2013 08:09 AM
I realized I was trying to send form data to a customer profile that already existed. So I attempted to create a new profile and transaction. This is what I have now and still not working.
<?php
require ('/lib/shared/AuthorizeNetRequest.php');
require ('/lib/shared/AuthorizeNetTypes.php');
require ('/lib/shared/AuthorizeNetXMLResponse.php');
require ('/lib/shared/AuthorizeNetResponse.php');
require ('/lib/AuthorizeNetAIM.php');
require ('/lib/AuthorizeNetCIM.php');
include_once ("XML/util.php");
include_once ("XML/vars.php");
//require ('AuthorizeNetCIM.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";
//$amount = $Order->Cart->Totals->total;
$amount = $Mycart->Order->Cart->Totals->total;
// 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($_);
// Create Auth & Capture Transaction
$request = new AuthorizeNetCIM;
$customerProfile = new AuthorizeNetCustomer;
$customerProfile->description = "Description of customer here";
$customerProfile->merchantCustomerId = 987;
$customerProfile->email = $Mycart->Order->Customer->email;
//create and add payment profiles and addresses
// Add payment profile.
$paymentProfile = new AuthorizeNetPaymentProfile;
$paymentProfile->customerType = "individual";
$paymentProfile->payment->creditCard->cardNumber = $Mycart->Order->Billing->card;
$paymentProfile->payment->creditCard->expirationDate = date("my",$Mycart->Order->Billing->cardexpires);
$customerProfile->paymentProfiles[] = $paymentProfile;
//Add a Shipping Address
$address = new AuthorizeNetAddress;
$address->firstName = $Mycart->Order->Customer->firstname;
$address->lastName = $Mycart->Order->Customer->lasttname;
$address->company = "John Doe Company";
$address->address = $Mycart->Order->Shipping->address;
$address->city = $Mycart->Order->Shipping->city;
$address->state = $Mycart->Order->Shipping->state;
$address->zip = $Mycart->Order->Shipping->postcode;
$address->country = $Mycart->Order->Shipping->country;
$address->phoneNumber = $Mycart->Order->Customer->phone;
$address->faxNumber = "";
$response = $request->createCustomerShippingAddress($customerProfileId, $address);
$customerAddressId = $response->getCustomerAddressId();
//create the transaction
$transaction = new AuthorizeNetTransaction;
$transaction->customerProfileId = $customerProfileId;
$transaction->customerPaymentProfileId = $paymentProfileId;
$transaction->customerShippingAddressId = $customerAddressId;
$transaction->amount = $amount;
$lineItem = new AuthorizeNetLineItem;
$transaction->lineItems[] = $lineItem;
$response = $request->createCustomerProfileTransaction("AuthCapture", $transaction);
$transactionResponse = $response->getTransactionResponse();
$transactionId = $transactionResponse->transaction_id;
}
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
?>
03-04-2013 11:41 AM
I was getting an error that "Your ID or login" is not valid or expired.
I changed the URL to https://test.authorize.net/gateway/transact.dll
Now the cart completed the transaction and I get a transaction ID but when I log into Customer Information Manager I don't see any transactions.
03-04-2013 01:52 PM
CIM XML use
test
https://apitest.authorize.net/xml/v1/request.api
production
https://test.authorize.net/xml/v1/request.api
03-04-2013 02:09 PM - edited 03-04-2013 02:10 PM