Posthorn

Easy access to Deutsche Post 1C4A webservice

With this Gem it is possible to order pre-paid shipping stickers from the Deutsche Post. Payment is done through the so called "Portokasse", a prepaid wallet service. To use this Gem a registration for the "Portokasse" and the 1C4A webservice is necessary. For more detailed information see (Sorry, only in German language...)

https://portokasse.deutschepost.de/portokasse/#/

https://www.deutschepost.de/de/i/internetmarke-porto-drucken/partner-werden.html

Installation

Add this line to your application's Gemfile:

gem 'posthorn'

And then execute:

$ bundle

In case this Gem is used within a Rails application add a new initializer and add the following content

Posthorn.configure do |c|
  c.dpwn_key = Rails.application.secrets[:posthorn_dpwn_key]
  c.partner_id = Rails.application.secrets[:posthorn_partner_id]
  c.key_phase = 1
  c.username = Rails.application.secrets[:posthorn_username]
  c.password = Rails.application.secrets[:posthorn_password]
end

Use the secrets.yml file to securely store all necessary keys and passwords.

Usage

This example will order a single domestic shipping label. The sandbox credentials can be used to run the example without burning real cash. To execute it, Posthorn should be already configured as shown above.

# Open a new (post-)office
office = Office.new

# Create a new recveiver and sender address, country codes can be ISO3166 Alpha2 codes or Countries Gem instances
# see https://github.com/hexorx/countries for details
receiver = Address.new(
  firstname: 'Hans Peter',
  lastname: 'Wurst',
  street: 'Carbynstraße',
  no: '2',
  city: 'Eschweiler',
  zip: '52249',
  country: 'de')

sender = Address.new(
  company: 'Your Company',
  street: 'Charles-de-Gaulle-Straße',
  no: '20',
  city: 'Bonn',
  zip: '53113',
  country: 'de')

# Add a new label to the shopping cart
# for product_id and price, please referee to Deutsche Post ProdWS database
# in this example ID 21 is used which is a large size letter, price is Euro 1.45
office.cart << Label.new(sender, receiver, product_id: 21, price: 145)

# all available page formats can be received with
# puts office.page_formats
labels = office.checkout!(page_format: 25)
IO.write('labels_as_pdf_file.pdf', labels)

The output will be a ready to use shipping label as shown below.

Example label as PDF