upay 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +3 -0
  3. data/.gitignore +16 -0
  4. data/.rspec +3 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +21 -0
  8. data/Gemfile +6 -0
  9. data/Guardfile +70 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +39 -0
  12. data/Rakefile +11 -0
  13. data/examples/capture_and_authorize.rb +90 -0
  14. data/examples/get_a_customer.rb +14 -0
  15. data/lib/upay/address/address.rb +53 -0
  16. data/lib/upay/address/billing_address.rb +13 -0
  17. data/lib/upay/address/shipping_address.rb +13 -0
  18. data/lib/upay/configure.rb +28 -0
  19. data/lib/upay/credit_card.rb +131 -0
  20. data/lib/upay/customer.rb +161 -0
  21. data/lib/upay/order.rb +56 -0
  22. data/lib/upay/payment.rb +15 -0
  23. data/lib/upay/people/buyer.rb +33 -0
  24. data/lib/upay/people/payer.rb +30 -0
  25. data/lib/upay/people/person.rb +37 -0
  26. data/lib/upay/plan.rb +145 -0
  27. data/lib/upay/report.rb +22 -0
  28. data/lib/upay/requestor.rb +90 -0
  29. data/lib/upay/signature.rb +26 -0
  30. data/lib/upay/subscription.rb +94 -0
  31. data/lib/upay/token.rb +98 -0
  32. data/lib/upay/transaction.rb +137 -0
  33. data/lib/upay/version.rb +3 -0
  34. data/lib/upay.rb +86 -0
  35. data/spec/factories/address.rb +36 -0
  36. data/spec/factories/credit_card.rb +22 -0
  37. data/spec/factories/customer.rb +12 -0
  38. data/spec/factories/order.rb +13 -0
  39. data/spec/factories/people.rb +29 -0
  40. data/spec/factories/plan.rb +26 -0
  41. data/spec/factories/token.rb +18 -0
  42. data/spec/factories/transaction.rb +16 -0
  43. data/spec/lib/upay/address/address_spec.rb +34 -0
  44. data/spec/lib/upay/address/billing_address_spec.rb +34 -0
  45. data/spec/lib/upay/address/shipping_address_spec.rb +34 -0
  46. data/spec/lib/upay/credit_card_spec.rb +39 -0
  47. data/spec/lib/upay/customer_spec.rb +18 -0
  48. data/spec/lib/upay/order_spec.rb +29 -0
  49. data/spec/lib/upay/people/buyer_spec.rb +19 -0
  50. data/spec/lib/upay/people/payer_spec.rb +19 -0
  51. data/spec/lib/upay/people/person_spec.rb +19 -0
  52. data/spec/lib/upay/plan_spec.rb +54 -0
  53. data/spec/lib/upay/token_spec.rb +33 -0
  54. data/spec/lib/upay/transaction_spec.rb +39 -0
  55. data/spec/lib/upay_spec.rb +5 -0
  56. data/spec/spec_helper.rb +123 -0
  57. data/spec/support/factory_girl.rb +5 -0
  58. data/upay.gemspec +47 -0
  59. metadata +361 -0
