conekta 0.5.2 → 0.5.3
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 +8 -8
- data/.rspec +1 -0
- data/CHANGELOG +5 -1
- data/README.md +13 -4
- data/conekta.gemspec +3 -1
- data/lib/conekta.rb +11 -0
- data/lib/conekta/error.rb +29 -29
- data/lib/conekta/requestor.rb +45 -29
- data/lib/conekta/version.rb +1 -1
- data/spec/conekta/charge_spec.rb +90 -0
- data/spec/conekta/customer_spec.rb +142 -0
- data/spec/conekta/error_spec.rb +67 -0
- data/spec/conekta/event_spec.rb +12 -0
- data/spec/conekta/payee_spec.rb +56 -0
- data/spec/conekta/payout_spec.rb +59 -0
- data/spec/conekta/plan_spec.rb +52 -0
- data/spec/conekta/token_spec.rb +4 -0
- data/spec/conekta/webhook_spec.rb +33 -0
- data/spec/conekta_spec.rb +15 -410
- data/spec/spec_helper.rb +2 -1
- metadata +45 -10
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDNkOGU4MDA2NzIwODAzMGI0ZjE1NDY5ZmVjNGI3MDVmZjBiYmZjZQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2FhMjIxMzYxNjM0Y2I4MzI1YjA1ZDk2NjE0OWE4OThlYjc3ZGEzZg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MThjMjQ0OGIyODNmYWUxMzUxZTczNjQ3N2ExYmYxMWYyYzIyMmUwNDUzY2Ux
|
10
|
+
ZmM3NjBjMWVhYjRjNjYzYzYzOGMzNjAyMmNmMzVhZjFkNjE2NWRlMTAzNGFh
|
11
|
+
NTkwZjBhMTcwYmU4MDNkZmY2M2RkN2ZlOTk5ZmIxOTc0MjQyN2I=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ODc1MTU3ZWViM2RiOWExMjBkZjYxMzIzYmFkNjEzNzRhYWI2ZDM2ZDIzMWNh
|
14
|
+
OWY3ZmViMTYyZDNmMDA4MThlMDM0ZGZkOGYwNmQ3ZDBjM2M1NGZhOGE3NTM4
|
15
|
+
YjM0OTgxZGI4MGEyNDAxNzljNzhmYzJhNzMwYzFkOTg2NWJlMTY=
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/CHANGELOG
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|

