Reply
Member
Posts: 1
Registered: ‎12-02-2014

CIM Live getting E00027 here is one or more missing or invalid required fields

When I try and create a new CIM using the test credit card number on a live account, I expect to get an invalid credit number response.  Instead, I am getting E00027There is one or more missing or invalid required fields.

 

I think somehow I am submitting as TEST instead of LIVE. 

 

AuthorizeNetCIM_Response Object ( [xml] => SimpleXMLElement Object ( [messages] => SimpleXMLElement Object ( [resultCode] => Error [message] => SimpleXMLElement Object ( [code] => E00027 [text] => There is one or more missing or invalid required fields. ) ) [customerPaymentProfileIdList] => SimpleXMLElement Object ( ) [customerShippingAddressIdList] => SimpleXMLElement Object ( ) [validationDirectResponseList] => SimpleXMLElement Object ( [string] => 3,1,290,There is one or more missing or invalid required fields.,,P,0,none,Test transaction for ValidateCustomerPaymentProfile.,0.00,CC,auth_only,51797,,,,,,,,,,,me@mydomain,,,,,,,,,0.00,0.00,0.00,FALSE,none,F68A9C87C1E1472521704EF38C21F647,,,,,,,,,,,,,XXXX1111,Visa,,,,,,,,,,,,,,,, ) ) [response] => ?ErrorE00027There is one or more missing or invalid required fields.3,1,290,There is one or more missing or invalid required fields.,,P,0,none,Test transaction for ValidateCustomerPaymentProfile.,0.00,CC,auth_only,51797,,,,,,,,,,,me@mydomain,,,,,,,,,0.00,0.00,0.00,FALSE,none,F68A9C87C1E1472521704EF38C21F647,,,,,,,,,,,,,XXXX1111,Visa,,,,,,,,,,,,,,,, [xpath_xml] => SimpleXMLElement Object ( [messages] => SimpleXMLElement Object ( [resultCode] => Error [message] => SimpleXMLElement Object ( [code] => E00027 [text] => There is one or more missing or invalid required fields. ) ) [customerPaymentProfileIdList] => SimpleXMLElement Object ( ) [customerShippingAddressIdList] => SimpleXMLElement Object ( ) [validationDirectResponseList] => SimpleXMLElement Object ( [string] => 3,1,290,There is one or more missing or invalid required fields.,,P,0,none,Test transaction for ValidateCustomerPaymentProfile.,0.00,CC,auth_only,51797,,,,,,,,,,,me@mydomain,,,,,,,,,0.00,0.00,0.00,FALSE,none,F68A9C87C1E1472521704EF38C21F647,,,,,,,,,,,,,XXXX1111,Visa,,,,,,,,,,,,,,,, ) ) ) 1

 

Using the SDK, I updated the class to see what happens when I make Sandbox URL the live url as I was getting an error.  I also updated the class to make sure it defaults to live mode.

 

<?php
/**
 * Easily interact with the Authorize.Net CIM XML API.
 *
 * @package    AuthorizeNet
 * @subpackage AuthorizeNetCIM
 * @link       http://www.authorize.net/support/CIM_XML_guide.pdf CIM XML Guide
 */



/**
 * A class to send a request to the CIM XML API.
 *
 * @package    AuthorizeNet
 * @subpackage AuthorizeNetCIM
 */ 
class AuthorizeNetCIM extends AuthorizeNetRequest
{

    const LIVE_URL = "https://api.authorize.net/xml/v1/request.api";
   // const SANDBOX_URL = "https://apitest.authorize.net/xml/v1/request.api";
   const SANDBOX_URL = "https://api.authorize.net/xml/v1/request.api";
    
    private $_xml;
    private $_refId = false;
    private $_validationMode = "liveMode"; // "none","testMode","liveMode"
    private $_extraOptions;
    private $_transactionTypes = array(
        'AuthOnly',
        'AuthCapture',
        'CaptureOnly',
        'PriorAuthCapture',
        'Refund',
        'Void',
    );
    
    /**
     * Optional. Used if the merchant wants to set a reference ID.
     *
     * @param string $refId
     */
    public function setRefId($refId)
    {
        $this->_refId = $refId;
    }
    
    /**
     * Create a customer profile.
     *
     * @param AuthorizeNetCustomer $customerProfile
     * @param string               $validationMode
     *
     * @return AuthorizeNetCIM_Response
     */
    public function createCustomerProfile($customerProfile, $validationMode = "liveMode")
    {
        $this->_validationMode = $validationMode;
        $this->_constructXml("createCustomerProfileRequest");
        $profile = $this->_xml->addChild("profile");
        $this->_addObject($profile, $customerProfile);
        return $this->_sendRequest();
    }
    