@@ -0,0 +1,161 @@
1
+ module Upay
2
+ class Customer
3
+
4
+ def initialize(args = {})
5
+ reload(args)
6
+ end
7
+
8
+ def reload(args = {})
9
+ args.each do |k,v|
10
+ instance_variable_set("@#{k}", v)
11
+ if k == "creditCards"
12
+ ccs = []
13
+ v.each do |c|
14
+ puts c
15
+ ccs << CreditCard.new(c)
16
+ end
17
+ instance_variable_set("@#{k}", ccs)
18
+ end
19
+ end
20
+ end
21
+
22
+ def fullName; @fullName end
23
+ def fullName=(fullName)
24
+ @fullName = fullName
25
+ end
26
+
27
+ def email; @email end
28
+ def email=(email)
29
+ @email = email
30
+ end
31
+
32
+ def id; @id end
33
+ def id=(id)
34
+ @id = id
35
+ end
36
+
37
+ def customerId; @customerId end
38
+ def customerId=(customerId)
39
+ @customerId = customerId
40
+ end
41
+
42
+ def subscription; @subscription end
43
+ def subscription=(subscription)
44
+ @subscription = subscription
45
+ end
46
+
47
+ def creditCards; @creditCards end
48
+ def creditCards=(creditCards = {}) @creditCards = creditCards end
49
+
50
+ def valid?
51
+ validator = CustomerValidator.new
52
+ validator.valid?(self)
53
+ end
54
+
55
+ #Verb: POST
56
+ #Description:
57
+ #Returns: JSON
58
+ def create
59
+ url = "rest/v4.3/customers"
60
+ hash_for_create = self.to_hash
61
+ response = Requestor.new.post(url, {:fullName => self.fullName, :email => self.email})
62
+ self.customerId = response["id"]
63
+ self.id = response["id"]
64
+ self
65
+ end
66
+
67
+ #Verb: UPDATE
68
+ #Description:
69
+ #Returns: JSON
70
+ def update
71
+ url = "rest/v4.3/customers/#{self.customerId}"
72
+ Requestor.new.put(url, {:fullName => self.fullName, :email => self.email})
73
+ end
74
+
75
+ #Verb: GET
76
+ #Description:
77
+ #Returns: JSON
78
+ def show
79
+ begin
80
+ unless self.customerId.nil?
81
+ url = "rest/v4.3/customers/#{self.customerId}"
82
+ response = Requestor.new.get(url, {})
83
+ self.reload(response)
84
+ else
85
+ raise "customerId cannot be blank"
86
+ end
87
+ end
88
+ self
89
+ end
90
+
91
+ #Verb: GET
92
+ #Description:
93
+ #Returns: JSON
94
+ def all
95
+ url = "rest/v4.3/customers/"
96
+ customers = []
97
+ list_of_customers = Requestor.new.get(url, {})
98
+ if list_of_customers["customerList"] && list_of_customers["customerList"].count > 0
99
+ customers = list_of_customers["customerList"].map{|x| Customer.new(x) }
100
+ end
101
+ customers
102
+ end
103
+
104
+ #Verb: DELETE
105
+ #Description:
106
+ #Returns: JSON
107
+ def delete
108
+ url = "rest/v4.3/customers/#{self.customerId}"
109
+ Requestor.new.delete(url, {})
110
+ end
111
+
112
+ #Subscriptions Thingys
113
+
114
+ def subscription
115
+ response = self.show
116
+ if response["subscriptions"]
117
+ self.subscription = Subscription.new({:id => response["subscriptions"].last["id"]})
118
+ else
119
+ {}
120
+ end
121
+
122
+ end
123
+
124
+ def has_subscription?(planCode)
125
+ response = self.show
126
+ it_has = false
127
+ unless response["subscriptions"].blank?
128
+ response["subscriptions"].each do |subscription|
129
+ if subscription["plan"]["planCode"] == planCode
130
+ it_has = true
131
+ end
132
+ end
133
+ end
134
+ it_has
135
+ end
136
+
137
+ def has_subscriptions?
138
+ response = self.show
139
+ unless response["subscriptions"].blank?
140
+ response["subscriptions"].count > 0
141
+ else
142
+ false
143
+ end
144
+ end
145
+
146
+ def to_hash
147
+ {
148
+ :customerId => self.customerId || nil,
149
+ :fullName => self.fullName,
150
+ :email => self.email
151
+ }
152
+ end
153
+ end
154
+
155
+ class CustomerValidator
156
+ include Veto.validator
157
+
158
+ validates :fullName, :presence => true
159
+ validates :email, :presence => true
160
+ end
161
+ end
data/lib/upay/order.rb ADDED
@@ -0,0 +1,56 @@
1
+ module Upay
2
+ class Order
3
+ def initialize(args = {})
4
+ args.each do |k,v|
5
+ instance_variable_set("@#{k}", v)
6
+ end
7
+ instance_variable_set("@accountId", Upay.account_id)
8
+ instance_variable_set("@language", Upay.lang)
9
+ instance_variable_set("@notifyUrl", Upay.notifyUrl)
10
+ end
11
+
12
+ def accountId; @accountId end
13
+ def language; @language end
14
+ def notifyUrl; @notifyUrl end
15
+
16
+ def additionalValues; @additionalValues end
17
+ def additionalValues=(additionalValues = {}); @additionalValues end
18
+
19
+
20
+ def referenceCode; @referenceCode end
21
+ def referenceCode=(referenceCode = nil) @referenceCode = referenceCode; end
22
+
23
+ def description; @description end
24
+ def description=(description = nil) @description = description; end
25
+
26
+ def signature; @signature end
27
+ def signature=(signature = nil) @signature = signature; end
28
+
29
+ def buyer; @buyer end
30
+ def buyer=(buyer = {}) @buyer = buyer; end
31
+
32
+ def shippingAddress; @shippingAddress end
33
+ def shippingAddress=(shippingAddress = {}) @shippingAddress = shippingAddress; end
34
+
35
+ def valid?
36
+ validator = OrderValidator.new
37
+ validator.valid?(self)
38
+ end
39
+
40
+ def to_hash
41
+ order_hash = self.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@").to_sym] = self.instance_variable_get(var)}
42
+ order_hash[:buyer] = self.buyer.to_hash if self.buyer
43
+ order_hash[:shippingAddress] = self.shippingAddress.to_hash if self.shippingAddress
44
+ order_hash
45
+ end
46
+ end
47
+
48
+ class OrderValidator
49
+ include Veto.validator
50
+
51
+ validates :referenceCode, presence: true
52
+ validates :description, presence: true
53
+ validates :signature, presence: true
54
+ validates :buyer, presence: true
55
+ end
56
+ end
@@ -0,0 +1,15 @@
1
+ module Upay
2
+ class Payment
3
+ def ping_payments
4
+ Requestor.new.request(PAYMENTS_API_URL, "PING")
5
+ end
6
+
7
+ def get_payment_methods
8
+ Requestor.new.request(PAYMENTS_API_URL, "GET_PAYMENT_METHODS")
9
+ end
10
+
11
+ def submit_transaction(payload)
12
+ Requestor.new.request(PAYMENTS_API_URL, "SUBMIT_TRANSACTION", payload)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ module Upay
2
+ module People
3
+ class Buyer < Person
4
+
5
+ def id; @id end
6
+ def id=(id = nil) @id = id; end
7
+
8
+ def merchantBuyerId; @merchantBuyerId || @id end
9
+ def merchantBuyerId=(merchantBuyerId = nil) @merchantBuyerId = merchantBuyerId; end
10
+
11
+ def dniNumber; @dniNumber end
12
+ def dniNumber=(dniNumber = nil) @dniNumber = dniNumber; end
13
+
14
+ def shippingAddress; @shippingAddress end
15
+ def shippingAddress=(shippingAddress = nil) @shippingAddress = shippingAddress; end
16
+
17
+ def valid?
18
+ validator = BuyerValidator.new
19
+ validator.valid?(self)
20
+ end
21
+
22
+ def to_hash
23
+ person_hash = self.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@").to_sym] = self.instance_variable_get(var)}
24
+ person_hash[:shippingAddress] = self.shippingAddress.to_hash if self.shippingAddress
25
+ person_hash
26
+ end
27
+
28
+ end
29
+
30
+ class BuyerValidator < PersonValidator
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ module Upay
2
+ module People
3
+ class Payer < Person
4
+
5
+ def id; @id end
6
+ def id=(id = nil) @id = id; end
7
+
8
+ def merchantPayerId; @merchantPayerId || @id end
9
+ def merchantPayerId=(merchantPayerId = nil) @merchantPayerId = merchantPayerId; end
10
+
11
+ def billingAddress; @billingAddress end
12
+ def billingAddress=(billingAddress = nil) @billingAddress = billingAddress; end
13
+
14
+ def valid?
15
+ validator = PayerValidator.new
16
+ validator.valid?(self)
17
+ end
18
+
19
+ def to_hash
20
+ person_hash = self.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@").to_sym] = self.instance_variable_get(var)}
21
+ person_hash[:billingAddress] = self.billingAddress.to_hash if self.billingAddress
22
+ person_hash
23
+ end
24
+
25
+ end
26
+
27
+ class PayerValidator < PersonValidator
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module Upay
2
+ module People
3
+ class Person
4
+ def initialize(args = {})
5
+ args.each do |k,v|
6
+ instance_variable_set("@#{k}", v)
7
+ end
8
+ end
9
+
10
+ def fullName; @fullName end
11
+ def fullName=(fullName) @fullName = fullName end
12
+
13
+ def emailAddress; @emailAddress end
14
+ def emailAddress=(emailAddress) @emailAddress = emailAddress end
15
+
16
+ def contactPhone; @contactPhone end
17
+ def contactPhone=(contactPhone) @contactPhone = contactPhone; end
18
+
19
+ def valid?
20
+ validator = PersonValidator.new
21
+ validator.valid?(self)
22
+ end
23
+
24
+ def to_hash
25
+ person_hash = self.instance_variables.each_with_object({}) { |var,hash| hash[var.to_s.delete("@").to_sym] = self.instance_variable_get(var)}
26
+ end
27
+ end
28
+
29
+ class PersonValidator
30
+ include Veto.validator
31
+
32
+ validates :fullName, presence: true
33
+ validates :emailAddress, presence: true
34
+
35
+ end
36
+ end
37
+ end
data/lib/upay/plan.rb ADDED
@@ -0,0 +1,145 @@
1
+ module Upay
2
+ class Plan
3
+ def initialize(args = {})
4
+ args.each do |k,v|
5
+ instance_variable_set("@#{k}", v) unless v.nil?
6
+ end
7
+ end
8
+
9
+ def accountId; @accountId end
10
+ def accountId=(accountId)
11
+ @accountId = accountId
12
+ end
13
+
14
+ def planCode; @planCode end
15
+ def planCode=(planCode)
16
+ @planCode = planCode
17
+ end
18
+
19
+ def description; @description end
20
+ def description=(description)
21
+ @description = description
22
+ end
23
+
24
+ def interval; @interval end
25
+ def interval=(interval)
26
+ @interval = interval
27
+ end
28
+
29
+ def value; @value end
30
+ def value=(value)
31
+ @value = value
32
+ end
33
+
34
+ def currency; @currency end
35
+ def currency=(currency)
36
+ @currency = currency
37
+ end
38
+
39
+ def intervalCount; @intervalCount end
40
+ def intervalCount=(intervalCount)
41
+ @intervalCount = intervalCount
42
+ end
43
+
44
+ def maxPaymentsAllowed; @maxPaymentsAllowed end
45
+ def maxPaymentsAllowed=(maxPaymentsAllowed)
46
+ @maxPaymentsAllowed = maxPaymentsAllowed
47
+ end
48
+
49
+ def paymentAttempsDelay; @paymentAttempsDelay end
50
+ def paymentAttempsDelay=(paymentAttempsDelay)
51
+ @paymentAttempsDelay = paymentAttempsDelay
52
+ end
53
+
54
+ def additionalValues; @additionalValues end
55
+ def additionalValues=(additionalValues)
56
+ @additionalValues = additionalValues
57
+ end
58
+
59
+ def trialDays; @trialDays end
60
+ def trialDays=(trialDays)
61
+ @trialDays = trialDays
62
+ end
63
+
64
+ def valid?
65
+ validator = PlanValidator.new
66
+ validator.valid?(self)
67
+ end
68
+
69
+ #Verb: POST
70
+ #Description:
71
+ #Returns: JSON
72
+ def create
73
+ url = "rest/v4.3/plans"
74
+ Requestor.new.post(url, self.to_hash)
75
+
76
+ end
77
+
78
+ #Verb: UPDATE
79
+ #Description:
80
+ #Returns: JSON
81
+ def update
82
+ url = "rest/v4.3/plans/#{self.planCode}"
83
+ Requestor.new.put(url, self.to_hash)
84
+ end
85
+
86
+ #Verb: POST
87
+ #Description:
88
+ #Returns: JSON
89
+ def show
90
+ url = "rest/v4.3/plans/#{self.planCode}"
91
+ Requestor.new.get(url, self.to_hash)
92
+ end
93
+
94
+ def find_by_name(name)
95
+ url = "rest/v4.3/plans/"
96
+ request = Requestor.new.get(url, {})
97
+ obtained_plan = {}
98
+ request["subscriptionPlanList"].each do |plan|
99
+ obtained_plan = plan if plan["planCode"] == name
100
+ end
101
+ obtained_plan
102
+ end
103
+
104
+ #Verb: DELETE
105
+ #Description:
106
+ #Returns: JSON
107
+ def delete
108
+ url = "rest/v4.3/plans/#{self.planCode}"
109
+ Requestor.new.delete(url, self.to_hash)
110
+ end
111
+
112
+ def to_hash
113
+ {
114
+ :accountId => self.accountId || nil,
115
+ :planCode => self.planCode,
116
+ :description => self.description,
117
+ :interval => self.interval,
118
+ :intervalCount => self.intervalCount,
119
+ :maxPaymentsAllowed => self.maxPaymentsAllowed || nil,
120
+ :paymentAttemptsDelay => "1",
121
+ :additionalValues => [
122
+ {
123
+ :name => "PLAN_VALUE",
124
+ :value => self.value,
125
+ :currency => "COP"
126
+ }
127
+ ]
128
+ }
129
+ end
130
+ end
131
+
132
+ class PlanValidator
133
+ include Veto.validator
134
+
135
+ validates :accountId, presence: true
136
+ validates :planCode, presence: true
137
+ validates :description, presence: true
138
+ validates :interval, presence: true
139
+ validates :value, presence: true
140
+ validates :currency, presence: true
141
+ validates :intervalCount, presence: true
142
+ validates :additionalValues, presence: true
143
+ validates :trialDays, presence: true
144
+ end
145
+ end
@@ -0,0 +1,22 @@
1
+ module Upay
2
+ class Report
3
+ def ping
4
+ Requestor.new.request(REPORTS_API_URL, "PING")
5
+ end
6
+
7
+ def order_detail(order_id)
8
+ payload = { "details" => { "orderId" => order_id } }
9
+ Requestor.new.request(REPORTS_API_URL, "ORDER_DETAIL", payload)
10
+ end
11
+
12
+ def order_detail_by_reference_code(reference_code)
13
+ payload = { "details" => { "referenceCode" => reference_code } }
14
+ Requestor.new.request(REPORTS_API_URL, "ORDER_DETAIL_BY_REFERENCE_CODE", payload)
15
+ end
16
+
17
+ def transaction_response_detail(transaction_id)
18
+ payload = { "details" => { "transactionId" => transaction_id } }
19
+ Requestor.new.request(REPORTS_API_URL, "TRANSACTION_RESPONSE_DETAIL", payload)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,90 @@
1
+ module Upay
2
+ class Requestor
3
+
4
+ def rest
5
+ api_uri = (Upay.test) ? 'https://stg.api.payulatam.com/payments-api/' : "https://api.payulatam.com/payments-api/"
6
+ @rest = Faraday.new(:url => api_uri, :ssl => {:verify => false}, headers: { accept: 'application/json', :"Content-Type" => 'application/json; charset=utf-8' }) do |faraday|
7
+ faraday.response :logger if Upay.logger == true
8
+ faraday.response :json, :content_type => /\b(json|json-home)$/
9
+ faraday.adapter Faraday.default_adapter
10
+ end
11
+ @rest.basic_auth Upay.api_login, Upay.api_key
12
+ @rest
13
+ end
14
+
15
+ def request(url, command, data={})
16
+ api_uri = URI.parse("https://#{'stg.' if Upay.test}api.payulatam.com")
17
+
18
+ http = Net::HTTP.new(api_uri.host, api_uri.port)
19
+ http.use_ssl = true
20
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
21
+
22
+ data["merchant"] = {
23
+ "apiKey" => Upay.api_key,
24
+ "apiLogin" => Upay.api_login
25
+ }
26
+
27
+ data["command"] = command
28
+ data["test"] = Upay.test || false
29
+ data["language"] = "es" || Upay.lang
30
+
31
+ headers = {
32
+ "Accept" => "application/json",
33
+ "Content-Type" => "application/json; charset=utf-8"
34
+ }
35
+
36
+ result = http.send_request("POST", url, data.to_json, headers)
37
+
38
+ begin
39
+ response = JSON.parse(result.body)
40
+ rescue Exception => e
41
+ response = result.body
42
+ end
43
+
44
+ return {
45
+ "status" => result.code,
46
+ "response" => response
47
+ }
48
+ end
49
+
50
+ def get url, data = {}
51
+ request = self.rest.get do |req|
52
+ req.url "#{url}"
53
+ req.headers['Accept'] = 'application/json'
54
+ req.headers['Content-Type'] = 'application/json; charset=utf-8'
55
+ req.body = data.to_json
56
+ end
57
+ return request.body
58
+ end
59
+
60
+ def post url, data = {}
61
+ request = self.rest.post do |req|
62
+ req.url "#{url}"
63
+ req.headers['Accept'] = 'application/json'
64
+ req.headers['Content-Type'] = 'application/json; charset=utf-8'
65
+ req.body = data.to_json
66
+ end
67
+ return request.body
68
+ end
69
+
70
+ def delete url, data = {}
71
+ request = self.rest.delete do |req|
72
+ req.url "#{url}"
73
+ req.headers['Accept'] = 'application/json'
74
+ req.headers['Content-Type'] = 'application/json; charset=utf-8'
75
+ req.body = data.to_json
76
+ end
77
+ return request.body
78
+ end
79
+
80
+ def put url, data = {}
81
+ request = self.rest.put do |req|
82
+ req.url "#{url}"
83
+ req.headers['Accept'] = 'application/json'
84
+ req.headers['Content-Type'] = 'application/json; charset=utf-8'
85
+ req.body = data.to_json
86
+ end
87
+ return request.body
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,26 @@
1
+ module Upay
2
+ class Signature
3
+ def initialize(args = {})
4
+ args.each do |k,v|
5
+ instance_variable_set("@#{k}", v)
6
+ end
7
+ end
8
+
9
+ def transaction_reference; @transaction_reference end
10
+ def transaction_reference=(transaction_reference = nil) @transaction_reference = transaction_reference; end
11
+
12
+ def transaction_value; @transaction_value end
13
+ def transaction_value=(transaction_value = nil) @transaction_value = transaction_value; end
14
+
15
+ def currency; @currency end
16
+ def currency=(currency = nil) @currency = currency; end
17
+
18
+ def signature
19
+ @signature ||= "#{Upay.api_key}~#{Upay.merchant_id}~#{self.transaction_reference}~#{self.transaction_value}~#{self.currency}"
20
+ end
21
+
22
+ def signature_digest
23
+ Digest::MD5.hexdigest(self.signature)
24
+ end
25
+ end
26
+ end