mymoip 0.6.2 → 0.7.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +78 -1
- data/lib/mymoip/commission.rb +4 -5
- data/lib/mymoip/credit_card_payment.rb +3 -8
- data/lib/mymoip/exceptions.rb +6 -4
- data/lib/mymoip/formatter.rb +3 -3
- data/lib/mymoip/instruction.rb +47 -20
- data/lib/mymoip/payer.rb +6 -5
- data/lib/mymoip/payment_methods.rb +46 -0
- data/lib/mymoip/payment_slip.rb +74 -0
- data/lib/mymoip/request.rb +1 -1
- data/lib/mymoip/requests/transparent_request.rb +5 -7
- data/lib/mymoip/validators.rb +12 -0
- data/lib/mymoip/version.rb +1 -1
- data/lib/mymoip.rb +3 -1
- data/test/fixtures/fixture.rb +13 -0
- data/test/lib/test_credit_card_payment.rb +2 -9
- data/test/lib/test_instruction.rb +27 -1
- data/test/lib/test_payment_methods.rb +54 -0
- data/test/lib/test_payment_request.rb +2 -2
- data/test/lib/test_payment_slip.rb +78 -0
- data/test/lib/test_validators.rb +13 -0
- metadata +13 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53ae6a3acf07d96de7fdeb44ec9f36da4b4d8302
|
4
|
+
data.tar.gz: 9a35890d9732b300341b60e8184d690b0cf6ca4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d2460af5d3c904b87d6ebe4f3deec91964e00a68331b191265abdedd9be87ca5fcd2e1df50c021bf83e684c541fea1fceed6e29970fadbb258b4b3c083129ef
|
7
|
+
data.tar.gz: 39a6d852ca28a90ab3dbfeee666f912c7eb61dd86ea2fd94f869d7b54968bf29dc1907bef22715f1b462e0458011c5a8410ff0dc9586134526bb5fc07dafddde
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.7.0
|
4
|
+
|
5
|
+
* Allow payments using redirection to Moip's domain. (by @oznek)
|
6
|
+
* Include PaymentSlip configuration class. (by @oznek)
|
7
|
+
* Remove backward compatibility with CreditCardPayment w/o options hash.
|
8
|
+
|
3
9
|
## 0.6.2
|
4
10
|
|
5
11
|
* Removed development dependency of jeweler. Gems are now managed
|
data/README.md
CHANGED
@@ -24,11 +24,13 @@ Any patch are welcome, even removing extra white spaces.
|
|
24
24
|
## First of all
|
25
25
|
|
26
26
|
**Bundler - Gemfile**
|
27
|
+
|
27
28
|
```ruby
|
28
29
|
gem 'mymoip'
|
29
30
|
```
|
30
31
|
|
31
32
|
**Configuration**
|
33
|
+
|
32
34
|
```ruby
|
33
35
|
MyMoip.environment = 'production' # 'sandbox' by default
|
34
36
|
|
@@ -89,6 +91,7 @@ purchase.code # Moip code or nil, depending of the checkout's return
|
|
89
91
|
## The hard way
|
90
92
|
|
91
93
|
**First request: what and from who**
|
94
|
+
|
92
95
|
```ruby
|
93
96
|
payer = MyMoip::Payer.new(
|
94
97
|
id: 'payer_id_defined_by_you',
|
@@ -138,6 +141,7 @@ payment_request.api_call(credit_card_payment,
|
|
138
141
|
```
|
139
142
|
|
140
143
|
**Success?**
|
144
|
+
|
141
145
|
```ruby
|
142
146
|
payment_request.success?
|
143
147
|
```
|
@@ -195,7 +199,7 @@ installments = [
|
|
195
199
|
{ min: 2, max: 12, forward_taxes: true, fee: 1.99 } # 1.99 fee = 1.99% per month
|
196
200
|
]
|
197
201
|
|
198
|
-
MyMoip::Instruction.new(
|
202
|
+
instruction = MyMoip::Instruction.new(
|
199
203
|
id: 'instruction_id_defined_by_you',
|
200
204
|
payment_reason: 'Order in Buy Everything Store',
|
201
205
|
values: [100.0],
|
@@ -206,6 +210,79 @@ MyMoip::Instruction.new(
|
|
206
210
|
|
207
211
|
[More](https://github.com/Irio/mymoip/wiki/Installments-use).
|
208
212
|
|
213
|
+
### Notification and return URLs
|
214
|
+
|
215
|
+
URLs configured at MoIP account can be overrided by passing new URLs values to the instruction object.
|
216
|
+
A notification URL is used for MoIP NASP notification system, responsible for transaction changes signals,
|
217
|
+
and a return URL is used to return to your website when a payment is using external websites.
|
218
|
+
|
219
|
+
```ruby
|
220
|
+
instruction = MyMoip::Instruction.new(
|
221
|
+
id: 'instruction_id_defined_by_you',
|
222
|
+
payment_reason: 'Order in Buy Everything Store',
|
223
|
+
values: [100.0],
|
224
|
+
payer: payer,
|
225
|
+
notification_url: 'https://example.com/payments/notification',
|
226
|
+
return_url: 'https://example.com/payments/return'
|
227
|
+
)
|
228
|
+
```
|
229
|
+
|
230
|
+
### Payment methods configuration
|
231
|
+
|
232
|
+
If you don't need all the payment methods available, you can choose some by configuring
|
233
|
+
PaymentMethods and adding it to the instruction:
|
234
|
+
|
235
|
+
```ruby
|
236
|
+
payment_methods = MyMoip::PaymentMethods.new(
|
237
|
+
payment_slip: false,
|
238
|
+
credit_card: true,
|
239
|
+
debit: true,
|
240
|
+
debit_card: true,
|
241
|
+
financing: true,
|
242
|
+
moip_wallet: true
|
243
|
+
)
|
244
|
+
|
245
|
+
instruction = MyMoip::Instruction.new(
|
246
|
+
id: 'instruction_id_defined_by_you',
|
247
|
+
payment_reason: 'Order in Buy Everything Store',
|
248
|
+
values: [100.0],
|
249
|
+
payer: payer,
|
250
|
+
payment_methods: payment_methods
|
251
|
+
)
|
252
|
+
```
|
253
|
+
|
254
|
+
### Payment slip (aka boleto) configuration
|
255
|
+
|
256
|
+
You can optionally configure your payment slip creating a PaymentSlip and adding to the instruction:
|
257
|
+
|
258
|
+
```ruby
|
259
|
+
payment_slip = MyMoip::PaymentSlip.new(
|
260
|
+
expiration_date: Date.today.next_day.to_datetime,
|
261
|
+
expiration_days: 5,
|
262
|
+
expiration_days_type: :business_day,
|
263
|
+
instruction_line_1: 'This is the first instruction line.',
|
264
|
+
instruction_line_2: 'Please do not pay this slip.',
|
265
|
+
instruction_line_3: 'This is a test! :)',
|
266
|
+
logo_url: 'https://example.com/logo.png'
|
267
|
+
)
|
268
|
+
|
269
|
+
instruction = MyMoip::Instruction.new(
|
270
|
+
id: 'instruction_id_defined_by_you',
|
271
|
+
payment_reason: 'Order in Buy Everything Store',
|
272
|
+
values: [100.0],
|
273
|
+
payer: payer,
|
274
|
+
payment_slip: payment_slip
|
275
|
+
)
|
276
|
+
```
|
277
|
+
|
278
|
+
A payment slip can have the following attributes:
|
279
|
+
|
280
|
+
* expiration_date: a DateTime indicating the last payment date to this slip.
|
281
|
+
* expiration_days: expiration days after which the printed payment slip will be considered expired.
|
282
|
+
* expiration_days_type: type of expiration day, which can be :business_day or :calendar_day.
|
283
|
+
* instruction_line_1, instruction_line_2, instruction_line_3: lines of instruction (up to 63 characters each), added to the payment slip.
|
284
|
+
* logo_url: an URL pointing to an image which will be added to the body of the payment slip.
|
285
|
+
|
209
286
|
## Going alive!
|
210
287
|
|
211
288
|
If you are ready to get your application using MyMoip approved by MoIP or already have valid production keys, you can read a specific [documentation](https://github.com/Irio/mymoip/wiki/Going-alive).
|
data/lib/mymoip/commission.rb
CHANGED
@@ -5,7 +5,7 @@ module MyMoip
|
|
5
5
|
attr_accessor :reason, :receiver_login, :fixed_value, :percentage_value
|
6
6
|
|
7
7
|
validates_presence_of :reason, :receiver_login
|
8
|
-
validates_presence_of :fixed_value,
|
8
|
+
validates_presence_of :fixed_value, if: -> { percentage_value.nil? }
|
9
9
|
validates_presence_of :percentage_value, if: -> { fixed_value.nil? }
|
10
10
|
validates_numericality_of :fixed_value, greater_than_or_equal_to: 0,
|
11
11
|
allow_nil: true
|
@@ -14,10 +14,9 @@ module MyMoip
|
|
14
14
|
allow_nil: true
|
15
15
|
|
16
16
|
def initialize(attrs)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
self.percentage_value = attrs[:percentage_value]
|
17
|
+
attrs.each do |attr, value|
|
18
|
+
public_send(:"#{attr}=", value)
|
19
|
+
end
|
21
20
|
end
|
22
21
|
|
23
22
|
def gross_amount(instruction)
|
@@ -3,18 +3,13 @@ module MyMoip
|
|
3
3
|
attr_accessor :credit_card, :installments
|
4
4
|
|
5
5
|
def initialize(credit_card, opts = {})
|
6
|
-
self.credit_card
|
7
|
-
|
8
|
-
self.installments = if opts.kind_of?(Integer)
|
9
|
-
opts
|
10
|
-
else
|
11
|
-
opts[:installments] || 1
|
12
|
-
end
|
6
|
+
self.credit_card = credit_card
|
7
|
+
self.installments = opts[:installments] || 1
|
13
8
|
end
|
14
9
|
|
15
10
|
def to_json(formatter = MyMoip::Formatter)
|
16
11
|
raise InvalidCreditCard, 'No credit card provided.' if credit_card.nil?
|
17
|
-
raise InvalidCreditCard
|
12
|
+
raise InvalidCreditCard if credit_card.invalid?
|
18
13
|
|
19
14
|
json = {
|
20
15
|
Forma: "CartaoCredito",
|
data/lib/mymoip/exceptions.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module MyMoip
|
2
|
-
class Error < StandardError;
|
2
|
+
class Error < StandardError; end
|
3
3
|
|
4
|
-
class InvalidComission < Error;
|
4
|
+
class InvalidComission < Error; end
|
5
5
|
|
6
|
-
class InvalidCreditCard < Error;
|
6
|
+
class InvalidCreditCard < Error; end
|
7
7
|
|
8
8
|
class InvalidInstruction < Error; end
|
9
9
|
|
10
|
-
class InvalidPayer < Error;
|
10
|
+
class InvalidPayer < Error; end
|
11
|
+
|
12
|
+
class InvalidPaymentSlip < Error; end
|
11
13
|
end
|
data/lib/mymoip/formatter.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module MyMoip
|
2
2
|
class Formatter
|
3
3
|
def self.cep(plain_cep)
|
4
|
-
raise ArgumentError, 'Cannot format CEP nil'
|
4
|
+
raise ArgumentError, 'Cannot format CEP nil' if plain_cep.nil?
|
5
5
|
plain_cep.gsub(/(\d{5})/, '\1-')
|
6
6
|
end
|
7
7
|
|
@@ -11,12 +11,12 @@ module MyMoip
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def self.date(plain_date)
|
14
|
-
raise ArgumentError, 'Cannot format date nil'
|
14
|
+
raise ArgumentError, 'Cannot format date nil' if plain_date.nil?
|
15
15
|
plain_date.strftime("%d/%m/%Y")
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.cpf(plain_cpf)
|
19
|
-
raise ArgumentError, 'Cannot format
|
19
|
+
raise ArgumentError, 'Cannot format CPF nil' if plain_cpf.nil?
|
20
20
|
plain_cpf.gsub(/(\d{3})(\d{3})(\d{3})(\d{2})/, '\1.\2.\3-\4')
|
21
21
|
end
|
22
22
|
end
|
data/lib/mymoip/instruction.rb
CHANGED
@@ -1,35 +1,37 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/validators.rb')
|
1
2
|
module MyMoip
|
2
3
|
class Instruction
|
4
|
+
include Validators
|
3
5
|
include ActiveModel::Validations
|
4
6
|
|
5
7
|
attr_accessor :id, :payment_reason, :values, :payer,
|
6
8
|
:commissions, :fee_payer_login, :payment_receiver_login,
|
7
|
-
:payment_receiver_name
|
9
|
+
:payment_receiver_name, :installments,
|
10
|
+
:notification_url, :return_url,
|
11
|
+
:payment_slip, :payment_methods
|
8
12
|
|
9
13
|
validates_presence_of :id, :payment_reason, :values, :payer
|
10
14
|
validate :commissions_value_must_be_lesser_than_values
|
11
15
|
validate :payment_receiver_presence_in_commissions
|
16
|
+
validate :url_format_validation
|
12
17
|
|
13
18
|
def initialize(attrs)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
self.commissions
|
19
|
-
self.fee_payer_login = attrs[:fee_payer_login]
|
20
|
-
self.payment_receiver_login = attrs[:payment_receiver_login]
|
21
|
-
self.payment_receiver_name = attrs[:payment_receiver_name]
|
22
|
-
self.installments = attrs[:installments]
|
19
|
+
attrs.each do |attr, value|
|
20
|
+
public_send(:"#{attr}=", value)
|
21
|
+
end
|
22
|
+
|
23
|
+
self.commissions ||= []
|
23
24
|
end
|
24
25
|
|
25
26
|
def to_xml(root = nil)
|
26
|
-
raise InvalidPayer
|
27
|
+
raise InvalidPayer if payer.invalid?
|
28
|
+
raise InvalidPaymentSlip if payment_slip and payment_slip.invalid?
|
27
29
|
raise InvalidInstruction if self.invalid?
|
28
30
|
if invalid_commission = commissions.detect { |c| c.invalid? }
|
29
31
|
raise InvalidComission, invalid_commission
|
30
32
|
end
|
31
33
|
|
32
|
-
xml
|
34
|
+
xml = ""
|
33
35
|
root = Builder::XmlMarkup.new(target: xml)
|
34
36
|
|
35
37
|
root.EnviarInstrucao do |n1|
|
@@ -39,24 +41,39 @@ module MyMoip
|
|
39
41
|
@values.each { |v| n3.Valor("%.2f" % v, moeda: "BRL") }
|
40
42
|
end
|
41
43
|
n2.IdProprio(@id)
|
42
|
-
|
44
|
+
|
43
45
|
if @installments
|
44
46
|
n2.Parcelamentos do |n4|
|
45
|
-
@installments.each do |
|
47
|
+
@installments.each do |installments|
|
46
48
|
n4.Parcelamento do |n5|
|
47
|
-
n5.MinimoParcelas
|
48
|
-
n5.MaximoParcelas
|
49
|
-
|
50
|
-
|
49
|
+
n5.MinimoParcelas(installments[:min])
|
50
|
+
n5.MaximoParcelas(installments[:max])
|
51
|
+
if installments[:forward_taxes]
|
52
|
+
n5.Repassar(installments[:forward_taxes])
|
53
|
+
end
|
54
|
+
n5.Juros(installments[:fee])
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
56
|
-
commissions_to_xml
|
57
|
-
payment_receiver_to_xml
|
60
|
+
commissions_to_xml(n2) if commissions.any?
|
61
|
+
payment_receiver_to_xml(n2) if payment_receiver_login
|
58
62
|
|
59
63
|
n2.Pagador { |n3| @payer.to_xml(n3) }
|
64
|
+
|
65
|
+
unless @payment_methods.blank? or @payment_methods.using_all?
|
66
|
+
n2.FormasPagamento { |n3| @payment_methods.to_xml(n3) }
|
67
|
+
end
|
68
|
+
unless @payment_slip.blank?
|
69
|
+
n2.Boleto { |n3| @payment_slip.to_xml(n3) }
|
70
|
+
end
|
71
|
+
unless @notification_url.blank?
|
72
|
+
n2.URLNotificacao(@notification_url)
|
73
|
+
end
|
74
|
+
unless @return_url.blank?
|
75
|
+
n2.URLRetorno(@return_url)
|
76
|
+
end
|
60
77
|
end
|
61
78
|
end
|
62
79
|
|
@@ -100,5 +117,15 @@ module MyMoip
|
|
100
117
|
n.Apelido(payment_receiver_name)
|
101
118
|
end
|
102
119
|
end
|
120
|
+
|
121
|
+
def url_format_validation
|
122
|
+
if not notification_url.blank? and not valid_url?(notification_url)
|
123
|
+
errors.add(:notification_url, 'Invalid URL format')
|
124
|
+
end
|
125
|
+
|
126
|
+
if not return_url.blank? and not valid_url?(return_url)
|
127
|
+
errors.add(:return_url, 'Invalid URL format.')
|
128
|
+
end
|
129
|
+
end
|
103
130
|
end
|
104
131
|
end
|
data/lib/mymoip/payer.rb
CHANGED
@@ -3,17 +3,18 @@ module MyMoip
|
|
3
3
|
include ActiveModel::Validations
|
4
4
|
|
5
5
|
attr_accessor :id, :name, :email,
|
6
|
-
:address_street, :address_street_number,
|
7
|
-
:
|
8
|
-
:
|
6
|
+
:address_street, :address_street_number,
|
7
|
+
:address_street_extra, :address_neighbourhood,
|
8
|
+
:address_city, :address_state, :address_country,
|
9
|
+
:address_cep, :address_phone
|
9
10
|
|
10
11
|
validates_presence_of :id, :name, :email, :address_street,
|
11
12
|
:address_street_number, :address_neighbourhood,
|
12
13
|
:address_city, :address_state, :address_country,
|
13
14
|
:address_cep, :address_phone
|
14
|
-
validates_length_of :address_state,
|
15
|
+
validates_length_of :address_state, is: 2
|
15
16
|
validates_length_of :address_country, is: 3
|
16
|
-
validates_length_of :address_cep,
|
17
|
+
validates_length_of :address_cep, is: 8
|
17
18
|
validates_length_of :address_phone, within: 10..11
|
18
19
|
|
19
20
|
def initialize(attrs)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module MyMoip
|
2
|
+
class PaymentMethods
|
3
|
+
include ActiveModel::Validations
|
4
|
+
|
5
|
+
attr_accessor :payment_slip, :credit_card, :debit, :debit_card, :financing,
|
6
|
+
:moip_wallet
|
7
|
+
|
8
|
+
validates_inclusion_of :payment_slip, :credit_card, :debit, :debit_card,
|
9
|
+
:financing, :moip_wallet, in: [true, false]
|
10
|
+
|
11
|
+
def initialize(attrs = {})
|
12
|
+
self.payment_slip = true
|
13
|
+
self.credit_card = true
|
14
|
+
self.debit = true
|
15
|
+
self.debit_card = true
|
16
|
+
self.financing = true
|
17
|
+
self.moip_wallet = true
|
18
|
+
|
19
|
+
attrs.each do |attr, value|
|
20
|
+
public_send(:"#{attr}=", value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_xml(root = nil)
|
25
|
+
if root.nil?
|
26
|
+
xml = ""
|
27
|
+
root ||= Builder::XmlMarkup.new(target: xml)
|
28
|
+
end
|
29
|
+
|
30
|
+
if not using_all?
|
31
|
+
root.FormaPagamento('BoletoBancario') if payment_slip
|
32
|
+
root.FormaPagamento('CartaoDeCredito') if credit_card
|
33
|
+
root.FormaPagamento('DebitoBancario') if debit
|
34
|
+
root.FormaPagamento('CartaoDeDebito') if debit_card
|
35
|
+
root.FormaPagamento('FinanciamentoBancario') if financing
|
36
|
+
root.FormaPagamento('CarteiraMoIP') if moip_wallet
|
37
|
+
end
|
38
|
+
|
39
|
+
xml
|
40
|
+
end
|
41
|
+
|
42
|
+
def using_all?
|
43
|
+
payment_slip and credit_card and debit and debit_card and financing and moip_wallet
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module MyMoip
|
2
|
+
class PaymentSlip
|
3
|
+
include Validators
|
4
|
+
include ActiveModel::Validations
|
5
|
+
|
6
|
+
attr_accessor :expiration_date, :expiration_days, :expiration_days_type,
|
7
|
+
:instruction_line_1, :instruction_line_2,
|
8
|
+
:instruction_line_3, :logo_url
|
9
|
+
|
10
|
+
validates_length_of :instruction_line_1, maximum: 63, allow_nil: true
|
11
|
+
validates_length_of :instruction_line_2, maximum: 63, allow_nil: true
|
12
|
+
validates_length_of :instruction_line_3, maximum: 63, allow_nil: true
|
13
|
+
|
14
|
+
validates_numericality_of :expiration_days, less_than_or_equal_to: 99,
|
15
|
+
allow_nil: true
|
16
|
+
validates_inclusion_of :expiration_days_type,
|
17
|
+
in: [:business_day, :calendar_day], allow_nil: true
|
18
|
+
|
19
|
+
validate :logo_url_format
|
20
|
+
validate :expiration_date_format
|
21
|
+
|
22
|
+
def initialize(attrs)
|
23
|
+
attrs.each do |attr, value|
|
24
|
+
public_send(:"#{attr}=", value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_xml(root = nil)
|
29
|
+
raise InvalidPaymentSlip if invalid?
|
30
|
+
|
31
|
+
if root.nil?
|
32
|
+
xml = ""
|
33
|
+
root ||= Builder::XmlMarkup.new(target: xml)
|
34
|
+
end
|
35
|
+
|
36
|
+
root.DataVencimento(expiration_date.strftime('%Y-%m-%dT%H:%M:%S.%L%:z')) unless expiration_date.blank?
|
37
|
+
|
38
|
+
if expiration_days
|
39
|
+
type = nil
|
40
|
+
if expiration_days_type
|
41
|
+
if expiration_days_type == :business_day
|
42
|
+
type = {'Tipo' => 'Uteis'}
|
43
|
+
elsif expiration_days_type == :calendar_day
|
44
|
+
type = {'Tipo' => 'Corridos'}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
root.DiasExpiracao(expiration_days, type)
|
49
|
+
end
|
50
|
+
|
51
|
+
root.Instrucao1(instruction_line_1) unless instruction_line_1.blank?
|
52
|
+
root.Instrucao2(instruction_line_2) unless instruction_line_2.blank?
|
53
|
+
root.Instrucao3(instruction_line_3) unless instruction_line_3.blank?
|
54
|
+
|
55
|
+
root.URLLogo(logo_url) unless logo_url.blank?
|
56
|
+
|
57
|
+
xml
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def logo_url_format
|
63
|
+
if not logo_url.blank? and not valid_url?(logo_url)
|
64
|
+
errors.add(:logo_url, 'Invalid URL format.')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def expiration_date_format
|
69
|
+
if not expiration_date.blank? and not expiration_date.instance_of?(DateTime)
|
70
|
+
errors.add(:expiration_date, 'Expiration date must be a DateTime object.')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/mymoip/request.rb
CHANGED
@@ -17,7 +17,7 @@ module MyMoip
|
|
17
17
|
MyMoip.ensure_key_and_token_set!
|
18
18
|
end
|
19
19
|
|
20
|
-
opts[:logger].info
|
20
|
+
opts[:logger].info "New #{self.class} being sent to MoIP."
|
21
21
|
opts[:logger].debug "#{self.class} of ##{@id} with #{params.inspect}"
|
22
22
|
|
23
23
|
url = MyMoip.api_url + params.delete(:path)
|
@@ -17,21 +17,19 @@ module MyMoip
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def success?
|
20
|
-
@response
|
21
|
-
rescue NoMethodError
|
20
|
+
@response["EnviarInstrucaoUnicaResponse"]["Resposta"]["Status"] == "Sucesso"
|
21
|
+
rescue NoMethodError
|
22
22
|
false
|
23
23
|
end
|
24
24
|
|
25
25
|
def token
|
26
|
-
@response["EnviarInstrucaoUnicaResponse"]["Resposta"]["Token"]
|
27
|
-
rescue NoMethodError
|
28
|
-
nil
|
26
|
+
@response["EnviarInstrucaoUnicaResponse"]["Resposta"]["Token"]
|
27
|
+
rescue NoMethodError
|
29
28
|
end
|
30
29
|
|
31
30
|
def id
|
32
31
|
@response["EnviarInstrucaoUnicaResponse"]["Resposta"]["ID"]
|
33
|
-
rescue NoMethodError
|
34
|
-
nil
|
32
|
+
rescue NoMethodError
|
35
33
|
end
|
36
34
|
|
37
35
|
end
|
data/lib/mymoip/version.rb
CHANGED
data/lib/mymoip.rb
CHANGED
@@ -48,8 +48,10 @@ end
|
|
48
48
|
|
49
49
|
$LOAD_PATH << "./lib/mymoip"
|
50
50
|
|
51
|
+
require File.dirname(__FILE__) + "/mymoip/validators.rb"
|
52
|
+
|
51
53
|
files = Dir[File.dirname(__FILE__) + "/mymoip/*.rb"]
|
52
54
|
files.each { |f| require f }
|
53
55
|
|
54
56
|
MyMoip.environment = "sandbox"
|
55
|
-
MyMoip.logger
|
57
|
+
MyMoip.logger = Logger.new(STDOUT)
|
data/test/fixtures/fixture.rb
CHANGED
@@ -53,4 +53,17 @@ class Fixture
|
|
53
53
|
MyMoip::Commission.new(params)
|
54
54
|
end
|
55
55
|
|
56
|
+
def self.payment_slip(params = {})
|
57
|
+
params = {
|
58
|
+
expiration_date: DateTime.new(2020, 1, 1),
|
59
|
+
expiration_days: 7,
|
60
|
+
expiration_days_type: :business_day,
|
61
|
+
instruction_line_1: 'Line 1',
|
62
|
+
instruction_line_2: 'Line 2',
|
63
|
+
instruction_line_3: 'Line 3',
|
64
|
+
logo_url: 'http://www.myurl.com/logo.png'
|
65
|
+
}.merge(params)
|
66
|
+
|
67
|
+
MyMoip::PaymentSlip.new(params)
|
68
|
+
end
|
56
69
|
end
|
@@ -1,13 +1,6 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
2
|
|
3
3
|
class TestCreditCardPayment < Test::Unit::TestCase
|
4
|
-
def test_initialization_and_getters
|
5
|
-
credit_card = Fixture.credit_card
|
6
|
-
subject = MyMoip::CreditCardPayment.new(credit_card, 1)
|
7
|
-
assert_equal credit_card, subject.credit_card
|
8
|
-
assert_equal 1, subject.installments
|
9
|
-
end
|
10
|
-
|
11
4
|
def test_allow_initialization_with_a_hash_of_options
|
12
5
|
credit_card = Fixture.credit_card
|
13
6
|
subject = MyMoip::CreditCardPayment.new(credit_card, installments: 2)
|
@@ -17,13 +10,13 @@ class TestCreditCardPayment < Test::Unit::TestCase
|
|
17
10
|
|
18
11
|
def test_cash_method_with_one_tranch
|
19
12
|
credit_card = Fixture.credit_card
|
20
|
-
subject = MyMoip::CreditCardPayment.new(credit_card, 1)
|
13
|
+
subject = MyMoip::CreditCardPayment.new(credit_card, installments: 1)
|
21
14
|
assert_equal true, subject.cash?
|
22
15
|
end
|
23
16
|
|
24
17
|
def test_cash_method_with_more_than_one_installments
|
25
18
|
credit_card = Fixture.credit_card
|
26
|
-
subject = MyMoip::CreditCardPayment.new(credit_card, 3)
|
19
|
+
subject = MyMoip::CreditCardPayment.new(credit_card, installments: 3)
|
27
20
|
assert_equal false, subject.cash?
|
28
21
|
end
|
29
22
|
|
@@ -14,7 +14,9 @@ class TestInstruction < Test::Unit::TestCase
|
|
14
14
|
fee_payer_login: "fee_payer_login",
|
15
15
|
payment_receiver_login: "payment_receiver_login",
|
16
16
|
payment_receiver_name: "nick_fury",
|
17
|
-
installments: installments
|
17
|
+
installments: installments,
|
18
|
+
notification_url: 'http://please.notify.me',
|
19
|
+
return_url: 'http://return.to.my.address.com'
|
18
20
|
)
|
19
21
|
|
20
22
|
assert_equal "some id", instruction.id
|
@@ -26,6 +28,8 @@ class TestInstruction < Test::Unit::TestCase
|
|
26
28
|
assert_equal "fee_payer_login", instruction.fee_payer_login
|
27
29
|
assert_equal "payment_receiver_login", instruction.payment_receiver_login
|
28
30
|
assert_equal "nick_fury", instruction.payment_receiver_name
|
31
|
+
assert_equal 'http://please.notify.me', instruction.notification_url
|
32
|
+
assert_equal 'http://return.to.my.address.com', instruction.return_url
|
29
33
|
end
|
30
34
|
|
31
35
|
def test_should_generate_a_string_when_converting_to_xml
|
@@ -45,6 +49,18 @@ XML
|
|
45
49
|
assert_equal expected_format.rstrip, instruction.to_xml
|
46
50
|
end
|
47
51
|
|
52
|
+
def test_xml_format_with_urls
|
53
|
+
payer = Fixture.payer
|
54
|
+
instruction = Fixture.instruction(payer: payer)
|
55
|
+
instruction.notification_url = 'http://qwerty.me/nasp'
|
56
|
+
instruction.return_url = 'http://return.to.me'
|
57
|
+
|
58
|
+
expected_format = <<XML
|
59
|
+
<EnviarInstrucao><InstrucaoUnica TipoValidacao=\"Transparente\"><Razao>some payment_reason</Razao><Valores><Valor moeda=\"BRL\">100.00</Valor><Valor moeda=\"BRL\">200.00</Valor></Valores><IdProprio>your_own_instruction_id</IdProprio><Parcelamentos><Parcelamento><MinimoParcelas>2</MinimoParcelas><MaximoParcelas>12</MaximoParcelas><Repassar>true</Repassar><Juros>1.99</Juros></Parcelamento></Parcelamentos><Pagador><Nome>Juquinha da Rocha</Nome><Email>juquinha@rocha.com</Email><IdPagador>your_own_payer_id</IdPagador><EnderecoCobranca><Logradouro>Felipe Neri</Logradouro><Numero>406</Numero><Complemento>Sala 501</Complemento><Bairro>Auxiliadora</Bairro><Cidade>Porto Alegre</Cidade><Estado>RS</Estado><Pais>BRA</Pais><CEP>90440-150</CEP><TelefoneFixo>(51)3040-5060</TelefoneFixo></EnderecoCobranca></Pagador><URLNotificacao>http://qwerty.me/nasp</URLNotificacao><URLRetorno>http://return.to.me</URLRetorno></InstrucaoUnica></EnviarInstrucao>
|
60
|
+
XML
|
61
|
+
assert_equal expected_format.rstrip, instruction.to_xml
|
62
|
+
end
|
63
|
+
|
48
64
|
def test_xml_format_with_installments
|
49
65
|
payer = Fixture.payer
|
50
66
|
installments = [
|
@@ -214,4 +230,14 @@ XML
|
|
214
230
|
assert subject.invalid? && subject.errors[:payer].present?,
|
215
231
|
'should be invalid without a payer'
|
216
232
|
end
|
233
|
+
|
234
|
+
def test_validate_url
|
235
|
+
subject = Fixture.instruction
|
236
|
+
assert subject.valid?
|
237
|
+
|
238
|
+
subject.notification_url = 'ftp://sdfsdfs.com'
|
239
|
+
subject.return_url = 'xxftpsdfsdfs.com'
|
240
|
+
|
241
|
+
assert subject.invalid? && subject.errors[:notification_url].present? && subject.errors[:return_url].present?
|
242
|
+
end
|
217
243
|
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class TestPaymentMethods < Test::Unit::TestCase
|
4
|
+
def test_initialization_and_setters
|
5
|
+
params = {
|
6
|
+
payment_slip: true,
|
7
|
+
credit_card: false,
|
8
|
+
debit: true,
|
9
|
+
debit_card: false,
|
10
|
+
financing: true,
|
11
|
+
moip_wallet: false
|
12
|
+
}
|
13
|
+
|
14
|
+
subject = MyMoip::PaymentMethods.new(params)
|
15
|
+
assert_equal params[:payment_slip], subject.payment_slip
|
16
|
+
assert_equal params[:credit_card], subject.credit_card
|
17
|
+
assert_equal params[:debit], subject.debit
|
18
|
+
assert_equal params[:debit_card], subject.debit_card
|
19
|
+
assert_equal params[:financing], subject.financing
|
20
|
+
assert_equal params[:moip_wallet], subject.moip_wallet
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_validates_boolean
|
24
|
+
subject = MyMoip::PaymentMethods.new
|
25
|
+
assert subject.valid?
|
26
|
+
|
27
|
+
subject.payment_slip = 1
|
28
|
+
subject.credit_card = 1
|
29
|
+
subject.debit = 1
|
30
|
+
subject.debit_card = 1
|
31
|
+
subject.financing = 1
|
32
|
+
subject.moip_wallet = 1
|
33
|
+
|
34
|
+
assert subject.invalid? &&
|
35
|
+
subject.errors[:payment_slip].present? &&
|
36
|
+
subject.errors[:credit_card].present? &&
|
37
|
+
subject.errors[:debit].present? &&
|
38
|
+
subject.errors[:debit_card].present? &&
|
39
|
+
subject.errors[:financing].present? &&
|
40
|
+
subject.errors[:moip_wallet].present?
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_xml_format
|
44
|
+
subject = MyMoip::PaymentMethods.new
|
45
|
+
assert_equal '', subject.to_xml
|
46
|
+
|
47
|
+
subject.payment_slip = false
|
48
|
+
expected_format = <<XML
|
49
|
+
<FormaPagamento>CartaoDeCredito</FormaPagamento><FormaPagamento>DebitoBancario</FormaPagamento><FormaPagamento>CartaoDeDebito</FormaPagamento><FormaPagamento>FinanciamentoBancario</FormaPagamento><FormaPagamento>CarteiraMoIP</FormaPagamento>
|
50
|
+
XML
|
51
|
+
assert_equal expected_format.strip, subject.to_xml
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -75,7 +75,7 @@ class TestPaymentRequest < Test::Unit::TestCase
|
|
75
75
|
VCR.use_cassette('transparent_request') do
|
76
76
|
transparent_request.api_call(instruction)
|
77
77
|
end
|
78
|
-
credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, 1)
|
78
|
+
credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, installments: 1)
|
79
79
|
payment_request = MyMoip::PaymentRequest.new("your_own_id")
|
80
80
|
VCR.use_cassette('payment_request') do
|
81
81
|
payment_request.api_call(credit_card_payment, token: transparent_request.token)
|
@@ -89,7 +89,7 @@ class TestPaymentRequest < Test::Unit::TestCase
|
|
89
89
|
VCR.use_cassette('transparent_request') do
|
90
90
|
transparent_request.api_call(instruction)
|
91
91
|
end
|
92
|
-
credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, 1)
|
92
|
+
credit_card_payment = MyMoip::CreditCardPayment.new(Fixture.credit_card, installments: 1)
|
93
93
|
payment_request = MyMoip::PaymentRequest.new("your_own_id")
|
94
94
|
assert_nil payment_request.code
|
95
95
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class TestPaymentSlip < Test::Unit::TestCase
|
4
|
+
def test_validate_length_of_instruction_lines
|
5
|
+
subject = Fixture.payment_slip()
|
6
|
+
assert subject.valid?
|
7
|
+
|
8
|
+
subject.instruction_line_1 = ('*' * 63)
|
9
|
+
subject.instruction_line_2 = ('*' * 63)
|
10
|
+
subject.instruction_line_3 = ('*' * 63)
|
11
|
+
|
12
|
+
assert subject.valid?
|
13
|
+
|
14
|
+
subject.instruction_line_1 = ('*' * 64)
|
15
|
+
subject.instruction_line_2 = ('*' * 64)
|
16
|
+
subject.instruction_line_3 = ('*' * 64)
|
17
|
+
|
18
|
+
assert subject.invalid?
|
19
|
+
assert subject.errors[:instruction_line_1].present? &&
|
20
|
+
subject.errors[:instruction_line_2].present? &&
|
21
|
+
subject.errors[:instruction_line_3].present?
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_validate_expiration_days
|
25
|
+
subject = Fixture.payment_slip(expiration_days: 99)
|
26
|
+
assert subject.valid?
|
27
|
+
|
28
|
+
subject.expiration_days = 100
|
29
|
+
assert subject.invalid? && subject.errors[:expiration_days].present?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_validate_expiration_type
|
33
|
+
subject = Fixture.payment_slip(expiration_days_type: :calendar_day)
|
34
|
+
assert subject.valid?
|
35
|
+
|
36
|
+
subject.expiration_days_type = :business_day
|
37
|
+
assert subject.valid?
|
38
|
+
|
39
|
+
subject.expiration_days_type = :another_type
|
40
|
+
assert subject.invalid? && subject.errors[:expiration_days_type].present?
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_validate_logo_url
|
44
|
+
subject = Fixture.payment_slip(logo_url: 'http://www.uol.com.br')
|
45
|
+
assert subject.valid?
|
46
|
+
|
47
|
+
subject.logo_url = 'https://www.google.com/sdfsdf.png'
|
48
|
+
assert subject.valid?
|
49
|
+
|
50
|
+
subject.logo_url = 'file://www.google.com/sdfsdf.png'
|
51
|
+
assert subject.invalid? && subject.errors[:logo_url].present?
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_validate_expiration_date_format
|
55
|
+
subject = Fixture.payment_slip(expiration_date: DateTime.new)
|
56
|
+
assert subject.valid?
|
57
|
+
|
58
|
+
subject.expiration_date = Date.new
|
59
|
+
assert subject.invalid? && subject.errors[:expiration_date].present?
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_xml_format
|
63
|
+
subject = Fixture.payment_slip()
|
64
|
+
expected_format = <<XML
|
65
|
+
<DataVencimento>2020-01-01T00:00:00.000+00:00</DataVencimento><DiasExpiracao Tipo="Uteis">7</DiasExpiracao><Instrucao1>Line 1</Instrucao1><Instrucao2>Line 2</Instrucao2><Instrucao3>Line 3</Instrucao3><URLLogo>http://www.myurl.com/logo.png</URLLogo>
|
66
|
+
XML
|
67
|
+
assert_equal expected_format.rstrip, subject.to_xml
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_xml_method_raises_exception_when_called_with_invalid_params
|
71
|
+
subject = Fixture.payment_slip
|
72
|
+
subject.stubs(:invalid?).returns(true)
|
73
|
+
assert_raise MyMoip::InvalidPaymentSlip do
|
74
|
+
subject.to_xml
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class TestValidators < Test::Unit::TestCase
|
4
|
+
include MyMoip::Validators
|
5
|
+
|
6
|
+
def test_valid_url_validator
|
7
|
+
assert_equal valid_url?('http://valid.url.me'), true
|
8
|
+
assert_equal valid_url?('https://valid.url.me'), true
|
9
|
+
assert_equal valid_url?('ftp://valid.url.me'), false
|
10
|
+
assert_equal valid_url?('valid.url.me'), false
|
11
|
+
assert_equal valid_url?('me'), false
|
12
|
+
end
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mymoip
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Irio Irineu Musskopf Junior
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -160,10 +160,13 @@ files:
|
|
160
160
|
- lib/mymoip/instruction.rb
|
161
161
|
- lib/mymoip/json_parser.rb
|
162
162
|
- lib/mymoip/payer.rb
|
163
|
+
- lib/mymoip/payment_methods.rb
|
164
|
+
- lib/mymoip/payment_slip.rb
|
163
165
|
- lib/mymoip/purchase.rb
|
164
166
|
- lib/mymoip/request.rb
|
165
167
|
- lib/mymoip/requests/payment_request.rb
|
166
168
|
- lib/mymoip/requests/transparent_request.rb
|
169
|
+
- lib/mymoip/validators.rb
|
167
170
|
- lib/mymoip/version.rb
|
168
171
|
- mymoip.gemspec
|
169
172
|
- test/fixtures/fixture.rb
|
@@ -177,10 +180,13 @@ files:
|
|
177
180
|
- test/lib/test_instruction.rb
|
178
181
|
- test/lib/test_mymoip.rb
|
179
182
|
- test/lib/test_payer.rb
|
183
|
+
- test/lib/test_payment_methods.rb
|
180
184
|
- test/lib/test_payment_request.rb
|
185
|
+
- test/lib/test_payment_slip.rb
|
181
186
|
- test/lib/test_purchase.rb
|
182
187
|
- test/lib/test_request.rb
|
183
188
|
- test/lib/test_transparent_request.rb
|
189
|
+
- test/lib/test_validators.rb
|
184
190
|
- test/live_test.rb
|
185
191
|
- test/test_helper.rb
|
186
192
|
homepage: https://github.com/Irio/mymoip
|
@@ -203,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
209
|
version: '0'
|
204
210
|
requirements: []
|
205
211
|
rubyforge_project:
|
206
|
-
rubygems_version: 2.0.
|
212
|
+
rubygems_version: 2.0.3
|
207
213
|
signing_key:
|
208
214
|
specification_version: 4
|
209
215
|
summary: MoIP transactions in a gem to call your own.
|
@@ -219,9 +225,13 @@ test_files:
|
|
219
225
|
- test/lib/test_instruction.rb
|
220
226
|
- test/lib/test_mymoip.rb
|
221
227
|
- test/lib/test_payer.rb
|
228
|
+
- test/lib/test_payment_methods.rb
|
222
229
|
- test/lib/test_payment_request.rb
|
230
|
+
- test/lib/test_payment_slip.rb
|
223
231
|
- test/lib/test_purchase.rb
|
224
232
|
- test/lib/test_request.rb
|
225
233
|
- test/lib/test_transparent_request.rb
|
234
|
+
- test/lib/test_validators.rb
|
226
235
|
- test/live_test.rb
|
227
236
|
- test/test_helper.rb
|
237
|
+
has_rdoc:
|