buckaroo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e3320da151ff6d333b962aa93cda3da4de6c4570
4
+ data.tar.gz: 95ac59d4e5a7de13cba03eb23e0c7bbc57f93bd9
5
+ SHA512:
6
+ metadata.gz: 5bbad8f54ef8c041f082faa7f1621fbe052a62e9d2ffa5963a8ce8a205f41c288d6a807dc283e27debdd4afe9d9aedbbecd62948b02105ce91b5a80bfa18fd2a
7
+ data.tar.gz: e5ef546ed866e46493324491b5cc9b0f57e725b69fc9ac356154db04f38e9e5e190d2c6d294cce58feac9555c160321dd86c4b6f7fc7c3ea03666db1565cb773
data/.gitignore ADDED
@@ -0,0 +1,37 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /lib/bundler/man/
26
+
27
+ # for a library or gem, you might want to ignore these files since the code is
28
+ # intended to run in multiple environments; otherwise, check them in:
29
+ # Gemfile.lock
30
+ # .ruby-version
31
+ # .ruby-gemset
32
+
33
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
34
+ .rvmrc
35
+
36
+ .vagrant/
37
+ env.source
data/.travis.yml ADDED
@@ -0,0 +1,19 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.1.2
5
+ - 2.1.0
6
+ - 2.0.0
7
+ script: bundle exec rspec spec/spec.rb spec/remote_spec.rb
8
+ notifications:
9
+ email: false
10
+ hipchat:
11
+ rooms:
12
+ secure: IiZp/qFD7GtkXm2OYVdzr+sPo/myu79rFEKhO/Dg5d5dkruERZz1pfZ8xUrGz3JNEEl+wviMUx/FwY3n9odX2uCzFbqytjX87AMqx9F0kUNi5ze0pLdShnh5xQC5oq5g489rH+0W4AXRUD0dLM+At01AbVnTkzKaYq3/oPHJUYM=
13
+ template:
14
+ - '%{repository}#%{build_number} (%{branch} - %{commit} - %{commit_message} : %{author}): %{message}'
15
+ env:
16
+ global:
17
+ - secure: XLpikaYlecYiZUUPjedPpgItraL5auslJwyhJn5Fzrfz3whlcqg4r9ZHZrWay4pVc75RyevZ33f1gzQ8KS6B943OvbePQTTNnq61dj+KIyt+tdv/RPrN7JJTn86XqUuPJlp1RWHwCCfSHjQjhSKabPUpBaUOght8H+tTaSs6e8s=
18
+ - secure: fAG930g2TUvNnb570xpplp8FFL6M/G3MubiVziG0b0Zz0N9+0sR/oNQu6xYrbxvgeuCJvCzWalxVxE9uSJVMr/L6NhpIRoNyrdVmy4NWblfsL9yjoDnJU1ZiVGmF9lskm7WaG/ZVOJO+aAV1RHvZRVCOXetmkeYftDNIv0/+B3g=
19
+ - secure: VK8oZxOhAlmVNtXCQ3tOWqJxQMRB2ILTf0egpyIzRheFZpBNI7Qzn85MNB6FgLvm7o4kA76OzuqDMc7xvlaSaQ0if5F5Ts8HVK89Ak7Oydl0Xo9m3Xf2xuxHJfl93dtGljvoz8VVXdqN73ampr19dM7n56H+IZnQMlW57fSJGUQ=
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rake'
4
+ gem 'coveralls', require: false
5
+
6
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,59 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ buckaroo (1.0.0)
5
+ addressable
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ addressable (2.3.6)
11
+ coveralls (0.7.1)
12
+ multi_json (~> 1.3)
13
+ rest-client
14
+ simplecov (>= 0.7)
15
+ term-ansicolor
16
+ thor
17
+ diff-lcs (1.2.5)
18
+ docile (1.1.5)
19
+ metaclass (0.0.4)
20
+ mime-types (2.3)
21
+ mocha (1.1.0)
22
+ metaclass (~> 0.0.1)
23
+ multi_json (1.10.1)
24
+ netrc (0.7.7)
25
+ rake (10.3.2)
26
+ rest-client (1.7.2)
27
+ mime-types (>= 1.16, < 3.0)
28
+ netrc (~> 0.7)
29
+ rspec (3.0.0)
30
+ rspec-core (~> 3.0.0)
31
+ rspec-expectations (~> 3.0.0)
32
+ rspec-mocks (~> 3.0.0)
33
+ rspec-core (3.0.4)
34
+ rspec-support (~> 3.0.0)
35
+ rspec-expectations (3.0.4)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.0.0)
38
+ rspec-mocks (3.0.4)
39
+ rspec-support (~> 3.0.0)
40
+ rspec-support (3.0.4)
41
+ simplecov (0.9.0)
42
+ docile (~> 1.1.0)
43
+ multi_json
44
+ simplecov-html (~> 0.8.0)
45
+ simplecov-html (0.8.0)
46
+ term-ansicolor (1.3.0)
47
+ tins (~> 1.0)
48
+ thor (0.19.1)
49
+ tins (1.3.2)
50
+
51
+ PLATFORMS
52
+ ruby
53
+
54
+ DEPENDENCIES
55
+ buckaroo!
56
+ coveralls
57
+ mocha
58
+ rake
59
+ rspec
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 inventid
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ [![inventid logo](https://s3-eu-west-1.amazonaws.com/static-inventid-nl/content/img/logo.png)](http://opensource.inventid.nl)
2
+
3
+ # Buckaroo
4
+ | Branch | Build status | Code coverage |
5
+ |---|---|---|
6
+ | Master |[![Build Status](https://travis-ci.org/inventid/buckaroo.svg?branch=master)](https://travis-ci.org/inventid/buckaroo)|[![Coverage Status](http://img.shields.io/coveralls/inventid/buckaroo/master.svg)](https://coveralls.io/r/inventid/buckaroo?branch=master)|
7
+ | Develop |[![Build Status](https://travis-ci.org/inventid/buckaroo.svg?branch=develop)](https://travis-ci.org/inventid/buckaroo)|[![Coverage Status](http://img.shields.io/coveralls/inventid/buckaroo/develop.svg)](https://coveralls.io/r/inventid/buckaroo?branch=develop)|
8
+
9
+ ## What is it?
10
+
11
+ Buckaroo is a simple Ruby 2.1 compliant gateway to contact the Buckaroo Payment Service Provider.
12
+ Since there was no decent one available, we decided to develop our own.
13
+ And now you can use it too!
14
+
15
+ ## How to use it?
16
+
17
+ Using it is quite simple, you can simply clone the code and then require it (_we plan to release a gem later_).
18
+
19
+ ## How to suggest improvements?
20
+
21
+ We are still actively developing Buckaroo for our internal use, but we would already love to hear your feedback. In case you have some great ideas, you may just [open an issue](https://github.com/inventid/buckaroo/issues/new). Be sure to check beforehand whether the same issue does not already exist.
22
+
23
+ ## How can I contribute?
24
+
25
+ We feel contributions from the community are extremely worthwhile. If you use Buckaroo in production and make some modification, please share it back to the community. You can simply [fork the repository](https://github.com/inventid/buckaroo/fork), commit your changes to your code and create a pull request back to this repository.
26
+
27
+ If there are any issues related to your changes, be sure to reference to those. Additionally we use the `develop` branch, so create a pull request to that branch and not to `master`.
28
+
29
+ Additionally we always use [vagrant](http://www.vagrantup.com) for our development. To do the same, you can do the following:
30
+
31
+ 1. Make sure to have [vagrant](http://www.vagrantup.com) installed.
32
+ 1. Clone the repository
33
+ 1. Open a terminal / shell script and nagivate to the place where you cloned the repository
34
+ 1. Simply enter `vagrant up`
35
+ 1. Provisioning takes around 5 minutes on my PC. If you want it to be faster you can use the `userConfig.json` file in the root and override the specific settings for memory and CPU.
36
+ 1. The Vagrant machine provisions and you can easily work with us. Enter `vagrant ssh` to get shell access to the machine. In case you are done with it, simply enter `vagrant destroy`. You won't lose any changes to your git repository when this happens.
37
+
38
+ ## Collaborators
39
+
40
+ We would like to thank the developers which contributed to Buckaroo, both big and small.
41
+
42
+ - [rogierslag](https://github.com/rogierslag) (Lead developer of Buckaroo @ [inventid](https://www.inventid.nl))
43
+ - [joostverdoorn](https://github.com/joostverdoorn) (Developer of Buckaroo @ [inventid](https://www.inventid.nl))
data/Vagrantfile ADDED
@@ -0,0 +1,35 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ require 'json'
5
+
6
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
7
+ VAGRANTFILE_API_VERSION = "2"
8
+
9
+ vagrantConfigFile = "vagrantConfig.json"
10
+
11
+ if File.exists?(vagrantConfigFile)
12
+ userConfig = JSON.parse(File.read(vagrantConfigFile))
13
+ else
14
+ userConfig = {}
15
+ end
16
+
17
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
18
+ config.vm.box = "trusty64"
19
+ config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
20
+ config.vm.provider :virtualbox do |vb|
21
+ vb.name = "buckaroo-local.inventid.net"
22
+ end
23
+
24
+ memory = userConfig["memory"] || 1024
25
+ cpus = userConfig["cpus"] || 1
26
+
27
+ config.vm.provider :virtualbox do |vb|
28
+ vb.customize ["modifyvm", :id, "--memory", memory, "--cpus", cpus]
29
+ end
30
+
31
+
32
+ config.vm.hostname = "buckaroo-local.inventid.net"
33
+ config.vm.provision :shell, :path => "provision.sh"
34
+
35
+ end
data/buckaroo.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "buckaroo/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = %q{buckaroo}
7
+ s.version = Buckaroo::VERSION
8
+ s.authors = ["Rogier Slag"]
9
+ s.description = %q{Buckaroo payment gateway (see http://www.buckaroo.nl)}
10
+ s.summary = %q{Buckaroo payment gateway}
11
+ s.email = %q{rogier@inventid.nl}
12
+ s.licenses = ['MIT']
13
+ s.homepage = %q{http://opensource.inventid.nl/buckaroo}
14
+
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+
20
+ s.files = `git ls-files`.split("\n")
21
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ s.require_paths = ["lib"]
24
+
25
+ s.add_dependency "addressable"
26
+
27
+ s.add_development_dependency "rspec"
28
+ s.add_development_dependency "mocha"
29
+
30
+ end
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'buckaroo'
data/lib/buckaroo.rb ADDED
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ require 'buckaroo/gateway'
4
+ require 'buckaroo/response'
5
+ require 'buckaroo/urls'
6
+ require 'buckaroo/version'
7
+
8
+
9
+ module Buckaroo
10
+ end
@@ -0,0 +1,161 @@
1
+ # encoding: utf-8
2
+
3
+ require 'net/https'
4
+ require 'digest/sha2'
5
+ require 'addressable/uri'
6
+ require 'base64'
7
+ require 'openssl'
8
+ require 'buckaroo/urls'
9
+
10
+
11
+ module Buckaroo
12
+ class Gateway
13
+ LANGUAGE = 'nl'
14
+ CURRENCY = 'EUR'
15
+
16
+ class << self
17
+ # Holds the environment in which the run (default is test)
18
+ attr_accessor :environment
19
+
20
+ # Holds the global iDEAL merchant id. Make sure to use a string with
21
+ # leading zeroes if needed.
22
+ attr_accessor :website_key
23
+
24
+ # Holds the secret that should be used for the website key.
25
+ attr_accessor :secret
26
+
27
+ # Holds the users locale
28
+ attr_accessor :locale
29
+ end
30
+
31
+ # Environment defaults to test
32
+ self.environment = :test
33
+
34
+ # Returns whether we're in test mode or not.
35
+ def self.test?
36
+ if self.environment.nil?
37
+ self.environment = :test
38
+ end
39
+ self.environment == :test
40
+ end
41
+
42
+ # Returns the endpoint for the request.
43
+ #
44
+ # Automatically uses test or live URLs based on the configuration.
45
+ def request_url(operation)
46
+ if self.class.test?
47
+ url = URLS[:test_url]
48
+ else
49
+ url = URLS[:live_url]
50
+ end
51
+ return url if operation.nil?
52
+ url + '?op=' + operation
53
+ end
54
+
55
+ # TODO: Add comment here
56
+ def setup_purchase(money, options)
57
+ config_complete!
58
+ requires!(options, :order_id, :return_url, :description, :method)
59
+
60
+ req = build_transaction_request(money, options)
61
+ post_data request_url('transactionrequest'), req, TransactionResponse
62
+ end
63
+
64
+ # Sends a status request for the specified +transaction_id+ and
65
+ # returns an StatusResponse.
66
+ #
67
+ # It is _your_ responsibility as the merchant to check if the payment has
68
+ # been made until you receive a response with a finished status like:
69
+ # `Success', `Cancelled', `Expired', everything else equals `Open'.
70
+ #
71
+ # === Example
72
+ #
73
+ # capture_response = gateway.capture(@purchase.transaction_id)
74
+ # if capture_response.success?
75
+ # @purchase.update_attributes!(:paid => true)
76
+ # flash[:notice] = "Congratulations, you are now the proud owner of a Dutch windmill!"
77
+ # end
78
+ #
79
+ # See the Gateway class description for a more elaborate example.
80
+ def capture(transaction_id)
81
+ config_complete!
82
+
83
+ a = build_status_request(transaction_id)
84
+ post_data request_url('transactionstatus'), a, StatusResponse
85
+ end
86
+
87
+ private
88
+
89
+ def ssl_post(url, params)
90
+ log('URL', url)
91
+ log('Request', params)
92
+ response = Net::HTTP.post_form(URI.parse(url), params)
93
+ log('Response', response.body)
94
+ response
95
+ end
96
+
97
+ def post_data(gateway_url, data, response_klass)
98
+ response_klass.new(ssl_post(gateway_url, data))
99
+ end
100
+
101
+ def requires!(options, *keys)
102
+ missing = keys - options.keys
103
+ unless missing.empty?
104
+ raise ArgumentError, "Missing required options: #{missing.map { |m| m.to_s }.join(', ')}"
105
+ end
106
+ end
107
+
108
+ def build_status_request(transaction_id)
109
+ data = {
110
+ brq_websitekey: self.class.website_key,
111
+ brq_transaction: transaction_id,
112
+ brq_test: self.class.test?
113
+ }
114
+
115
+ sign!(data)
116
+ end
117
+
118
+ def build_transaction_request(amount, options)
119
+ data = {
120
+ brq_payment_method: options[:method],
121
+ brq_websitekey: self.class.website_key,
122
+ brq_culture: self.class.locale,
123
+ brq_currency: CURRENCY,
124
+ brq_amount: amount,
125
+ brq_invoicenumber: options[:order_id],
126
+ brq_ordernumber: options[:order_id],
127
+ brq_description: options[:description],
128
+ brq_return: options[:return_url],
129
+ brq_returncancel: '',
130
+ brq_returnerror: '',
131
+ brq_returnreject: '',
132
+ brq_continue_on_incomplete: 'RedirectToHTML',
133
+ brq_test: self.class.test?
134
+ }
135
+ extra = 'brq_service_'+options[:method]+'_action'
136
+ data[extra] = 'Pay'
137
+
138
+ sign!(data)
139
+ end
140
+
141
+ def sign!(input)
142
+ sorted_data = input.sort_by { |key, _| key.to_s }
143
+
144
+ to_hash = ''
145
+ sorted_data.each { |key, value| to_hash << key.to_s+'='+value.to_s }
146
+ to_hash << self.class.secret
147
+ input['brq_signature'] = Digest::SHA512.hexdigest(to_hash)
148
+ input
149
+ end
150
+
151
+ def config_complete!
152
+ if self.class.website_key.to_s.empty? || self.class.secret.to_s.empty? || self.class.locale.to_s.empty?
153
+ raise ArgumentError, "Required config is not done"
154
+ end
155
+ end
156
+
157
+ def log(thing, contents)
158
+ $stderr.write("\n#{thing}:\n\n#{contents}\n") if $DEBUG
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,97 @@
1
+ # encoding: utf-8
2
+
3
+ require 'addressable/uri'
4
+ require 'digest/sha2'
5
+
6
+ module Buckaroo
7
+
8
+ class Response
9
+ attr_accessor :status_code
10
+
11
+ def initialize(response, options = {})
12
+ body = response.body
13
+ @response = Hash[Addressable::URI.form_unencode(body)]
14
+ @status_code = @response['BRQ_STATUSCODE'].to_i
15
+ @success = !error_occurred?
16
+ @test = @response['BRQ_TEST'].downcase == 'true' ? true : false
17
+ end
18
+
19
+ # Returns whether we're running in test mode
20
+ def test?
21
+ @test
22
+ end
23
+
24
+ # Returns whether the request was a success
25
+ def success?
26
+ @success
27
+ end
28
+
29
+ def verified?
30
+ input = @response.dup
31
+ given_hash = input['BRQ_SIGNATURE']
32
+ input.delete('BRQ_SIGNATURE')
33
+ # This might actually need some explanation why we are converting do lowercase here
34
+ # Buckaroo specifies to sort these parameters, although the exact matter of sorting
35
+ # is quite ambigious. So after quite a while of debugging, I discovered that by
36
+ # sorting they do not use the ASCII based sorting Ruby uses. In fact, the sorting
37
+ # is specified to place symbols first (which ASCII does, except for the underscore (_)
38
+ # which is located between the capitals and lowercase letters (jeej ASCII!).
39
+ # So in this case, by converting everything to lowercase before comparing, we ensure
40
+ # that all symbols are in the table before the letters.
41
+ #
42
+ # Actual case where it went wrong: keys BRQ_TRANSACTIONS and BRQ_TRANSACTION_CANCELABLE
43
+ # Ruby would sort these in this exact order, whereas Buckaroo would reverse them. And
44
+ # since for hashing the reversal generates a totally different sequence, that would
45
+ # break message validation.
46
+ #
47
+ # TLDR; Leave it with a downcase
48
+ sorted_data = input.sort_by { |key, _| key.to_s.downcase }
49
+
50
+ to_hash = ''
51
+ sorted_data.each { |key, value| to_hash << key.to_s+'='+value.to_s }
52
+ to_hash << Buckaroo::Gateway.secret
53
+
54
+ Digest::SHA512.hexdigest(to_hash) == given_hash
55
+ end
56
+
57
+ private
58
+
59
+ def error_occurred?
60
+ !verified? || @status_code == 491 || @status_code == 492
61
+ end
62
+
63
+ end
64
+
65
+ class TransactionResponse < Response
66
+ def redirect_url
67
+ @response['BRQ_REDIRECTURL']
68
+ end
69
+
70
+ def transaction_id
71
+ @response['BRQ_TRANSACTIONS']
72
+ end
73
+
74
+ def order_id
75
+ @response['BRQ_ORDERNUMBER']
76
+ end
77
+
78
+ end
79
+
80
+ class StatusResponse < Response
81
+ def status
82
+ case @status_code
83
+ when 190 then
84
+ 'success'
85
+ when 490..690 then
86
+ 'failure'
87
+ when 790..793 then
88
+ 'open'
89
+ when 890..891 then
90
+ 'cancelled'
91
+ else
92
+ raise(Exception)
93
+ end
94
+ end
95
+
96
+ end
97
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+
3
+ module Buckaroo
4
+ URLS = {
5
+ live_url: 'https://checkout.buckaroo.nl/nvp/',
6
+ test_url: 'https://testcheckout.buckaroo.nl/nvp/'
7
+ }
8
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module Buckaroo
4
+ VERSION = '1.0.0'
5
+ end
data/provision.sh ADDED
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+
3
+ # This improves performance since the Google DNS is much quicker than the local Vagrant Virtualbox combination
4
+ printf "nameserver 8.8.8.8\nnameserver 8.8.4.4" > /etc/resolv.conf
5
+
6
+ echo "Updating the Operating System..."
7
+ sudo apt-get update >> /tmp/provision.log 2>&1
8
+ sudo apt-get upgrade -y >> /tmp/provision.log 2>&1
9
+
10
+ echo "Installing extra packages..."
11
+ sudo apt-get install curl wget git g++ libreadline6-dev zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 autoconf libgdbm-dev libncurses5-dev automake libtool bison pkg-config libffi-dev -y >> /tmp/provision.log 2>&1
12
+
13
+ echo "Installing rvm..."
14
+ curl -sSL https://get.rvm.io | bash -s stable --ruby >> /tmp/provision.log 2>&1
15
+ source /usr/local/rvm/scripts/rvm
16
+
17
+ echo "Installing Ruby-2.1.2..."
18
+ rvm install ruby-2.1.2 >> /tmp/provision.log 2>&1
19
+ rvm use ruby-2.1.2 --default >> /tmp/provision.log 2>&1
20
+
21
+ cd /vagrant && bundle install >> /tmp/provision.log 2>&1
22
+
23
+ echo ""
24
+ echo "And we are done! Check /tmp/provision.log for a full log file \`vagrant ssh -c \"cat /tmp/provision.log\"\`"
@@ -0,0 +1,122 @@
1
+ # encoding: utf-8
2
+ require 'coveralls'
3
+
4
+ Coveralls.wear!
5
+
6
+ require 'buckaroo'
7
+ require 'mocha'
8
+
9
+ def set_vars_from_env
10
+ Buckaroo::Gateway.environment = :test
11
+ Buckaroo::Gateway.website_key = ENV['website_key']
12
+ Buckaroo::Gateway.secret = ENV['secret']
13
+ Buckaroo::Gateway.locale = ENV['locale']
14
+ end
15
+
16
+ VALID_OPTIONS = {
17
+ order_id: 1,
18
+ return_url: 'http://www.inventid.nl',
19
+ description: 'test',
20
+ method: 'bancontactmrcash'
21
+ }
22
+
23
+ module Buckaroo
24
+
25
+ class InvalidParameters
26
+
27
+ describe Buckaroo do
28
+
29
+ before(:each) do
30
+ Buckaroo::Gateway.website_key = nil
31
+ Buckaroo::Gateway.environment = nil
32
+ Buckaroo::Gateway.locale = nil
33
+ Buckaroo::Gateway.secret = nil
34
+
35
+ end
36
+
37
+ it 'should fail on negative numbers' do
38
+ set_vars_from_env
39
+ gateway = Buckaroo::Gateway.new
40
+ response = gateway.setup_purchase('-1', VALID_OPTIONS)
41
+ expect(response.verified?).to be true
42
+ expect(response.success?).to be false
43
+ end
44
+ end
45
+ end
46
+
47
+ class CaptureTransaction
48
+
49
+ describe 'Buckaroo' do
50
+
51
+
52
+ it 'should create an valid request if remainder is ok' do
53
+ set_vars_from_env
54
+ gateway = Buckaroo::Gateway.new
55
+ response = gateway.setup_purchase('1.00', VALID_OPTIONS)
56
+ expect(response.verified?).to be true
57
+ expect(response.success?).to be true
58
+ expect(response.order_id).to eq(VALID_OPTIONS[:order_id].to_s)
59
+ expect(response).to be_a TransactionResponse
60
+ end
61
+
62
+ describe 'capture' do
63
+ it 'should create an valid status request if remainder is ok' do
64
+ set_vars_from_env
65
+ #Buckaroo::Gateway.environment = :live
66
+ gateway = Buckaroo::Gateway.new
67
+ response = gateway.setup_purchase('1.00', VALID_OPTIONS)
68
+ expect(response.verified?).to be true
69
+ expect(response.success?).to be true
70
+ expect(response.order_id).to eq(VALID_OPTIONS[:order_id].to_s)
71
+ expect(response.redirect_url).to match(/buckaroo/)
72
+ expect(response).to be_a TransactionResponse
73
+
74
+ transaction_id = response.transaction_id
75
+ result = gateway.capture(transaction_id)
76
+ expect(result.verified?).to be true
77
+ expect(result.status).to eq('open')
78
+ expect(result).to be_a StatusResponse
79
+ end
80
+
81
+ it 'should return failure if a payment was failed' do
82
+ set_vars_from_env
83
+ gateway = Buckaroo::Gateway.new
84
+ transaction_id = 'F7B5BD0D19B24A6DB2A9BAE45919B5DB'
85
+ result = gateway.capture(transaction_id)
86
+ expect(result.status).to eq('failure')
87
+ expect(result.verified?).to be true
88
+ expect(result.test?).to be true
89
+ expect(result).to be_a StatusResponse
90
+ end
91
+
92
+ it 'should return cancelled if the customer cancelled' do
93
+ set_vars_from_env
94
+ gateway = Buckaroo::Gateway.new
95
+ transaction_id = 'EC99E0BD08CB4D06B17C6670F4FFDDAA'
96
+ result = gateway.capture(transaction_id)
97
+ expect(result.status).to eq('cancelled')
98
+ expect(result.verified?).to be true
99
+ expect(result.test?).to be true
100
+ expect(result).to be_a StatusResponse
101
+ end
102
+
103
+ it 'should return success if the payment was OK' do
104
+ set_vars_from_env
105
+ gateway = Buckaroo::Gateway.new
106
+
107
+ PAYPAL_OPTIONS = VALID_OPTIONS.dup
108
+ PAYPAL_OPTIONS[:method] = 'paypal'
109
+ response = gateway.setup_purchase('1.00', PAYPAL_OPTIONS)
110
+
111
+ expect(response).to be_a TransactionResponse
112
+
113
+ #transaction_id = 'EC99E0BD08CB4D06B17C6670F4FFDDAA'
114
+ #result = gateway.capture(transaction_id)
115
+ #expect(result.status).to eq('cancelled')
116
+ #expect(result.verified?).to be true
117
+ #expect(result.test?).to be true
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
data/spec/spec.rb ADDED
@@ -0,0 +1,100 @@
1
+ # encoding: utf-8
2
+ require 'coveralls'
3
+
4
+ Coveralls.wear!
5
+
6
+ require 'buckaroo'
7
+ require 'mocha'
8
+
9
+ module Buckaroo
10
+
11
+ class RequestGeneration
12
+
13
+ describe Buckaroo do
14
+
15
+ VALID_OPTIONS = {
16
+ order_id: 1,
17
+ return_url: 'http://www.inventid.nl',
18
+ description: 'test',
19
+ method: 'bancontactmrcash'
20
+ }
21
+
22
+ before(:each) do
23
+ Buckaroo::Gateway.website_key = nil
24
+ Buckaroo::Gateway.environment = nil
25
+ Buckaroo::Gateway.locale = nil
26
+ Buckaroo::Gateway.secret = nil
27
+
28
+ end
29
+
30
+ describe '#test?' do
31
+ it 'should return true by default since we are using the test environment' do
32
+ expect(Buckaroo::Gateway.test?).to be true
33
+ end
34
+
35
+ it 'should return false it we override to the live environment' do
36
+ Buckaroo::Gateway.environment = :live
37
+ expect(Buckaroo::Gateway.test?).to be false
38
+ end
39
+ end
40
+
41
+ describe 'request_url' do
42
+ it 'should return the test url in the setup test environment' do
43
+ Buckaroo::Gateway.environment = :test
44
+ gateway = Buckaroo::Gateway.new
45
+ expect(gateway.request_url(nil)).to eq(URLS[:test_url])
46
+ end
47
+
48
+ it 'should return the test url in the setup test environment' do
49
+ Buckaroo::Gateway.environment = :live
50
+ gateway = Buckaroo::Gateway.new
51
+ expect(gateway.request_url(nil)).to eq(URLS[:live_url])
52
+ end
53
+ end
54
+
55
+ describe 'setup_purchase' do
56
+ it 'should throw an error about missing parameters' do
57
+ Buckaroo::Gateway.environment = :test
58
+ gateway = Buckaroo::Gateway.new
59
+ Buckaroo::Gateway.website_key = 'test'
60
+ Buckaroo::Gateway.secret = 'test'
61
+ Buckaroo::Gateway.locale = 'test'
62
+ expect { gateway.setup_purchase('10.00', {return_url: 'http://example.com', description: 'test', method: 'paypal'}) }.to raise_error(ArgumentError)
63
+ expect { gateway.setup_purchase('10.00', {order_id: 4, description: 'test', method: 'paypal'}) }.to raise_error(ArgumentError)
64
+ expect { gateway.setup_purchase('10.00', {return_url: 'http://example.com', order_id: 'test', method: 'paypal'}) }.to raise_error(ArgumentError)
65
+ expect { gateway.setup_purchase('10.00', {return_url: 'http://example.com', description: 'test', method: 'paypal'}) }.to raise_error(ArgumentError)
66
+ end
67
+
68
+ it 'should fail because of missing config' do
69
+ Buckaroo::Gateway.environment = :test
70
+ gateway = Buckaroo::Gateway.new
71
+ expect { gateway.setup_purchase('10.00', VALID_OPTIONS) }.to raise_error(ArgumentError)
72
+ Buckaroo::Gateway.website_key = ENV['website_key']
73
+ expect { gateway.setup_purchase('10.00', VALID_OPTIONS) }.to raise_error(ArgumentError)
74
+ Buckaroo::Gateway.secret = ENV['secret']
75
+ expect { gateway.setup_purchase('10.00', VALID_OPTIONS) }.to raise_error(ArgumentError)
76
+ Buckaroo::Gateway.locale = ENV['locale']
77
+ Buckaroo::Gateway.locale = nil
78
+ expect { gateway.setup_purchase('10.00', VALID_OPTIONS) }.to raise_error(ArgumentError)
79
+ end
80
+
81
+ end
82
+
83
+ describe 'capture' do
84
+ it 'should fail because of missing config' do
85
+ Buckaroo::Gateway.environment = :test
86
+ gateway = Buckaroo::Gateway.new
87
+ expect { gateway.capture('1234') }.to raise_error(ArgumentError)
88
+ Buckaroo::Gateway.website_key = ENV['website_key']
89
+ expect { gateway.capture('1234') }.to raise_error(ArgumentError)
90
+ Buckaroo::Gateway.secret = ENV['secret']
91
+ expect { gateway.capture('1234') }.to raise_error(ArgumentError)
92
+ Buckaroo::Gateway.locale = ENV['locale']
93
+ Buckaroo::Gateway.locale = nil
94
+ expect { gateway.capture('1234') }.to raise_error(ArgumentError)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buckaroo
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Rogier Slag
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: addressable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mocha
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Buckaroo payment gateway (see http://www.buckaroo.nl)
56
+ email: rogier@inventid.nl
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files:
60
+ - LICENSE
61
+ - README.md
62
+ files:
63
+ - ".gitignore"
64
+ - ".travis.yml"
65
+ - Gemfile
66
+ - Gemfile.lock
67
+ - LICENSE
68
+ - README.md
69
+ - Vagrantfile
70
+ - buckaroo.gemspec
71
+ - init.rb
72
+ - lib/buckaroo.rb
73
+ - lib/buckaroo/gateway.rb
74
+ - lib/buckaroo/response.rb
75
+ - lib/buckaroo/urls.rb
76
+ - lib/buckaroo/version.rb
77
+ - provision.sh
78
+ - spec/remote_spec.rb
79
+ - spec/spec.rb
80
+ homepage: http://opensource.inventid.nl/buckaroo
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.2.2
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: Buckaroo payment gateway
104
+ test_files:
105
+ - spec/remote_spec.rb
106
+ - spec/spec.rb