public class USPSManager { #region Private Members private const string ProductionUrl = "http://production.shippingapis.com/ShippingAPI.dll"; private const string TestingUrl = "http://testing.shippingapis.com/ShippingAPITest.dll"; private WebClient web; private string _userid; #endregion #region Constructors /// /// Creates a new USPS Manager instance /// /// The UserID required by the USPS Web Tools public USPSManager(string USPSWebtoolUserID) { web = new WebClient(); _userid = USPSWebtoolUserID; _TestMode = false; } /// /// Creates a new USPS Manager instance /// /// The UserID required by the USPS Web Tools /// If True, then the USPS Test URL will be used. public USPSManager(string USPSWebtoolUserID, bool testmode) { _TestMode = testmode; web = new WebClient(); _userid = USPSWebtoolUserID; } #endregion #region Properties private bool _TestMode; /// /// Determines if the Calls to the USPS server is made to the Test or Production server. /// public bool TestMode { get { return _TestMode; } set { _TestMode = value; } } #endregion #region Address Methods /// /// Validate a single address /// /// Address object to be validated /// Validated Address public Address ValidateAddress(Address address) { try { string validateUrl = "?API=Verify&XML=
{2}{3}{4}{5}{6}{7}
"; string url = GetURL() + validateUrl; url = String.Format(url, _userid, address.ID.ToString(), address.Address1, address.Address2, address.City, address.State, address.Zip, address.ZipPlus4); string addressxml = web.DownloadString(url); if (addressxml.Contains("")) { int idx1 = addressxml.IndexOf("") + 13; int idx2 = addressxml.IndexOf(""); int l = addressxml.Length; string errDesc = addressxml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } return Address.FromXml(addressxml); } catch(WebException ex) { throw new USPSManagerException(ex); } } /// /// Get the zip code by providing an Address object with a city and state /// /// City /// State public Address GetZipcode(string city, string state) { Address a = new Address(); a.City = city; a.State = state; return GetZipcode(a); } /// /// Get the zip code by providing an Address object with a city and state /// /// Address Object /// Address Object public Address GetZipcode(Address address) { try { //The address must contain a city and state if (address.City == null || address.City.Length < 1 || address.State == null || address.State.Length < 1) throw new USPSManagerException("You must supply a city and state for a zipcode lookup request."); string zipcodeurl = "?API=ZipCodeLookup&XML=
{2}{3}{4}{5}
"; string url = GetURL() + zipcodeurl; url = String.Format(url, _userid, address.ID.ToString(), address.Address1, address.Address2, address.City, address.State, address.Zip, address.ZipPlus4); string addressxml = web.DownloadString(url); if (addressxml.Contains("")) { int idx1 = addressxml.IndexOf("") + 13; int idx2 = addressxml.IndexOf(""); int l = addressxml.Length; string errDesc = addressxml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } return Address.FromXml(addressxml); } catch (WebException ex) { throw new USPSManagerException(ex); } } /// /// Get the city and state by proving the zip code. /// /// Zipcode public Address GetCityState(string zipcode) { Address a = new Address(); a.Zip = zipcode; return GetCityState(a); } /// /// Get the city and state by proving the zip code. /// /// Address object /// Address Object public Address GetCityState(Address address) { try { //The address must contain a city and state if (address.Zip == null || address.Zip.Length < 1) throw new USPSManagerException("You must supply a zipcode for a city/state lookup request."); string citystateurl = "?API=CityStateLookup&XML={2}"; string url = GetURL() + citystateurl; url = String.Format(url, _userid, address.ID.ToString(), address.Zip); string addressxml = web.DownloadString(url); if (addressxml.Contains("")) { int idx1 = addressxml.IndexOf("") + 13; int idx2 = addressxml.IndexOf(""); int l = addressxml.Length; string errDesc = addressxml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } return Address.FromXml(addressxml); } catch (WebException ex) { throw new USPSManagerException(ex); } } #endregion #region Tracking Methods public TrackingInfo GetTrackingInfo(string TrackingNumber) { try { string trackurl = "?API=TrackV2&XML="; string url = GetURL() + trackurl; url = String.Format(url, _userid, TrackingNumber); string xml = web.DownloadString(url); if (xml.Contains("")) { int idx1 = xml.IndexOf("") + 13; int idx2 = xml.IndexOf(""); int l = xml.Length; string errDesc = xml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } return TrackingInfo.FromXml(xml); } catch (WebException ex) { throw new USPSManagerException(ex); } } #endregion #region Label Methods /// /// Fills a package's ShippingLabel with a Byte{} containing the Image for the label /// /// Package with From and To addresses provided /// The same package with the ShippingLabel public Package GetDeliveryConfirmationLabel(Package package) { string labeldate = package.ShipDate.ToShortDateString(); if (package.ShipDate.ToShortDateString() == DateTime.Now.ToShortDateString()) labeldate = ""; string url = "?API=DeliveryConfirmationV3&XML={2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}{17}{18}{19}{20}{21}{22}{23}{24}{25}{26}{27}{28}"; url = GetURL() + url; //url = String.Format(url,this._userid, (int)package.LabelType, package.FromAddress.Contact, package.FromAddress.FirmName, package.FromAddress.Address1, package.FromAddress.Address2, package.FromAddress.City, package.FromAddress.State, package.FromAddress.Zip, package.FromAddress.ZipPlus4, package.ToAddress.Contact, package.ToAddress.FirmName, package.ToAddress.Address1, package.ToAddress.Address2, package.ToAddress.City, package.ToAddress.State, package.ToAddress.Zip, package.ToAddress.ZipPlus4, package.WeightInOunces.ToString(), package.ServiceType.ToString().Replace("_", " "), package.OriginZipcode, package.LabelImageType.ToString(), labeldate, package.ReferenceNumber, package.AddressServiceRequested.ToString(), package.FromAddress.Contact, package.FromAddress.ContactEmail, package.ToAddress.Contact, package.ToAddress.ContactEmail); url = String.Format(url, this._userid, (int)package.LabelType, package.FromAddress.Contact, package.FromAddress.FirmName, package.FromAddress.Address1, package.FromAddress.Address2, package.FromAddress.City, package.FromAddress.State, package.FromAddress.Zip, package.FromAddress.ZipPlus4, package.ToAddress.Contact, package.ToAddress.FirmName, package.ToAddress.Address1, package.ToAddress.Address2, package.ToAddress.City, package.ToAddress.State, package.ToAddress.Zip, package.ToAddress.ZipPlus4, package.WeightInOunces.ToString(), package.ServiceType.ToString().Replace("_", " "), package.OriginZipcode, package.LabelImageType.ToString(), labeldate, package.ReferenceNumber, package.AddressServiceRequested.ToString(), "", "", "", ""); string xml = web.DownloadString(url); if (xml.Contains("")) { int idx1 = xml.IndexOf("") + 13; int idx2 = xml.IndexOf(""); int l = xml.Length; string errDesc = xml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } int i1 = xml.IndexOf("") + 27; int i2 = xml.IndexOf(""); package.ShippingLabel = StringToUTF8ByteArray(xml.Substring(i1, i2 - i1)); return package; } /// /// Fills a package's ShippingLabel with a Byte{} containing the Image for the label /// /// Package with From and To addresses provided /// The same package with the ShippingLabel public Package GetSignatureConfirmationLabel(Package package) { string url = "?API=SignatureConfirmationV3&XML={2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}{17}{18}{19}{20}{21}{22}{23}{24}"; url = GetURL() + url; url = String.Format(url, this._userid, (int)package.LabelType, package.FromAddress.Contact, package.FromAddress.FirmName, package.FromAddress.Address1, package.FromAddress.Address2, package.FromAddress.City, package.FromAddress.State, package.FromAddress.Zip, package.FromAddress.ZipPlus4, package.ToAddress.Contact, package.ToAddress.FirmName, package.ToAddress.Address1, package.ToAddress.Address2, package.ToAddress.City, package.ToAddress.State, package.ToAddress.Zip, package.ToAddress.ZipPlus4, package.WeightInOunces.ToString(), package.ServiceType.ToString().Replace("_", " "), package.OriginZipcode, package.LabelImageType.ToString(), package.ShipDate.ToShortDateString(), package.ReferenceNumber, package.AddressServiceRequested.ToString(), package.FromAddress.Contact, package.FromAddress.ContactEmail, package.ToAddress.Contact, package.ToAddress.ContactEmail); string xml = web.DownloadString(url); if (xml.Contains("")) { int idx1 = xml.IndexOf("") + 13; int idx2 = xml.IndexOf(""); int l = xml.Length; string errDesc = xml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } int i1 = xml.IndexOf("") + 28; int i2 = xml.IndexOf(""); package.ShippingLabel = StringToUTF8ByteArray(xml.Substring(i1, i2 - i1)); return package; } #endregion #region Rates public RateResponse GetRate(Package package) { try { string url = "?API=RateV2&XML={1}{2}{3}{4}{5}{6}{7}"; int lb = package.WeightInOunces / 16; int oz = package.WeightInOunces % 16; string container = package.PackageType.ToString().Replace("_", " "); if (container == "None") url = url.Replace("{6}", ""); string fromZip = package.FromAddress.Zip; if (package.OriginZipcode != null && package.OriginZipcode.Length > 0) fromZip = package.OriginZipcode; url = GetURL() + url; url = String.Format(url, _userid, package.ServiceType.ToString(), fromZip, package.ToAddress.Zip, lb.ToString(), oz.ToString(), container, package.PackageSize.ToString().Replace("_", " ")); string xml = web.DownloadString(url); if (xml.Contains("")) { int idx1 = xml.IndexOf("") + 13; int idx2 = xml.IndexOf(""); int l = xml.Length; string errDesc = xml.Substring(idx1, idx2 - idx1); throw new USPSManagerException(errDesc); } return RateResponse.FromXml(xml); } catch (WebException ex) { throw new USPSManagerException(ex); } } #endregion #region TextConversions /// /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String. /// /// Unicode Byte Array to be converted to String /// String converted from Unicode Byte Array private String UTF8ByteArrayToString(Byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); String constructedString = encoding.GetString(characters); return (constructedString); } /// /// Converts the String to UTF8 Byte array and is used in De serialization /// /// /// private Byte[] StringToUTF8ByteArray(String pXmlString) { UTF8Encoding encoding = new UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(pXmlString); return byteArray; } #endregion #region Private methods private string GetURL() { string url = ProductionUrl; if (TestMode) url = TestingUrl; return url; } #endregion }