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
Changed it to this and its not processing put not getting errors.
require_once 'XML/util.php'; require_once 'XML/vars.php'; require_once 'anet_php_sdk/AuthorizeNet.php'; $METHOD_TO_USE = "CIM";
03-07-2013 12:41 PM
I tried to simplify the transaction just to get it to connect to Authorize.net. THisis what I have now. I put the XML code in a function by itself. Getting Raw request: <?xml version="1.0" encoding="utf-8"?><createCustomerProfileRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"><merchantAuthentication><name>xxxx</name><transactionKey>xxxxx</transactionKey></merchantAuthentication><profile><merchantCustomerId>9999</merchantCustomerId><description>none</description><email>some@somedomain.com</email></profile></createCustomerProfileRequest>
Raw response: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML><HEAD><TITLE>Bad Request</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD> <BODY><h2>Bad Request - Invalid URL</h2> <hr><p>HTTP Error 400. The request URL is invalid.</p> </BODY></HTML>
require_once 'XML/util.php';
require_once 'XML/vars.php';
require_once 'anet_php_sdk/AuthorizeNet.php';
$METHOD_TO_USE = "CIM";
class AuthorizeNet extends GatewayFramework implements GatewayModule {
var $cards = array("visa", "mc", "amex", "disc", "jcb", "dc");
var $liveurl = 'https://test.authorize.net/xml/v1/request.api';
var $testurl = 'https://apitest.authorize.net/xml/v1/request.api';
function AuthorizeNet () {
parent::__construct();
$this->setup('login','password','testmode');
}
function actions () {
add_action('mycart_process_order',array(&$this,'process'));
//add_action('mycart_process_order','process');
add_action('mycart_process_order','build');
}
function process () {
$transaction = $this->build();
}
function build () {
$this->sendxml();
}//end build
function sendxml () {
//build xml to post
$content =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>" .
"<createCustomerProfileRequest xmlns=\"AnetApi/xml/v1/schema/AnetApiSchema.xsd\">" .
"<merchantAuthentication>" .
"<name>xxxx</name>".
"<transactionKey>xxxx</transactionKey>" .
"</merchantAuthentication>" .
"<profile>".
"<merchantCustomerId>9999</merchantCustomerId>". // Your own identifier for the customer.
"<description>none</description>".
"<email>email@somedomain.com</email>".
"</profile>".
"</createCustomerProfileRequest>";
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>";
}
}
}//end send xml
function send ($data) {
// if ($this->settings['testmode'] == "on") $url = $this->testurl;
//else $url = $this->liveurl;
$url = 'https://test.authorize.net/xml/v1/request.api'; //added
$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-08-2013 05:51 AM
Look like you are sending the request to a bad URL. Try changing the bad URL one at a time.
03-08-2013 07:04 AM
Good morning Raynor. I tried both URLs with same result in the send() function near the bottom.
https://apitest.authorize.net/xml/v1/request.api
https://test.authorize.net/xml/v1/request.api
03-08-2013 07:13 AM
so it might be using the other method?
03-08-2013 07:18 AM
Not sure what you are referring to. Can you explain? Thanks.
03-08-2013 07:35 AM
maybe is is not using the send()?
03-08-2013 08:56 AM
Yes I think you are right. Just trying to figure how to get it to send.
03-08-2013 08:58 AM
I see the function in vars.php but need to find a way to get my content to that function.
function send_xml_request($content)
{
global $g_apihost, $g_apipath;
return send_request_via_fsockopen($g_apihost,$g_apipath,$content);
}
03-08-2013 11:06 AM
I found this approach and think its what I need. https://github.com/stymiee/Authorize.Net-XML/blob/master/examples/cim/createCustomerProfileRequest.p...
Here is what I have now and the error is below this code.
<?php
require('config.inc.php');
require('AuthnetXML.class.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();
}
function build () {
$Order = $this->Order;
$xml = new AuthnetXML(AUTHNET_LOGIN, AUTHNET_TRANSKEY);
$xml->createCustomerPaymentProfileRequest(array(
'customerProfileId' => '12345',
'paymentProfile' => array(
'billTo' => array(
'firstName' => $Order->Customer->firstname,
'lastName' => $Order->Customer->lastname,
'company' => '',
'address' => $Order->Billing->address,
'city' => $Order->Billing->city,
'state' => $Order->Billing->state,
'zip' => $Order->Billing->postcode,
'country' => 'USA',
'phoneNumber' => $Order->Customer->phone,
'faxNumber' => ''
),
'payment' => array(
'creditCard' => array(
'cardNumber' => $Order->Billing->card,
'expirationDate' => date("my",$Order->Billing->cardexpires)
)
)
),
'validationMode' => 'liveMode'
));
}
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
?>Fatal error: Uncaught exception 'AuthnetXMLException' with message 'Connection error: error setting certificate verify locations: CAfile: C:\inetpub\wwwroot\......gateways\AuthorizeNet/ssl/cert.pem CApath: none (77)' in C:\inetpub\wwwroot....\AuthorizeNet\AuthnetXML.class.php:211
Stack trace: #0 C:\inetpub\wwwroot.......\AuthorizeNet\AuthnetXML.class.php(150):
AuthnetXML->process() #1 C:\inetpub\wwwroot........\gateways\AuthorizeNet\Authorize.net.php(81):
AuthnetXML->__call('createCustomerP...', Array) #2 C:\inetpub\wwwroot.....\gateways\AuthorizeNet\Authorize.net.php(81): AuthnetXML->createCustomerPaymentPr in C:\inetpub\wwwroot......\gateways\AuthorizeNet\AuthnetXML.class.php on line 211
03-11-2013 06:47 AM