Forum: Ruby on Rails UPS Shipping Tools XML Integration

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
61f9a215dc708b46dc580ce0e1af513f?d=identicon&s=25 Kyle (Guest)
on 2007-07-31 21:16
(Received via mailing list)
Hello!  I'm relatively new to Rails and in over my head...

I'd like to integrate the XML UPS Shipping tools into an online cart
so that a user can select a shipping method based on availability and
price.  I understand what UPS wants and what I should get back from
them...but I'm failing at the most basic level.  How can I do the
following:

1) send UPS an XML Post request,
2) parse the XML that they send back, and
3) use their response in my next view template?

It seems like this should be so basic, but I've searched with no
luck.  Any help is greatly appreciated.

-Kyle
61f9a215dc708b46dc580ce0e1af513f?d=identicon&s=25 Kyle (Guest)
on 2007-08-23 22:23
(Received via mailing list)
Well, I finally got it.  I'm not sure that this is the best way, but
here's what I did:

----------------------------------

require 'net/http'
require 'net/https'

  def get_ups_rates
    url = "wwwcie.ups.com" # for testing
    path = "/ups.app/xml/Rate"
    headers = {"Content-Type" => "text/xml"}

    h = Net::HTTP.new(url, 443)
    h.use_ssl = true

    xmlrequest = "<?xml version='1.0' ?>
    <AccessRequest xml:lang='en-US'>
        <AccessLicenseNumber>xxxxxxxx</AccessLicenseNumber>
        <UserId>xxxxxxxx</UserId>
        <Password>xxxxxxxxx</Password>
    </AccessRequest>
    <?xml version='1.0' ?>
    <RatingServiceSelectionRequest>
        <Request>
             <RequestAction>rate</RequestAction>
             <RequestOption>Shop</RequestOption>
        </Request>
        <PickupType>
             <Code>01</Code>
        </PickupType>
        <Shipment>
             <Shipper>
                  <Name>Mass Street Music</Name>
                  <PhoneNumber>7858433535</PhoneNumber>
                  <FaxNumber>7858434999</FaxNumber>
                  <ShipperNumber>xxxxxx</ShipperNumber>
                  <Address>
                      <AddressLine1>1347 Massachusetts Street</
AddressLine1>
                      <City>Lawrence</City>
                      <StateProvinceCode>KS</StateProvinceCode>
                      <PostalCode>66044</PostalCode>
                      <CountryCode>US</CountryCode>
                  </Address>
             </Shipper>
             <ShipTo>
                  <Address>
                      <AddressLine1>#{@ship_street_1 ||
@bill_street_1}</AddressLine1>
                      <AddressLine2>#{@ship_street_2 ||
@bill_street_2}</AddressLine2>
                      <City>#{@ship_city || @bill_city}</City>
                      <StateProvinceCode>#{@ship_state ||
@bill_state}</StateProvinceCode>
                      <PostalCode>#{@ship_zip || @bill_zip}</
PostalCode>
                      <CountryCode>US</CountryCode>
                      <ResidentialAddressIndicator>Yes</
ResidentialAddressIndicator>
                  </Address>
             </ShipTo>
             <ShipmentWeight>
                  <UnitOfMeasurement>
                       <Code>LBS</Code>
                  </UnitOfMeasurement>
                  <Weight>#{@cart.total_weight}</Weight>
             </ShipmentWeight>
             <PaymentInformation>
                  <Prepaid>
                      <BillShipper><AccountNumber>xxxxxx</
AccountNumber></BillShipper>
                  </Prepaid>
             </PaymentInformation>
             <Package>
                  <PackagingType>
                      <Code>02</Code>
                  </PackagingType>
                  <PackageWeight>
                      <UnitOfMeasurement>
                           <Code>LBS</Code>
                      </UnitOfMeasurement>
                      <Weight>#{@cart.total_weight}</Weight>
                  </PackageWeight>
             </Package>
        </Shipment>
    </RatingServiceSelectionRequest>"

    @resp, @data = h.post(path, xmlrequest, headers)

    doc = REXML::Document.new(@data)
      REXML::XPath.each(doc, "/RatingServiceSelectionResponse/
RatedShipment"){ |service|
      @code = service.elements["Service"].elements["Code"]
        if @code.text == "03"
          @upsg =
@code.parent.parent.elements["TotalCharges"].elements["MonetaryValue"].text
        end
        if @code.text == "12"
          @ups3 =
@code.parent.parent.elements["TotalCharges"].elements["MonetaryValue"].text
        end
        if @code.text == "02"
          @ups2 =
@code.parent.parent.elements["TotalCharges"].elements["MonetaryValue"].text
        end
        if @code.text == "01"
          @ups1 =
@code.parent.parent.elements["TotalCharges"].elements["MonetaryValue"].text
        end
      }

    session[:upsg] = @upsg if @upsg
    session[:ups3] = @ups3 if @ups3
    session[:ups2] = @ups2 if @ups2
    session[:ups1] = @ups1 if @ups1

  end

----------------------------------

I use this to find the rates for UPS Ground, 3-Day, 2-Day, and Next-
Day.  The view (template) then takes these rates and plops them into a
selection list.  It's not exactly pretty, but it seems to work.

I hope that somebody might find this useful!  I know that I could have
used it when I was trying things out...

-Kyle
3ab638f9fec4f0e0495a273268749b9e?d=identicon&s=25 Will Weidendorf (Guest)
on 2007-08-27 16:09
(Received via mailing list)
Kyle,
This may be something that is along the lines of what you are looking
for.  It's a rubygem that handles both UPS and FedEx shipping rates.

http://shipping.rubyforge.org/

-Will
61f9a215dc708b46dc580ce0e1af513f?d=identicon&s=25 Kyle (Guest)
on 2007-08-28 00:02
(Received via mailing list)
Thanks for the link.  I had looked at the shipping gem, but it appears
that it hasn't been maintained since 2005.  I'm also not quite savvy
enough to implement a gem like this by looking only at the source.
Hopefully the solution I came up with will continue to work.  I
haven't looked at the FedEx tools yet, but UPS (technically speaking)
won't allow a programmer to use their API and display a competitor's
rates side by side.

-Kyle
This topic is locked and can not be replied to.