openpayu 0.0.2 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +5 -13
  2. data/README.md +26 -21
  3. data/doc/EmptyResponseError.html +4 -4
  4. data/doc/HttpStatusException.html +4 -4
  5. data/doc/NotImplementedException.html +4 -4
  6. data/doc/OpenPayU.html +13 -13
  7. data/doc/OpenPayU/Configuration.html +19 -17
  8. data/doc/OpenPayU/Connection.html +35 -43
  9. data/doc/OpenPayU/Document.html +24 -228
  10. data/doc/OpenPayU/Documents.html +4 -4
  11. data/doc/OpenPayU/Documents/Request.html +5 -5
  12. data/doc/OpenPayU/Documents/Response.html +72 -120
  13. data/doc/OpenPayU/Models.html +5 -5
  14. data/doc/OpenPayU/Models/Address.html +5 -6
  15. data/doc/OpenPayU/Models/Buyer.html +5 -6
  16. data/doc/OpenPayU/Models/Buyer/Delivery.html +5 -6
  17. data/doc/OpenPayU/Models/Card.html +5 -6
  18. data/doc/OpenPayU/Models/Fee.html +5 -6
  19. data/doc/OpenPayU/Models/Model.html +122 -207
  20. data/doc/OpenPayU/Models/NotifyResponse.html +5 -6
  21. data/doc/OpenPayU/Models/Order.html +8 -9
  22. data/doc/OpenPayU/Models/PayMethod.html +5 -6
  23. data/doc/OpenPayU/Models/Product.html +5 -6
  24. data/doc/OpenPayU/Models/Refund.html +13 -102
  25. data/doc/OpenPayU/Models/ShippingMethod.html +13 -14
  26. data/doc/OpenPayU/Models/StatusUpdate.html +5 -6
  27. data/doc/OpenPayU/Models/Token.html +5 -6
  28. data/doc/OpenPayU/Order.html +53 -89
  29. data/doc/OpenPayU/Refund.html +6 -18
  30. data/doc/OpenPayU/Token.html +4 -4
  31. data/doc/WrongConfigurationError.html +4 -4
  32. data/doc/WrongNotifyRequest.html +4 -4
  33. data/doc/WrongOrderParameters.html +4 -4
  34. data/doc/WrongSignatureException.html +4 -4
  35. data/doc/_index.html +13 -31
  36. data/doc/class_list.html +1 -1
  37. data/doc/css/style.css +2 -1
  38. data/doc/file.README.html +38 -30
  39. data/doc/frames.html +1 -1
  40. data/doc/index.html +38 -30
  41. data/doc/js/app.js +7 -2
  42. data/doc/method_list.html +78 -120
  43. data/doc/top-level-namespace.html +4 -4
  44. data/lib/openpayu.rb +0 -1
  45. data/lib/openpayu/configuration.rb +1 -0
  46. data/lib/openpayu/connection.rb +28 -19
  47. data/lib/openpayu/document.rb +2 -38
  48. data/lib/openpayu/documents/response.rb +9 -20
  49. data/lib/openpayu/models/model.rb +4 -25
  50. data/lib/openpayu/models/order.rb +0 -1
  51. data/lib/openpayu/models/refund.rb +5 -27
  52. data/lib/openpayu/models/shipping_method.rb +2 -2
  53. data/lib/openpayu/order.rb +7 -25
  54. data/lib/openpayu/refund.rb +1 -7
  55. data/lib/openpayu/version.rb +1 -1
  56. data/openpayu_ruby.gemspec +0 -4
  57. data/spec/cassettes/cancel_order.yml +17 -26
  58. data/spec/cassettes/create_order.yml +19 -29
  59. data/spec/cassettes/retrieve_order.yml +18 -27
  60. data/spec/cassettes/update_order.yml +19 -28
  61. data/spec/integration/order_spec.rb +65 -78
  62. data/spec/openpayu.yml +2 -2
  63. data/spec/spec_helper.rb +5 -5
  64. data/spec/test_objects/order.rb +31 -56
  65. data/spec/unit/configuration_spec.rb +1 -1
  66. data/spec/unit/models/order_spec.rb +4 -34
  67. data/spec/unit/openpayu_spec.rb +2 -5
  68. metadata +55 -87
  69. data/lib/openpayu/xml_builder.rb +0 -23
  70. data/spec/cassettes/refund_order.yml +0 -100
@@ -6,7 +6,7 @@
6
6
  <title>
7
7
  Top Level Namespace
8
8
 
