initAddress(); $this->setCountryCode($countryCode); } private function initAddress() { if (! isset($this->_streetAddress)) $this->_streetAddress = new AddressKeyFormatType(); } public function setName($name) { $name = $name; $this->_streetAddress->setConsigneeName($name); return $this; } public function setAddressLine($address) { if (! is_array($address)) $address = [ $address ]; $this->_streetAddress->setAddressLine($address); return $this; } public function setProvince($province) { $province = $province; $this->_streetAddress->setPoliticalDivision1($province); return $this; } public function setState($state) { $state = $state; return $this->setProvince($state); } public function setCity($city) { $city = $city; $this->_streetAddress->setPoliticalDivision2($city); return $this; } public function setZipcode($zip) { $parts = []; if (preg_match('/([a-zA-Z0-9]{5})[\-\+_\s]?(\d{4})?/', trim($zip), $parts)) { $this->setPostcode($parts[1]); if(isset($parts[2])) $this->setPlusFour($parts[2]); } return $this; } public function setPostcode($postcode) { $this->_streetAddress->setPostcodePrimaryLow($postcode); return $this; } public function setPlusFour($plusFour) { $plusFour = trim($plusFour); $code = $this->getCountryCode(); if (! $code) { throw new StreetAddressValidateException('Must set country code before setting plus four zip code.'); } else if ($code != 'US') { throw new StreetAddressValidateException('Plus four can only be used for U.S. addresses.'); } else if (! preg_match('/\d{4}/', $plusFour)) { throw new StreetAddressValidateException('Plus four must be exactly four digits.'); } else { $this->_streetAddress->setPostcodeExtendedLow($plusFour); } return $this; } private function getCountryCode() { if (isset($this->_streetAddress) && isset($this->_streetAddress->CountryCode)) return $this->_streetAddress->CountryCode; } public function setCountryCode($code = 'US') { if ($code == 'US') { $this->_requestOption = self::OPTION_BOTH; } else if ($code == 'PR') { $this->_requestOption = self::OPTION_VALIDATE; } else if ($code == 'CA') { $this->_requestOption = self::OPTION_CLASSIFY; } else { throw new StreetAddressValidateException( 'Street address validation can only be performed for addresses in ' . 'the U.S., Puerto Rico, and Canada.' ); } $this->_streetAddress->setCountryCode($code); return $this; } public function send() { $RequestType = new RequestType(self::OPTION_BOTH); $request = new XAVRequest($RequestType, null, null, $this->_streetAddress); $UsernameToken = new UsernameToken(); $ServiceAccessToken = new ServiceAccessToken(); $UPSSecurity = new UPSSecurity($UsernameToken, $ServiceAccessToken); $UsernameToken->setUsername($this->_user); $UsernameToken->setPassword($this->_pass); $ServiceAccessToken->setAccessLicenseNumber($this->_key); $header = new SoapHeader($this->_schema, 'UPSSecurity', $UPSSecurity); $options = [ 'soap_version' => 'SOAP_1_1', 'exceptions' => true, 'location' => $this->_endpoint, 'trace' => true ]; $wsdl = $this->_wsdl; $this->_client = new SoapClient($wsdl, $options); $this->_client->__setSoapHeaders($header); try { $this->_response = $this->_client->ProcessXAV($request, $options); } catch (SoapFault $s) { if (isset($s->detail)) { $err = $s->detail->Errors->ErrorDetail->PrimaryErrorCode->Description; throw new StreetAddressValidateException($err); } } return $this; } public function getAddressClassification() { if (! isset($this->_response)) throw new StreetAddressValidateException('No server response has been set.'); if ($this->getCountryCode() == 'PR') throw new StreetAddressValidateException('Cannot validate Puerto Rico addresses.'); if (isset($this->_response->ValidAddressIndicator)) return intval($this->_response->AddressClassification->Code); return static::UNKNOWN; } public function isResidential() { return $this->getAddressClassification() == static::RESIDENTIAL; } public function isCommercial() { return $this->getAddressClassification() == static::COMMERCIAL; } public function getAddressValidity() { if (! isset($this->_response)) throw new StreetAddressValidateException('No server response has been set.'); if (isset($this->_response->ValidAddressIndicator)) return static::VALID; else if (isset($this->_response->NoCandidates)) return static::INVALID; else if (isset($this->_response->AmbiguousAddressIndicator)) return static::AMBIGUOUS; } public function valid() { return $this->getAddressValidity() == static::VALID; } public function getLastRequest() { $request = $this->_client->__getLastRequest(); if ($request) { $dom = new DOMDocument; $dom->preserveWhiteSpace = FALSE; $dom->formatOutput = TRUE; $dom->loadXML($request); return $dom->saveXml(); } } public function getLastResponse() { $request = $this->_client->__getLastResponse(); if ($request) { $dom = new DOMDocument; $dom->preserveWhiteSpace = FALSE; $dom->formatOutput = TRUE; $dom->loadXML($request); return $dom->saveXml(); } } }