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