9
- &mdash; Documentation by YARD 0.8.7.2
9
+ &mdash; Documentation by YARD 0.8.7.4
10
10
 
11
11
  </title>
12
12
 
@@ -17,7 +17,7 @@
17
17
  <script type="text/javascript" charset="utf-8">
18
18
  hasFrames = window.top.frames.main ? true : false;
19
19
  relpath = '';
20
- framesUrl = "frames.html#!" + escape(window.location.href);
20
+ framesUrl = "frames.html#!top-level-namespace.html";
21
21
  </script>
22
22
 
23
23
 
@@ -105,9 +105,9 @@
105
105
  </div>
106
106
 
107
107
  <div id="footer">
108
- Generated on Tue Dec 17 15:20:58 2013 by
108
+ Generated on Thu May 29 15:13:57 2014 by
109
109
  <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
110
- 0.8.7.2 (ruby-1.9.3).
110
+ 0.8.7.4 (ruby-1.9.3).
111
111
  </div>
112
112
 
113
113
  </body>
data/lib/openpayu.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
- require_relative 'openpayu/xml_builder'
3
2
  require_relative 'openpayu/version'
4
3
  require_relative 'openpayu/configuration'
5
4
  require_relative 'openpayu/connection'
@@ -34,6 +34,7 @@ module OpenPayU
34
34
  @env = 'sandbox'
35
35
  @country = 'pl'
36
36
  @algorithm = 'MD5'
37
+ @data_format = 'json'
37
38
  end
38
39
 
39
40
  def required_parameters
@@ -7,55 +7,64 @@ module OpenPayU
7
7
 
8
8
  class Connection
9
9
 
10
- def self.post(url, data, headers)
11
- uri = URI.parse(url)
12
- http = Net::HTTP.new(uri.host, uri.port)
13
- http.use_ssl = true if OpenPayU::Configuration.use_ssl?
10
+ def self.post(endpoint, data)
11
+ http, uri = build_url(endpoint)
14
12
  request = Net::HTTP::Post.new(uri.path)
13
+ request = authenticate(request)
15
14
  request.body = data
16
15
  request['Content-Type'] =
17
16
  "application/#{OpenPayU::Configuration.data_format}"
18
- request['OpenPayu-Signature'] = headers['OpenPayu-Signature']
19
17
  response = http.request(request)
20
18
  { response: response, request: request }
21
19
  end
22
20
 
23
- def self.put(url, data, headers)
24
- uri = URI.parse(url)
25
- http = Net::HTTP.new(uri.host, uri.port)
26
- http.use_ssl = true if OpenPayU::Configuration.use_ssl?
21
+ def self.put(endpoint, data)
22
+ http, uri = build_url(endpoint)
27
23
  request = Net::HTTP::Put.new(uri.path)
24
+ request = authenticate(request)
28
25
  request.body = data
29
26
  request['Content-Type'] =
30
27
  "application/#{OpenPayU::Configuration.data_format}"
31
- request['OpenPayu-Signature'] = headers['OpenPayu-Signature']
32
28
  response = http.request(request)
33
29
  { response: response, request: request }
34
30
  end
35
31
 
36
- def self.get(url, data, headers)
37
- common_connection(url, data, headers, 'GET')
32
+ def self.get(endpoint, data)
33
+ common_connection(endpoint, data, 'GET')
38
34
  end
39
35
 
40
- def self.delete(url, data, headers)
41
- common_connection(url, data, headers, 'DELETE')
36
+ def self.delete(endpoint, data)
37
+ common_connection(endpoint, data, 'DELETE')
42
38
  end
43
39
 
44
40
  private
45
41
 
46
- def self.common_connection(url, data, headers, method)
47
- uri = URI.parse(url)
42
+ def self.authenticate(request)
43
+ request.basic_auth(
44
+ OpenPayU::Configuration.merchant_pos_id,
45
+ OpenPayU::Configuration.signature_key
46
+ )
47
+ request
48
+ end
49
+
50
+ def self.build_url(endpoint)
51
+ uri = URI.parse(Configuration.get_base_url + endpoint)
48
52
  http = Net::HTTP.new(uri.host, uri.port)
49
53
  http.use_ssl = true if OpenPayU::Configuration.use_ssl?
54
+ [http, uri]
55
+ end
56
+
57
+ def self.common_connection(endpoint, data, method)
58
+ http, uri = build_url(endpoint)
50
59
  request =
51
60
  if method == 'DELETE'