|
2
2
|
|
3
|
-
# Conekta Ruby v.0.
|
3
|
+
# Conekta Ruby v.0.5.2
|
4
4
|
|
5
5
|
This is a ruby library that allows interaction with https://api.conekta.io API.
|
6
6
|
|
@@ -20,11 +20,20 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
```ruby
|
23
|
+
# Set your configuration variables
|
24
|
+
|
23
25
|
# This change the Accept-Language Header to the locale specified
|
24
26
|
Conekta.locale = :es
|
25
|
-
|
27
|
+
|
26
28
|
Conekta.api_key = '1tv5yJp3xnVZ7eK67m4h'
|
27
|
-
|
29
|
+
|
30
|
+
# Or via an initializer in config/initializers/conekta.rb
|
31
|
+
Conekta.config do |c|
|
32
|
+
c.locale = :es
|
33
|
+
c.api_key = '1tv5yJp3xnVZ7eK67m4h'
|
34
|
+
c.api_version = '1.0.0'
|
35
|
+
end
|
36
|
+
|
28
37
|
begin
|
29
38
|
charge = Conekta::Charge.create({
|
30
39
|
amount: 51000,
|
@@ -40,7 +49,7 @@ begin
|
|
40
49
|
rescue Conekta::ProcessingError => e
|
41
50
|
puts e.message
|
42
51
|
#la tarjeta no pudo ser procesada
|
43
|
-
rescue Conekta::Error
|
52
|
+
rescue Conekta::Error => e
|
44
53
|
puts e.message
|
45
54
|
#un error ocurrió que no sucede en el flujo normal de cobros como por ejemplo un auth_key incorrecto
|
46
55
|
end
|
data/conekta.gemspec
CHANGED
@@ -20,8 +20,10 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_dependency "rake"
|
23
|
-
spec.add_development_dependency "rspec"
|
24
23
|
spec.add_dependency "faraday"
|
25
24
|
spec.add_dependency "json"
|
26
25
|
spec.add_dependency "sys-uname"
|
26
|
+
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
28
|
+
spec.add_development_dependency "pry"
|
27
29
|
end
|
data/lib/conekta.rb
CHANGED
@@ -38,27 +38,38 @@ module Conekta
|
|
38
38
|
@api_version = '1.0.0'
|
39
39
|
@locale = 'es'
|
40
40
|
|
41
|
+
def self.config
|
42
|
+
yield self
|
43
|
+
end
|
44
|
+
|
41
45
|
def self.api_base
|
42
46
|
@api_base
|
43
47
|
end
|
48
|
+
|
44
49
|
def self.api_base=(api_base)
|
45
50
|
@api_base = api_base
|
46
51
|
end
|
52
|
+
|
47
53
|
def self.api_version
|
48
54
|
@api_version
|
49
55
|
end
|
56
|
+
|
50
57
|
def self.api_version=(api_version)
|
51
58
|
@api_version = api_version
|
52
59
|
end
|
60
|
+
|
53
61
|
def self.api_key
|
54
62
|
@api_key
|
55
63
|
end
|
64
|
+
|
56
65
|
def self.api_key=(api_key)
|
57
66
|
@api_key = api_key
|
58
67
|
end
|
68
|
+
|
59
69
|
def self.locale
|
60
70
|
@locale
|
61
71
|
end
|
72
|
+
|
62
73
|
def self.locale=(locale)
|
63
74
|
@locale = locale
|
64
75
|
end
|
data/lib/conekta/error.rb
CHANGED
@@ -31,40 +31,40 @@ module Conekta
|
|
31
31
|
end
|
32
32
|
case code
|
33
33
|
when 400
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
34
|
+
raise MalformedRequestError.new(@message, @message_to_purchaser, @type, @code, @params)
|
35
|
+
when 401
|
36
|
+
raise AuthenticationError.new(@message, @message_to_purchaser, @type, @code, @params)
|
37
|
+
when 402
|
38
|
+
raise ProcessingError.new(@message, @message_to_purchaser, @type, @code, @params)
|
39
|
+
when 404
|
40
|
+
raise ResourceNotFoundError.new(@message, @message_to_purchaser, @type, @code, @params)
|
41
|
+
when 422
|
42
|
+
raise ParameterValidationError.new(@message, @message_to_purchaser, @type, @code, @params)
|
43
|
+
when 500
|
44
|
+
raise ApiError.new(@message, @message_to_purchaser, @type, @code, @params)
|
45
|
+
else
|
46
|
+
raise Error.new(@message, @message_to_purchaser, @type, @code, @params)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
50
|
-
class ApiError < Error
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
class ApiError < Error
|
51
|
+
end
|
52
|
+
|
53
|
+
class NoConnectionError < Error
|
54
|
+
end
|
55
55
|
|
56
|
-
|
57
|
-
|
56
|
+
class AuthenticationError < Error
|
57
|
+
end
|
58
58
|
|
59
|
-
|
60
|
-
|
59
|
+
class ParameterValidationError < Error
|
60
|
+
end
|
61
61
|
|
62
|
-
|
63
|
-
|
62
|
+
class ProcessingError < Error
|
63
|
+
end
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
class ResourceNotFoundError < Error
|
66
|
+
end
|
67
67
|
|
68
|
-
|
69
|
-
|
70
|
-
end
|
68
|
+
class MalformedRequestError < Error
|
69
|
+
end
|
70
|
+
end
|
data/lib/conekta/requestor.rb
CHANGED
@@ -1,53 +1,69 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
require 'base64'
|
3
|
+
|
3
4
|
module Conekta
|
4
5
|
class Requestor
|
5
6
|
require 'sys/uname'
|
6
7
|
include Sys
|
8
|
+
|
7
9
|
attr_reader :api_key
|
8
|
-
|
10
|
+
|
11
|
+
def initialize
|
9
12
|
@api_key = Conekta.api_key
|
10
13
|
end
|
14
|
+
|
11
15
|
def api_url(url='')
|
12
16
|
api_base = Conekta.api_base
|
13
17
|
api_base + url
|
14
18
|
end
|
19
|
+
|
15
20
|
def request(meth, url, params=nil)
|
16
21
|
url = self.api_url(url)
|
17
22
|
meth = meth.downcase
|
23
|
+
|
18
24
|
begin
|
19
|
-
|
20
|
-
|
21
|
-
:ssl => { :ca_file=> File.dirname(__FILE__) + '/../ssl_data/ca_bundle.crt'}
|
22
|
-
) do |faraday|
|
23
|
-
faraday.adapter Faraday.default_adapter
|
24
|
-
end
|
25
|
-
conn.headers['X-Conekta-Client-User-Agent'] = set_headers.to_json
|
26
|
-
conn.headers['User-Agent'] = 'Conekta/v1 RubyBindings/' + Conekta::VERSION
|
27
|
-
conn.headers['Accept'] = "application/vnd.conekta-v#{Conekta.api_version}+json"
|
28
|
-
conn.headers['Accept-Language'] = Conekta.locale.to_s
|
29
|
-
conn.headers['Authorization'] = "Basic #{ Base64.encode64("#{self.api_key}" + ':')}"
|
30
|
-
if params
|
31
|
-
conn.params = params
|
32
|
-
end
|
33
|
-
response = conn.method(meth).call
|
25
|
+
connection = build_connection(url, params)
|
26
|
+
response = connection.method(meth).call
|
34
27
|
rescue Exception => e
|
35
28
|
Error.error_handler(e, "")
|
36
29
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
return JSON.parse(response.body)
|
30
|
+
|
31
|
+
return Error.error_handler(JSON.parse(response.body), response.status) if response.status != 200
|
32
|
+
JSON.parse(response.body)
|
41
33
|
end
|
34
|
+
|
42
35
|
private
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
36
|
+
|
37
|
+
def build_connection(url, params = nil)
|
38
|
+
connection = Faraday.new(
|
39
|
+
:url => url,
|
40
|
+
:ssl => { :ca_file=> File.dirname(__FILE__) + '/../ssl_data/ca_bundle.crt'}
|
41
|
+
) do |faraday|
|
42
|
+
faraday.adapter Faraday.default_adapter
|
43
|
+
end
|
44
|
+
|
45
|
+
set_headers_for(connection)
|
46
|
+
connection.params = params if params
|
47
|
+
return connection
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_headers_for(connection)
|
51
|
+
connection.headers['X-Conekta-Client-User-Agent'] = conekta_headers.to_json
|
52
|
+
connection.headers['User-Agent'] = 'Conekta/v1 RubyBindings/' + Conekta::VERSION
|
53
|
+
connection.headers['Accept'] = "application/vnd.conekta-v#{Conekta.api_version}+json"
|
54
|
+
connection.headers['Accept-Language'] = Conekta.locale.to_s
|
55
|
+
connection.headers['Authorization'] = "Basic #{ Base64.encode64("#{self.api_key}" + ':')}"
|
56
|
+
return connection
|
57
|
+
end
|
58
|
+
|
59
|
+
def conekta_headers
|
60
|
+
@conekta_headers ||= {
|
61
|
+
bindings_version: Conekta::VERSION,
|
62
|
+
lang: 'ruby',
|
63
|
+
lang_version: RUBY_VERSION,
|
64
|
+
publisher: 'conekta',
|
65
|
+
uname: Uname.uname
|
66
|
+
}
|
51
67
|
end
|
52
68
|
end
|
53
|
-
end
|
69
|
+
end
|
data/lib/conekta/version.rb
CHANGED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Conekta::Charge do
|
4
|
+
let(:payment_method) do
|
5
|
+
{
|
6
|
+
amount: 2000, currency: 'mxn', description: 'Some desc'
|
7
|
+
}
|
8
|
+
end
|
9
|
+
let(:invalid_payment_method) do
|
10
|
+
{
|
11
|
+
amount: 10, currency: 'mxn', description: 'Some desc'
|
12
|
+
}
|
13
|
+
end
|
14
|
+
let(:card) { { card: 'tok_test_visa_4242' } }
|
15
|
+
|
16
|
+
context "get" do
|
17
|
+
it "succesfully gets charge" do
|
18
|
+
transaction = Conekta::Charge.create(payment_method.merge(card))
|
19
|
+
expect(transaction.status).to eq("paid")
|
20
|
+
charge = Conekta::Charge.find(transaction.id)
|
21
|
+
expect(charge).to be_a(Conekta::Charge)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "test succesful where" do
|
25
|
+
charges = Conekta::Charge.where
|
26
|
+
charge = charges.first
|
27
|
+
expect(charge).to be_a(Conekta::Charge)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "creating charges" do
|
32
|
+
it "tests succesful bank payment" do
|
33
|
+
bank = { bank: { 'type' => 'banorte' } }
|
34
|
+
bank_payment = Conekta::Charge.create(payment_method.merge(bank))
|
35
|
+
expect(bank_payment.status).to eq("pending_payment")
|
36
|
+
end
|
37
|
+
|
38
|
+
it "tests succesful card payment" do
|
39
|
+
card_payment = Conekta::Charge.create(payment_method.merge(card))
|
40
|
+
expect(card_payment.status).to eq("paid")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "tests succesful oxxo payment" do
|
44
|
+
oxxo = { cash: { 'type' => 'oxxo' } }
|
45
|
+
cash_payment = Conekta::Charge.create(payment_method.merge(oxxo))
|
46
|
+
expect(cash_payment.status).to eq("pending_payment")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "tests succesful card payment capture" do
|
50
|
+
# pm = @valid_payment_method
|
51
|
+
# card = @valid_visa_card
|
52
|
+
capture = { capture: false }
|
53
|
+
transaction = Conekta::Charge.create(
|
54
|
+
payment_method.merge(card).merge(capture)
|
55
|
+
)
|
56
|
+
expect(transaction.status).to eq("pre_authorized")
|
57
|
+
transaction.capture
|
58
|
+
expect(transaction.status).to eq("paid")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "test unsuccesful create" do
|
62
|
+
expect {
|
63
|
+
Conekta::Charge.create(invalid_payment_method.merge(card))
|
64
|
+
}.to raise_error(
|
65
|
+
Conekta::ParameterValidationError,
|
66
|
+
"The minimum for card payments is 3 pesos. Check that the amount " +
|
67
|
+
"is in cents as explained in the documentation."
|
68
|
+
)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "refunding charges" do
|
73
|
+
it "test susccesful refund" do
|
74
|
+
transaction = Conekta::Charge.create(payment_method.merge(card))
|
75
|
+
expect(transaction.status).to eq("paid")
|
76
|
+
transaction.refund
|
77
|
+
expect(transaction.status).to eq("refunded")
|
78
|
+
end
|
79
|
+
|
80
|
+
it "test unsusccesful refund" do
|
81
|
+
transaction = Conekta::Charge.create(payment_method.merge(card))
|
82
|
+
expect(transaction.status).to eq("paid")
|
83
|
+
|
84
|
+
expect { transaction.refund(3000) }.to raise_error(
|
85
|
+
Conekta::ProcessingError,
|
86
|
+
"The amount to refund exceeds the charge total."
|
87
|
+
)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Conekta::Customer do
|
4
|
+
let(:customer_data) { { :cards => ["tok_test_visa_4242"] } }
|
5
|
+
|
6
|
+
context "creating customers" do
|
7
|
+
it "successful customer create" do
|
8
|
+
customer = Conekta::Customer.create(customer_data)
|
9
|
+
expect(customer).to be_a(Conekta::Customer)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "successful customer create" do
|
13
|
+
expect { Conekta::Customer.create(
|
14
|
+
:cards => ["tok_test_visa_4241"]
|
15
|
+
) }.to raise_error(
|
16
|
+
Conekta::ResourceNotFoundError,
|
17
|
+
"Object tok_test_visa_4241 could not be found."
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "getting customers" do
|
23
|
+
it "successful customer get" do
|
24
|
+
transaction = Conekta::Customer.create(customer_data)
|
25
|
+
customer = Conekta::Customer.find(transaction.id)
|
26
|
+
expect(customer).to be_a(Conekta::Customer)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "successful customer where" do
|
30
|
+
customers = Conekta::Customer.where
|
31
|
+
expect(customers.class.class_name).to eq("ConektaObject")
|
32
|
+
expect(customers.first).to be_a(Conekta::Customer)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "updating customers" do
|
37
|
+
it "successful customer update" do
|
38
|
+
customer = Conekta::Customer.create({
|
39
|
+
:cards => ["tok_test_visa_4242"],
|
40
|
+
})
|
41
|
+
customer.update({name: 'Logan', email: 'logan@x-men.org'})
|
42
|
+
expect(customer.name).to eq('Logan')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "deleting customers" do
|
47
|
+
it "successful customer delete" do
|
48
|
+
customer = Conekta::Customer.create(customer_data)
|
49
|
+
customer.delete
|
50
|
+
expect(customer.deleted).to eq(true)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "adding cards" do
|
55
|
+
let!(:customer) { Conekta::Customer.create(customer_data) }
|
56
|
+
|
57
|
+
it "add card to customer" do
|
58
|
+
card = customer.create_card(:token => 'tok_test_visa_1881')
|
59
|
+
expect(customer.cards.count).to eq(2)
|
60
|
+
expect(customer.cards.last.last4).to eq('1881')
|
61
|
+
end
|
62
|
+
|
63
|
+
it "test delete card" do
|
64
|
+
card = customer.cards[0].delete
|
65
|
+
expect(card.deleted).to eq(true)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "test update card" do
|
69
|
+
customer.cards[0].update(token: 'tok_test_mastercard_4444', active: false)
|
70
|
+
expect(customer.cards[0].last4).to eq('4444')
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "managing subscriptions" do
|
75
|
+
let!(:customer) { Conekta::Customer.create(customer_data) }
|
76
|
+
|
77
|
+
context "create" do
|
78
|
+
it "test succesful create subscription" do
|
79
|
+
subscription = customer.create_subscription({plan: 'gold-plan'})
|
80
|
+
expect(subscription.class.class_name).to eq('Subscription')
|
81
|
+
end
|
82
|
+
|
83
|
+
it "test unsuccesful create subscription" do
|
84
|
+
expect { customer.create_subscription({plan: 'unexistent-plan'}) }.to \
|
85
|
+
raise_error(
|
86
|
+
Conekta::ResourceNotFoundError,
|
87
|
+
"Object Plan unexistent-plan could not be found."
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "update" do
|
93
|
+
it "test succesful update subscription" do
|
94
|
+
subscription = customer.create_subscription({plan: 'gold-plan'})
|
95
|
+
plan = find_or_create_plan('gold-plan2')
|
96
|
+
|
97
|
+
subscription.update({plan: plan.id})
|
98
|
+
expect(subscription.plan_id).to eq('gold-plan2')
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "pause/resume" do
|
103
|
+
let!(:subscription) { customer.create_subscription({plan: 'gold-plan'}) }
|
104
|
+
|
105
|
+
it "test succesful pause subscription" do
|
106
|
+
subscription.pause
|
107
|
+
expect(subscription.status).to eq('paused')
|
108
|
+
end
|
109
|
+
|
110
|
+
it "test succesful resume subscription" do
|
111
|
+
subscription.pause
|
112
|
+
expect(subscription.status).to eq('paused')
|
113
|
+
subscription.resume
|
114
|
+
expect(subscription.status).to_not eq('paused')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context "cancel" do
|
119
|
+
it "test succesful cancel subscription" do
|
120
|
+
subscription = customer.create_subscription({plan: 'gold-plan'})
|
121
|
+
subscription.cancel
|
122
|
+
expect(subscription.status).to eq('canceled')
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_or_create_plan(plan_id)
|
129
|
+
plan = Conekta::Plan.find(plan_id)
|
130
|
+
rescue Conekta::Error => e
|
131
|
+
plan = Conekta::Plan.create({
|
132
|
+
id: plan_id,
|
133
|
+
name: "Gold Plan",
|
134
|
+
amount: 10000,
|
135
|
+
currency: "MXN",
|
136
|
+
interval: "month",
|
137
|
+
frequency: 1,
|
138
|
+
trial_period_days: 15,
|
139
|
+
expiry_count: 12
|
140
|
+
})
|
141
|
+
return plan
|
142
|
+
end
|