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