52
- Net::HTTP::Delete.new(uri.request_uri, headers)
61
+ Net::HTTP::Delete.new(uri.request_uri)
53
62
  else
54
- Net::HTTP::Get.new(uri.request_uri, headers)
63
+ Net::HTTP::Get.new(uri.request_uri)
55
64
  end
65
+ request = authenticate(request)
56
66
  request['Content-Type'] =
57
67
  "application/#{OpenPayU::Configuration.data_format}"
58
- request['OpenPayu-Signature'] = headers['OpenPayu-Signature']
59
68
  response = http.request(request)
60
69
  { response: response, request: request }
61
70
  end
@@ -37,9 +37,8 @@ module OpenPayU
37
37
  raise EmptyResponseError,
38
38
  "Got empty response from request: #{@request.try(:body)}"
39
39
  end
40
- if (@message_name == 'OrderNotifyRequest' ||
41
- %w(200 201 422 302).include?(response.code)) &&
42
- verify_signature(@body)
40
+ if ( response.is_a?(OpenPayU::Documents::Request) ||
41
+ %w(200 201 422 302).include?(response.code))
43
42
  true
44
43
  else
45
44
  raise HttpStatusException,
@@ -48,41 +47,6 @@ module OpenPayU
48
47
  end
49
48
  end
50
49
 
51
- def verify_signature(message)
52
- signature = parse_signature
53
- generated_signature = generate_signature(
54
- message,
55
- signature['algorithm'],
56
- OpenPayU::Configuration.signature_key
57
- )
58
- if generated_signature == signature['signature']
59
- true
60
- else
61
- raise WrongSignatureException,
62
- "Invalid signature: Got message signed with:
63
- #{signature["signature"]}. Generated signature:
64
- #{generated_signature}"
65
- end
66
-
67
- end
68
-
69
- def parse_signature
70
- parameters = {}
71
- get_signature.split(';').each do |parameter|
72
- k, v = parameter.split('=')
73
- parameters[k] = v
74
- end
75
- parameters
76
- end
77
-
78
- def get_signature
79
- @response['X-OpenPayU-Signature'] ||
80
- @response['x-openpayu-signature'] ||
81
- @response['openpayu-signature'] ||
82
- @response.headers['x-openpayu-signature'] ||
83
- @response.headers['openpayu-signature']
84
- end
85
-
86
50
  def underscore_keys(hash)
87
51
  deep_transform_keys(hash) { |key| key.underscore }
88
52
  end
@@ -2,12 +2,11 @@
2
2
  module OpenPayU
3
3
  module Documents
4
4
  class Response < Document
5
- attr_accessor :parsed_data, :response, :request, :message_name, :body
5
+ attr_accessor :parsed_data, :response, :request, :body
6
6
 
7
- def initialize(data, message_name)
7
+ def initialize(data)
8
8
  @response = data[:response]
9
9
  @request = data[:request]
10
- @message_name = message_name
11
10
  @body = @response.body.is_a?(StringIO) ? @response.body.string :
12
11
  @response.body
13
12
  parse_data if verify_response
@@ -18,25 +17,15 @@ module OpenPayU
18
17
  end
19
18
 
20
19
  def parse_data
21
- if OpenPayU::Configuration.data_format == 'xml'
22
- @parsed_data = Hash.from_xml(@body)
23
- else
24
- @parsed_data = JSON.parse(@body)
25
- end
26
- if @parsed_data['OpenPayU'] && @parsed_data['OpenPayU'][@message_name]
27
- @parsed_data = underscore_keys @parsed_data['OpenPayU'][@message_name]
28
- elsif @parsed_data['OpenPayU']
29
- @parsed_data = underscore_keys @parsed_data['OpenPayU']
30
- end
31
- @parsed_data
20
+ @parsed_data = underscore_keys JSON.parse(@body)
32
21
  end
33
22
 
34
- def order_status
35
- if @message_name == 'OrderRetrieveResponse'
36
- @parsed_data['orders']['order']['status']
37
- else
38
- @parsed_data['order'] ? @parsed_data['order']['status'] : ''
39
- end
23
+ def status
24
+ @parsed_data['status']
25
+ end
26
+
27
+ def order_status
28
+ @parsed_data['orders']['orders'][1]['status']
40
29
  end
41
30
 
42
31
  Models::Order::STATUSES.each do |method|
@@ -7,7 +7,6 @@ module OpenPayU
7
7
 
8
8
  include ActiveModel::Validations
9
9
  include ActiveModel::Serializers::JSON
