_refId = $refId; } /** * Create a customer profile. * * @param AuthorizeNetCustomer $customerProfile * @param string $validationMode * * @return AuthorizeNetCIM_Response */ public function createCustomerProfile($customerProfile, $validationMode = "none") { $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 = "none") { $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; 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 = "none") { $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 = "testMode") { $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(); } /** * @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("",'_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 = '<'.$request_type.' xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">'; $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"); } }