Ruby ΠΊΠ»ΠΈΠ΅Π½Ρ Π΄Π»Ρ API ΡΠ»ΡΠΆΠ±Ρ Π΄ΠΎΡΡΠ°Π²ΠΊΠΈ Π‘ΠΠΠ (www.edostavka.com).
ΠΠΎΠ±Π°Π²ΠΈΡΡ Π² Gemfile:
gem 'cdek_client'
Π Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ:
$ bundle
ΠΠ»ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΡΡΠ½ΡΡ:
$ gem install cdek_client
Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΡΠ°Π½Ρ ΠΊΠ»Π°ΡΡΠ° CdekClient::Client:
client = CdekClient::Client.new ΠΠΠ¨_ΠΠΠΠΠ, ΠΠΠ¨_ΠΠΠ ΠΠΠ¬ΠΡΠ·ΠΎΠ²Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° CdekClient::Result. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ Ρ
ΡΠ°Π½ΠΈΡΡΡ Π² Π°ΡΡΠΈΠ±ΡΡΠ΅ data, ΠΎΡΠΈΠ±ΠΊΠΈ (Π΅ΡΠ»ΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ) Π² errors. ΠΠΎΠ»Π½ΡΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π°ΠΏΡΠΎΡΠ° (HTTParty) ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· Π°ΡΡΠΈΠ±ΡΡΠ° response. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
result = client.pickup_points cityid: 44
result.errors.any? # => false
result.data.length # => 20
result.data.each do |pickup_point|
puts "#{pickup_point[:Code]} #{pickup_point[:Name]}"
end
result = client.pickup_points cityid: 9999
result.data.length # => 0
result.errors.inspect # => [#<CdekClient::PvzNotfoundError>]ΠΠ»Π°ΡΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π°ΡΠ»Π΅Π΄ΡΡΡ ΠΎΡ CdekClient::Error:
- StandardError
- CdekClient::Error
- CdekClient::ResponseError
- CdekClient::APIError
- CdekClient::AttributeEmptyError
- CdekClient::AuthError
- CdekClient::BarcodeDublError
- etc ...
- CdekClient::Calculator::Error
- CdekClient::Calculator::APIError
- CdekClient::Calculator::ApiVersionError
- CdekClient::Calculator::AuthError
- CdekClient::Calculator::DeliveryImpossibleError
- etc ...
- CdekClient::Calculator::APIError
- CdekClient::Error
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
# CdekClient::ResponseError
error.code # => 500
error.message # => internal server error
# ΠΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ CdekClient::APIError
error.class # => CdekClient::AttributeEmptyError
error.code # => ERR_ATTRIBUTE_EMPTY
error.message # => ΠΠ΅ Π·Π°Π΄Π°Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ°:NUMBER
# ΠΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ CdekClient::Calculator::APIError
error.class # => CdekClient::Calculator::DeliveryImpossibleError
error.code # => 3
error.message # => ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ Π΄ΠΎΡΡΠ°Π²ΠΊΡ ΠΏΠΎ ΡΡΠΎΠΌΡ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΡΠΈ Π·Π°Π΄Π°Π½Π½ΡΡ
ΡΡΠ»ΠΎΠ²ΠΈΡΡ
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ API ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΠΊ API. Π‘ΠΏΠΈΡΠΎΠΊ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΎΡΠΈΠ±ΠΎΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² lib/cdek_client/errors.rb ΠΈ lib/cdek_client/calculator_errors.rb.
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΡΠΌΠ°ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΡ ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΡΡΠ΅ΡΡ Ρ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅ΠΉ ΠΊ API.
ΠΠ°ΡΡ ΠΈ Π²ΡΠ΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΊΠ»Π°ΡΡΠ° Date ΠΈ Time, ΡΠ°ΠΊ ΠΈ ΠΊΠ°ΠΊ ΡΡΡΠΎΠΊΠΈ Π² ΡΠΎΡΠΌΠ°ΡΠ°Ρ
%Y-%m-%d ΠΈ %Y-%m-%dT%H:%M:%S.
client.pickup_points
client.pickup_points filter_paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
cityid: 44,
citypostcode: 656065
}client.new_orders paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
Number: 'ΠΠΎΠΌΠ΅Ρ Π°ΠΊΡΠ° ΠΏΡΠΈΠ΅ΠΌΠ°-ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ',
Order: [
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°',
SendCityCode: 16196,
RecCityCode: 270,
RecipientName: 'John Doe',
Phone: '123-456-789',
TariffTypeCode: 1,
# etc ...
Address: {
Street: 'ΠΠ΅ΠΊΠ°Ρ ΡΠ»ΠΈΡΠ°',
House: '123',
Flat: '456'
PvzCode: 'ABC123'
},
Package: [
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
Barcode: 'Π¨ΡΡΠΈΡ
-ΠΊΠΎΠ΄ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
Weight: 10,
SizeA: 100,
SizeB: 100,
SizeC: 100,
Item: [
{
WareKey: 'ΠΡΡΠΈΠΊΡΠ» ΡΠΎΠ²Π°ΡΠ°',
Cost: 100,
Payment: 0,
Weight: 1,
Amount: 1,
Comment: 'ΠΠ°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΎΠ²Π°ΡΠ°'
},
{
WareKey: 'ΠΡΡΠΈΠΊΡΠ» ΡΠΎΠ²Π°ΡΠ° 2'
# etc ...
}
]
},
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ 2'
# etc ...
}
],
AddService: {
ServiceCode: 2
}
},
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ 2'
# etc ...
}
]
}ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Order, Package ΠΈ Item ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Ρ
Π΅ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ
Π΅ΡΠ΅ΠΉ, Ρ.Π΅.:
Order: { }
# ΠΈΠ»ΠΈ
Order: [{}, {}, ...]client.new_schedule paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
Order: [
{
DispatchNumber: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π‘ΠΠΠ',
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°',
Date: Date.today,
Attempt: {
Date: Date.today,
RecipientName: 'John Doe',
# etc ...
Address: {
Street: 'ΠΠ΅ΠΊΠ°Ρ ΡΠ»ΠΈΡΠ°',
House: '123',
Flat: '456',
# etc ...
Package: [
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ',
Item: [
{
WareKey: 'ΠΡΡΠΈΠΊΡΠ» ΡΠΎΠ²Π°ΡΠ°',
Payment: 100
},
{
WareKey: 'ΠΡΡΠΈΠΊΡΠ» ΡΠΎΠ²Π°ΡΠ° 2'
Payment: 200
},
# etc ...
]
},
{
Number: 'ΠΠΎΠΌΠ΅Ρ ΡΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ 2',
# etc ...
},
# etc ...
]
}
}
},
{
DispatchNumber: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π‘ΠΠΠ 2',
# etc ...
},
# etc ...
]
}ΠΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Order, Package ΠΈ Item ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Ρ
Π΅ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ
Π΅ΡΠ΅ΠΉ.
client.call_courier paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
Call: [
{
Date: Date.today,
SendCityCode: 65,
TimeBeg: '12:00',
TimeEnd: '16:00',
SenderName: 'John Doe',
SendPhone: '123-456-789',
# etc ...
Address: {
Street: 'ΠΠ΅ΠΊΠ°Ρ ΡΠ»ΠΈΡΠ°',
House: '123',
Flat: '456'
}
},
{
Date: Date.today.next_day,
# etc ...
},
# etc ...
]ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Call ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Ρ
Π΅ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ
Π΅ΡΠ΅ΠΉ.
client.delete_orders paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
Number: 'ΠΠΎΠΌΠ΅Ρ Π°ΠΊΡΠ° ΠΏΡΠΈΠ΅ΠΌΠ°-ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ',
Order: [
{ Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° 1' },
{ Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° 2' },
# etc ...
]ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Order ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Ρ
Π΅ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ
Π΅ΡΠ΅ΠΉ.
client.order_statuses
client.order_statuses filter_paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
ShowHistory: 1,
ChangePeriod: {
DateFirst: Date.today,
DateLast: Date.today
},
Order: {
DispatchNumber: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π‘ΠΠΠ',
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°',
Date: Date.today
}
}client.order_infos filter_paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
ChangePeriod: {
DateBeg: Date.today,
DateEnd: Date.today
},
Order: {
DispatchNumber: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π‘ΠΠΠ',
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°',
Date: Date.today
}
}client.orders_print paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
CopyCount: 1,
Order: {
DispatchNumber: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π‘ΠΠΠ',
Number: 'ΠΠΎΠΌΠ΅Ρ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°',
Date: Date.today
}
}ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ Order ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Ρ
Π΅ΡΠ΅ΠΌ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ
Π΅ΡΠ΅ΠΉ.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
result = client.orders_print Order: { DispatchNumber: '123456' }
if result.errors.any?
result.errors.each do |e|
puts "#{e.code} - #{e.message}"
end
else
file_path = '/path/to/file.pdf'
File.open(file_path, 'w') { |f| f.write result.data }
endclient.calculate_price paramsΠ€ΠΎΡΠΌΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ²:
{
dateExecute: Date.today,
senderCityId: 270,
receiverCityId: 44,
tariffId: 137,
tariffList: [
# ...
],
modeId: 1,
goods: [
{
weight: 1,
length: 1,
width: 1,
height: 1,
# ΠΈΠ»ΠΈ
volume: 1
},
# etc ...
]
}ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡΠ° Π±Π΅Π· Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ:
calculator = CdekClient::CalculatorClient.new
result = calculator.calculate params- Π’Π΅ΡΡΡ
- Π£Π»ΡΡΡΠΈΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ xml Π² Ρ Π΅Ρ ΠΈ ΠΎΡΡΠ΅ΡΠ°ΠΊΡΠΎΡΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΡ Π΄Π°Π½Π½ΡΡ
- www.edostavka.ru - Π‘Π°ΠΉΡ Π‘ΠΠΠ.
- www.edostavka.ru/clients/integrator.html - ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΊ API.
Π Π°Π·ΡΠ°Π±ΠΎΡΠ°Π½ΠΎ ΠΏΡΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ-ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° Π½Π°ΡΡΠΎΠ»ΡΠ½ΡΡ ΠΈΠ³Ρ "Π’Π°Π½Π³ΠΎ ΠΈ ΠΡΡ"