10
- include ActiveModel::Serializers::Xml
11
10
 
12
11
  attr_accessor :all_errors
13
12
 
@@ -29,26 +28,8 @@ module OpenPayU
29
28
  prepare_keys.to_json
30
29
  end
31
30
 
32
- def prepare_data(request_type)
33
- if OpenPayU::Configuration.data_format == 'xml'
34
- generate_xml(request_type)
35
- else
36
- {
37
- 'OpenPayU' => {
38
- request_type => prepare_keys(instance_values)
39
- }
40
- }.to_json
41
- end
42
- end
43
-
44
- def generate_xml(request_type)
45
- '<?xml version="1.0" encoding="UTF-8"?>
46
- <OpenPayU xmlns="http://www.openpayu.com/20/openpayu.xsd">' +
47
- prepare_keys(instance_values).to_xml(
48
- builder: OpenPayU::XmlBuilder.new(request_type, indent: 2),
49
- root: request_type,
50
- skip_types: true,
51
- skip_instruct: true) + '</OpenPayU>'
31
+ def prepare_data
32
+ prepare_keys.to_json
52
33
  end
53
34
 
54
35
  def get_instance_values
@@ -59,11 +40,9 @@ module OpenPayU
59
40
 
60
41
  def prepare_keys(attrs = {}, hash = get_instance_values)
61
42
  hash.each_pair do |k, v|
62
- attrs[k.camelize] =
43
+ attrs[k.camelize(:lower)] =
63
44
  if v.is_a? Array
64
- v.map do |element|
65
- { element.class.name.demodulize => element.prepare_keys }
66
- end
45
+ { k.camelize(:lower) => v.map(&:prepare_keys) }
67
46
  elsif v.class.name =~ /OpenPayU::Models/
68
47
  v.prepare_keys
69
48
  else
@@ -13,7 +13,6 @@ module OpenPayU
13
13
  :currency_code, :total_amount, presence: true
14
14
  has_one_object :buyer # not required
15
15
  has_one_object :fee # not required
16
- has_many_objects :pay_methods, :pay_method # not required
17
16
  has_many_objects :products, :product # not required
18
17
  has_many_objects :shipping_methods, :shipping_method # not required
19
18
 
@@ -7,33 +7,11 @@ module OpenPayU
7
7
  :description, :bank_description, :source_account_number
8
8
  validates :description, :order_id, presence: true
9
9
 
10
- def prepare_data(request_type)
11
- if OpenPayU::Configuration.data_format == 'xml'
12
- generate_xml(request_type)
13
- else
14
- {
15
- 'OpenPayU' => {
16
- request_type => {
17
- 'OrderId' => @order_id,
18
- 'Refund' => prepare_keys(instance_values)
19
- }
20
- }
21
- }.to_json
22
- end
23
- end
24
-
25
- def generate_xml(request_type)
26
- '<?xml version="1.0" encoding="UTF-8"?>
27
- <OpenPayU xmlns="http://www.openpayu.com/20/openpayu.xsd">' +
28
- prepare_keys({
29
- 'OrderId' => @order_id,
30
- 'Refund' => prepare_keys(instance_values)
31
- }).to_xml(
32
- builder: OpenPayU::XmlBuilder.new(request_type, indent: 2),
33
- root: request_type,
34
- skip_types: true,
35
- skip_instruct: true
36
- ) + '</OpenPayU>'
10
+ def prepare_data
11
+ {
12
+ 'orderId' => @order_id,
13
+ 'refund' => prepare_keys({} , instance_values.except('order_id'))
14
+ }.to_json
37
15
  end
38
16
 
39
17
  end
@@ -2,8 +2,8 @@
2
2
  module OpenPayU
3
3
  module Models
4
4
  class ShippingMethod < Model
5
- attr_accessor :country, :price, :nazwa
6
- validates :country, :price, :nazwa, presence: true
5
+ attr_accessor :country, :price, :name
6
+ validates :country, :price, :name, presence: true
7
7
  end
8
8
  end
9
9
  end
@@ -12,12 +12,8 @@ module OpenPayU
12
12
  # @return [Documents::Response] Response class object order
13
13
  # with OrderRetrieveResponse
14
14
  def self.retrieve(order_id)
15
- url = Configuration.get_base_url + "order/#{order_id}." +
16
- Configuration.data_format
17
- request = Documents::Request.new(url)
18
15
  Documents::Response.new(
19
- Connection.get(url, request.body, request.headers),
20
- 'OrderRetrieveResponse'
16
+ Connection.get("orders/#{order_id}", nil)
21
17
  )