    /**
     * Create a customer payment profile.
     *
     * @param int                        $customerProfileId
     * @param AuthorizeNetPaymentProfile $paymentProfile
     * @param string                     $validationMode
     *
     * @return AuthorizeNetCIM_Response
     */
    public function createCustomerPaymentProfile($customerProfileId, $paymentProfile, $validationMode = "liveMode")
    {
        $this->_validationMode = $validationMode;
        $this->_constructXml("createCustomerPaymentProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $profile = $this->_xml->addChild("paymentProfile");
        $this->_addObject($profile, $paymentProfile);
        return $this->_sendRequest();
    }
    
    /**
     * Create a shipping address.
     *
     * @param int                        $customerProfileId
     * @param AuthorizeNetAddress        $shippingAddress
     *
     * @return AuthorizeNetCIM_Response
     */
    public function createCustomerShippingAddress($customerProfileId, $shippingAddress)
    {
        $this->_constructXml("createCustomerShippingAddressRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $address = $this->_xml->addChild("address");
        $this->_addObject($address, $shippingAddress);
        return $this->_sendRequest();
    }
    
    /**
     * Create a transaction.
     *
     * @param string                     $transactionType
     * @param AuthorizeNetTransaction    $transaction
     * @param string                     $extraOptionsString
     *
     * @return AuthorizeNetCIM_Response
     */
    public function createCustomerProfileTransaction($transactionType, $transaction, $extraOptionsString = "")
    {
        $this->_constructXml("createCustomerProfileTransactionRequest");
        $transactionParent = $this->_xml->addChild("transaction");
        $transactionChild = $transactionParent->addChild("profileTrans" . $transactionType);
        $this->_addObject($transactionChild, $transaction);
        $this->_extraOptions = $extraOptionsString . "x_encap_char=|";
        return $this->_sendRequest();
    }
    
    /**
     * Delete a customer profile.
     *
     * @param int $customerProfileId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function deleteCustomerProfile($customerProfileId)
    {
        $this->_constructXml("deleteCustomerProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        return $this->_sendRequest();
    }
    
    /**
     * Delete a payment profile.
     *
     * @param int $customerProfileId
     * @param int $customerPaymentProfileId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function deleteCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId)
    {
        $this->_constructXml("deleteCustomerPaymentProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $this->_xml->addChild("customerPaymentProfileId", $customerPaymentProfileId);
        return $this->_sendRequest();
    }
    
    /**
     * Delete a shipping address.
     *
     * @param int $customerProfileId
     * @param int $customerAddressId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function deleteCustomerShippingAddress($customerProfileId, $customerAddressId)
    {
        $this->_constructXml("deleteCustomerShippingAddressRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $this->_xml->addChild("customerAddressId", $customerAddressId);
        return $this->_sendRequest();
    }
    
    /**
     * Get all customer profile ids.
     *
     * @return AuthorizeNetCIM_Response
     */
    public function getCustomerProfileIds()
    {
        $this->_constructXml("getCustomerProfileIdsRequest");
        return $this->_sendRequest();
    }
    
    /**
     * Get a customer profile.
     *
     * @param int $customerProfileId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function getCustomerProfile($customerProfileId)
    {
        $this->_constructXml("getCustomerProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        return $this->_sendRequest();
    }
    
    /**
     * Get a payment profile.
     *
     * @param int $customerProfileId
     * @param int $customerPaymentProfileId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function getCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId)
    {
        $this->_constructXml("getCustomerPaymentProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $this->_xml->addChild("customerPaymentProfileId", $customerPaymentProfileId);
        return $this->_sendRequest();
    }
    
    /**
     * Get a shipping address.
     *
     * @param int $customerProfileId
     * @param int $customerAddressId
     *
     * @return AuthorizeNetCIM_Response
     */
    public function getCustomerShippingAddress($customerProfileId, $customerAddressId)
    {
        $this->_constructXml("getCustomerShippingAddressRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $this->_xml->addChild("customerAddressId", $customerAddressId);
        return $this->_sendRequest();
    }
    
    /**
     * Update a profile.
     *
     * @param int                        $customerProfileId
     * @param AuthorizeNetCustomer       $customerProfile
     *
     * @return AuthorizeNetCIM_Response
     */
    public function updateCustomerProfile($customerProfileId, $customerProfile)
    {
        $this->_constructXml("updateCustomerProfileRequest");
        $customerProfile->customerProfileId = $customerProfileId;
        $profile = $this->_xml->addChild("profile");
        $this->_addObject($profile, $customerProfile);
        return $this->_sendRequest();
    }
    
    /**
     * Update a payment profile.
     *
     * @param int                        $customerProfileId
     * @param int                        $customerPaymentProfileId
     * @param AuthorizeNetPaymentProfile $paymentProfile
     * @param string                     $validationMode
     *
     * @return AuthorizeNetCIM_Response
     */
    public function updateCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId, $paymentProfile, $validationMode = "liveMode")
    {
        $this->_validationMode = $validationMode;
        $this->_constructXml("updateCustomerPaymentProfileRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $paymentProfile->customerPaymentProfileId = $customerPaymentProfileId;
        $profile = $this->_xml->addChild("paymentProfile");
        $this->_addObject($profile, $paymentProfile);
        return $this->_sendRequest();
    }
    
    /**
     * Update a shipping address.
     *
     * @param int                        $customerProfileId
     * @param int                        $customerShippingAddressId
     * @param AuthorizeNetAddress        $shippingAddress
     *
     * @return AuthorizeNetCIM_Response
     */
    public function updateCustomerShippingAddress($customerProfileId, $customerShippingAddressId, $shippingAddress)
    {
        
        $this->_constructXml("updateCustomerShippingAddressRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);
        $shippingAddress->customerAddressId = $customerShippingAddressId;
        $sa = $this->_xml->addChild("address");
        $this->_addObject($sa, $shippingAddress);
        return $this->_sendRequest();
    }
    
    /**
     * Update the status of an existing order that contains multiple transactions with the same splitTenderId.
     *
     * @param int                        $splitTenderId
     * @param string                     $splitTenderStatus
     *
     * @return AuthorizeNetCIM_Response
     */
    public function updateSplitTenderGroup($splitTenderId, $splitTenderStatus)
    {
        $this->_constructXml("updateSplitTenderGroupRequest");
        $this->_xml->addChild("splitTenderId", $splitTenderId);
        $this->_xml->addChild("splitTenderStatus", $splitTenderStatus);
        return $this->_sendRequest();
    }
    
    /**
     * Validate a customer payment profile.
     *
     * @param int                        $customerProfileId
     * @param int                        $customerPaymentProfileId
     * @param int                        $customerShippingAddressId
     * @param int                        $cardCode
     * @param string                     $validationMode
     *
     * @return AuthorizeNetCIM_Response
     */
    public function validateCustomerPaymentProfile($customerProfileId, $customerPaymentProfileId, $customerShippingAddressId, $cardCode, $validationMode = "liveMode")
    {
        $this->_validationMode = $validationMode;
        $this->_constructXml("validateCustomerPaymentProfileRequest");
        $this->_xml->addChild("customerProfileId",$customerProfileId);
        $this->_xml->addChild("customerPaymentProfileId",$customerPaymentProfileId);
        $this->_xml->addChild("customerShippingAddressId",$customerShippingAddressId);
        $this->_xml->addChild("cardCode",$cardCode);
        return $this->_sendRequest();
    }
    
    /**
     * Get hosted profile page request token
     *
     * @param string $customerProfileId
     * @param mixed  $settings
     *
     * @return AuthorizeNetCIM_Response
     */
    public function getHostedProfilePageRequest($customerProfileId, $settings=0)
    {
        $this->_constructXml("getHostedProfilePageRequest");
        $this->_xml->addChild("customerProfileId", $customerProfileId);

        if (!empty($settings)) {
            $hostedSettings = $this->_xml->addChild("hostedProfileSettings");
            foreach ($settings as $key => $val) {
                $setting = $hostedSettings->addChild("setting");
                $setting->addChild("settingName", $key);
                $setting->addChild("settingValue", $val);
            }
        }

        return $this->_sendRequest();
    }
    
     /**
     * @return string
     */
    protected function _getPostUrl()
    {
        return ($this->_sandbox ? self::SANDBOX_URL : self::LIVE_URL);
    }
    
    /**
     *
     *
     * @param string $response
     * 
     * @return AuthorizeNetCIM_Response
     */
    protected function _handleResponse($response)
    {
        return new AuthorizeNetCIM_Response($response);
    }
    
    /**
     * Prepare the XML post string.
     */
    protected function _setPostString()
    {
        ($this->_validationMode != "none" ? $this->_xml->addChild('validationMode',$this->_validationMode) : "");
        $this->_post_string = $this->_xml->asXML();
        
        // Add extraOptions CDATA
        if ($this->_extraOptions) {
            $this->_xml->addChild("extraOptions");
            $this->_post_string = str_replace(array("<extraOptions></extraOptions>","<extraOptions/>"),'<extraOptions><![CDATA[' . $this->_extraOptions . ']]></extraOptions>', $this->_xml->asXML());
            $this->_extraOptions = false;
        }
        // Blank out our validation mode, so that we don't include it in calls that
        // don't use it.
        $this->_validationMode = "none";
    }
    
    /**
     * Start the SimpleXMLElement that will be posted.
     *
     * @param string $request_type The action to be performed.
     */
    private function _constructXml($request_type)
    {
        $string = '<?xml version="1.0" encoding="utf-8"?><'.$request_type.' xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd"></'.$request_type.'>';
        $this->_xml = @new SimpleXMLElement($string);
        $merchant = $this->_xml->addChild('merchantAuthentication');
        $merchant->addChild('name',$this->_api_login);
        $merchant->addChild('transactionKey',$this->_transaction_key);
        ($this->_refId ? $this->_xml->addChild('refId',$this->_refId) : "");
    }
    
    /**
     * Add an object to an SimpleXMLElement parent element.
     *
     * @param SimpleXMLElement $destination The parent element.
     * @param Object           $object      An object, array or value.  
     */
    private function _addObject($destination, $object)
    {
        $array = (array)$object;
        foreach ($array as $key => $value) {
            if ($value && !is_object($value)) {
                if (is_array($value) && count($value)) {
                    foreach ($value as $index => $item) {
                        $items = $destination->addChild($key);
                        $this->_addObject($items, $item);
                    }
                } else {
                    $destination->addChild($key,$value);
                }
            } elseif (is_object($value) && self::_notEmpty($value)) {
                $dest = $destination->addChild($key);
                $this->_addObject($dest, $value);
            }
        }
    }
    
    /**
     * Checks whether an array or object contains any values.
     *
     * @param Object $object
     *
     * @return bool
     */
    private static function _notEmpty($object)
    {
        $array = (array)$object;
        foreach ($array as $key => $value) {
            if ($value && !is_object($value)) {
                return true;
            } elseif (is_object($value)) {
                if (self::_notEmpty($value)) {
                    return true;
                }
            }
        }
        return false;
    }
    
}

/**
 * A class to parse a response from the CIM XML API.
 *
 * @package    AuthorizeNet
 * @subpackage AuthorizeNetCIM
 */
class AuthorizeNetCIM_Response extends AuthorizeNetXMLResponse
{
    /**
     * @return AuthorizeNetAIM_Response
     */
    public function getTransactionResponse()
    {
        return new AuthorizeNetAIM_Response($this->_getElementContents("directResponse"), ",", "|", array());
    }
    
    /**
     * @return array Array of AuthorizeNetAIM_Response objects for each payment profile.
     */
    public function getValidationResponses()
    {
        $responses = (array)$this->xml->validationDirectResponseList;
        $return = array();
        foreach ((array)$responses["string"] as $response) {
            $return[] = new AuthorizeNetAIM_Response($response, ",", "", array());
        }
        return $return;
    }
    
    /**
     * @return AuthorizeNetAIM_Response
     */
    public function getValidationResponse()
    {
        return new AuthorizeNetAIM_Response($this->_getElementContents("validationDirectResponse"), ",", "|", array());
    }
    
    /**
     * @return array
     */
    public function getCustomerProfileIds()
    {
        $ids = (array)$this->xml->ids;
        return $ids["numericString"];
    }
    
    /**
     * @return array
     */
    public function getCustomerPaymentProfileIds()
    {
        $ids = (array)$this->xml->customerPaymentProfileIdList;
        return $ids["numericString"];
    }
    
    /**
     * @return array
     */
    public function getCustomerShippingAddressIds()
    {
        $ids = (array)$this->xml->customerShippingAddressIdList;
        return $ids["numericString"];
    }
    
    /**
     * @return string
     */
    public function getCustomerAddressId()
    {
        return $this->_getElementContents("customerAddressId");
    }
    
    /**
     * @return string
     */
    public function getCustomerProfileId()
    {
        return $this->_getElementContents("customerProfileId");
    }
    
    /**
     * @return string
     */
    public function getPaymentProfileId()
    {
        return $this->_getElementContents("customerPaymentProfileId");
    }

}

 This is the code that is creating the CIM profile 

if(isset($_POST)){
	
	if($_POST["sitepass"]=sitepass and $_POST["action"]="newCIM"){
		
		// first check to see if a previous profile exists.  If it does, then delete it and update the database. 
		
			if(isset($_POST["currentCIM"])){
				
				if (strlen($_POST["currentCIM"]) > 5){
				
					$old_CIM = $_POST["currentCIM"];
					$request = new AuthorizeNetCIM;
					$request->deleteCustomerProfile($old_CIM);
					
					UpdateContactCIM( $_POST["contactid"],"0","0","0" ,$db);
				
				}
			}
		
			
			if(isset($_POST["removeProfile"])){
				
				if ($_POST["removeProfile"]="1"){
					$old_CIM = $_POST["currentCIM"];
					$request = new AuthorizeNetCIM;
					$request->deleteCustomerProfile($old_CIM);
					
					UpdateContactCIM( $_POST["contactid"],"0","0","0" ,$db);
					die("1|Profile Removed");
					
					}
				}
			
		
					$contact_id			 	= $_POST["contactid"];
					$contact_first			= $_POST["firstname"];
					$contact_last			= $_POST["lastname"];
					$contact_address	= $_POST["address"];
					$contact_city			= $_POST["city"];
					$contact_st				= $_POST["st"];
					$contact_zip				= $_POST["zip"];
					$contact_email			=	$_POST["email"];
					$contact_phone		=	$_POST["phone"];
					$contact_card			=	$_POST["creditcard"];
					$contact_card_yr		=	$_POST["year"];
					$contact_card_mo	=	$_POST["month"];
					
					$contact_name		= $contact_first." ".$contact_last;
					$exp_date				= $contact_card_yr."-".$contact_card_mo;
			
					$request = new AuthorizeNetCIM;
					// Create new customer profile
					
					$customerProfile                     = new AuthorizeNetCustomer;
					
					$customerProfile->description        			= $contact_name;
					$customerProfile->merchantCustomerId 	= $contact_id;
					$customerProfile->email              			= $contact_email;
					
					// Add payment profile.
					$paymentProfile = new AuthorizeNetPaymentProfile;
					$paymentProfile->customerType = "individual";
					$paymentProfile->payment->creditCard->cardNumber = $contact_card;
					$paymentProfile->payment->creditCard->expirationDate = $exp_date;
					$customerProfile->paymentProfiles[] = $paymentProfile;
					
					$response = $request->createCustomerProfile($customerProfile);
					
					die(print_r($response));
					
					
					$validationResponses = $response->getValidationResponses();
 						 foreach ($validationResponses as $vr) {
    							echo $vr->approved;
							}
					
					
					//profile/paymentProfiles/customerPaymentProfileId
					$arrProfile =  $response->xpath('customerPaymentProfileIdList/numericString');
					if ($arrProfile){
						$paymentProfileId = $arrProfile[0];  // get the payment id
					
					}
					else
					{
						$paymentProfileId = 0;
					}
					
					
					if ($response->isOk()) {
							$customerProfileId = $response->getCustomerProfileId();
							
							$address = new AuthorizeNetAddress;
							$address->firstName 			= $contact_first;
							$address->lastName 			= $contact_last;
							//$address->company			= "John Doe Company";
							$address->address 			= $contact_address;
							$address->city 					= $contact_city;
							$address->state 				= $contact_st;
							$address->zip 					= 	$contact_zip;
							//$address->country	 		= "USA";
							$address->phoneNumber 	= $contact_phone;
							//$address->faxNumber 		= "555-555-5556";
							$response = $request->createCustomerShippingAddress($customerProfileId, $address);
							$customerAddressId = $response->getCustomerAddressId();
							//$customerPaymentID = $response->getCustomerPaymentProfileIds();
							
							// Update database with profile id
							
					
							
							UpdateContactCIM($contact_id,$customerProfileId,$customerAddressId,$paymentProfileId ,$db);
							// Create Payment 
						
							
							echo "1|".$customerProfileId."-".$customerAddressId." - ".$paymentProfileId. "- ";
					}
					else
					{
							echo "0|".$response->xml->messages->message->text;
					}
	}
	else
	{
		echo "0|Internal Error-create profile";	
	}
}

 In my config file I have the log in an pass set to the live credentials. 

define("AUTHORIZENET_API_LOGIN_ID", $login_id);
define("AUTHORIZENET_TRANSACTION_KEY", $trans_key);

 

 

Expert
Posts: 4,525
Registered: ‎03-08-2010

Re: CIM Live getting E00027 here is one or more missing or invalid required fields

Login into your merchant account

Account Settings - Payment Forms - Form Fields - Check to see which fields is checked as required.

 

And the Doc said 290 is

One or more required AVS values for zero dollar authorization were not submitted.
When submitting authorization requests for Visa, you must enter the address and zip code fields.