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
}