22
18
  end
23
19
 
@@ -32,12 +28,8 @@ module OpenPayU
32
28
  def self.create(order)
33
29
  @order = Models::Order.new(order)
34
30
  if @order.all_objects_valid?
35
- url = Configuration.get_base_url + 'order.' + Configuration.data_format
36
- request =
37
- Documents::Request.new(@order.prepare_data('OrderCreateRequest'))
38
31
  Documents::Response.new(
39
- Connection.post(url, request.body, request.headers),
40
- 'OrderCreateResponse'
32
+ Connection.post('orders', @order.prepare_data)
41
33
  )
42
34
  else
43
35
  raise WrongOrderParameters.new(@order)
@@ -54,13 +46,8 @@ module OpenPayU
54
46
  # @raise [NotImplementedException] This feature is not yet implemented
55
47
  def self.status_update(status_update)
56
48
  @update = OpenPayU::Models::StatusUpdate.new status_update
57
- url = Configuration.get_base_url + "order/#{@update.order_id}/status." +
58
- Configuration.data_format
59
- request =
60
- Documents::Request.new(@update.prepare_data('OrderStatusUpdateRequest'))
61
49
  Documents::Response.new(
62
- Connection.put(url, request.body, request.headers),
63
- 'OrderStatusUpdateResponse'
50
+ Connection.put("orders/#{@update.order_id}/status", @update.prepare_data)
64
51
  )
65
52
  end
66
53
 
@@ -71,12 +58,8 @@ module OpenPayU
71
58
  # @return [Documents::Response] Response class object order
72
59
  # with OrderCancelResponse
73
60
  def self.cancel(order_id)
74
- url = Configuration.get_base_url + "order/#{order_id}." +
75
- Configuration.data_format
76
- request = Documents::Request.new(url)
77
61
  Documents::Response.new(
78
- Connection.delete(url, request.body, request.headers),
79
- 'OrderCancelResponse'
62
+ Connection.delete("orders/#{order_id}", nil)
80
63
  )
81
64
  end
82
65
 
@@ -89,8 +72,7 @@ module OpenPayU
89
72
  # @raise [WrongNotifyRequest] when generated response is empty
90
73
  def self.consume_notification(request)
91
74
  response = Documents::Response.new(
92
- { response: request, request: nil },
93
- 'OrderNotifyRequest'
75
+ { response: request, request: nil }
94
76
  )
95
77
  if !response.nil?
96
78
  response
@@ -109,9 +91,9 @@ module OpenPayU
109
91
  def self.build_notify_response(request_id)
110
92
  response = Models::NotifyResponse.new({
111
93
  res_id: request_id,
112
- status: { 'StatusCode' => 'SUCCESS' }
94
+ status: { 'statusCode' => 'SUCCESS' }
113
95
  })
114
- response.prepare_data('OrderNotifyResponse')
96
+ response.prepare_data
115
97
  end
116
98
 
117
99
  end
@@ -12,14 +12,8 @@ module OpenPayU
12
12
  # with RefundCreateResponse
13
13
  def self.create(data)
14
14
  refund = Models::Refund.new(data)
15
- url = Configuration.get_base_url + "order/#{refund.order_id}/refund." +
16
- OpenPayU::Configuration.data_format
17
- request = Documents::Request.new(
18
- refund.prepare_data('RefundCreateRequest')
19
- )
20
15
  @response = Documents::Response.new(
21
- Connection.post(url, request.body, request.headers),
22
- 'RefundCreateResponse'
16
+ Connection.post("orders/#{refund.order_id}/refund", refund.prepare_data)
23
17
  )
24
18
  end
25
19
  end
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module OpenPayU
3
- VERSION = '0.0.2'
3
+ VERSION = '0.1.2'
4
4
  end
@@ -22,13 +22,9 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  if RUBY_VERSION < "1.9.3"
25
- spec.add_development_dependency "activemodel", '~> 3.2'
26
- spec.add_development_dependency "activesupport", '~> 3.2'
27
25
  spec.add_runtime_dependency "activemodel", '~> 3.2'
28
26
  spec.add_runtime_dependency "activesupport", '~> 3.2'
29
27
  else
30
- spec.add_development_dependency "activemodel"
31
- spec.add_development_dependency "activesupport"
32
28
  spec.add_runtime_dependency "activemodel"
33
29
  spec.add_runtime_dependency "activesupport"
34
30
  end