moneybookers 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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in moneybookers.gemspec
4
+ gemspec
5
+
6
+ gem "rake"
7
+
8
+ platforms :ruby_18 do
9
+ gem "minitest"
10
+ end
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Wojciech Wnętrzak
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,35 @@
1
+ # Moneybookers #
2
+ Ruby client for [Moneybookers](http://moneybookers.com/) service.
3
+
4
+ Refer to Moneybookers documentation:
5
+ * [Automated Payment Interface](http://www.moneybookers.com/merchant/pl/automated_payments_interface_manual.pdf)
6
+ * [Payment Gateway](http://www.moneybookers.com/merchant/pl/moneybookers_gateway_manual.pdf)
7
+
8
+ ## Configuration ##
9
+
10
+ ``` ruby
11
+ require "moneybookers"
12
+
13
+ Moneybookers.configure do |config|
14
+ config.merchant_id = "merchant_id"
15
+ config.email = "john@doe.com"
16
+ config.secret_word_md5 = "md5-of-secret-word"
17
+ config.password = "md5-of-password"
18
+ config.pay_to_email = "joe@doe.com"
19
+ end
20
+ ```
21
+
22
+ ## Payment Gateway ##
23
+
24
+ ## API ##
25
+
26
+ ### Pay On Demand ##
27
+
28
+ ## TODO: ##
29
+ * Support rest of API
30
+ * More tests
31
+ * Docs
32
+
33
+ ## Copyright ##
34
+
35
+ Copyright © 2011 Wojciech Wnętrzak. See LICENSE for details.
@@ -0,0 +1,11 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rake/testtask"
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << "lib" << "test"
7
+ test.pattern = "test/**/*_test.rb"
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,22 @@
1
+ require "moneybookers/version"
2
+ require "moneybookers/request"
3
+ require "moneybookers/payment_gateway/client"
4
+ require "moneybookers/payment_gateway/response"
5
+ require "moneybookers/api/pay_on_demand"
6
+ require "moneybookers/signature/base"
7
+ require "moneybookers/signature/secure_url"
8
+ require "moneybookers/signature/status"
9
+
10
+ module Moneybookers
11
+ HOST = "https://www.moneybookers.com/"
12
+ SERVICE_IPS = %w{213.129.75.201 213.129.75.203 91.208.28.7 91.208.28.8 91.208.28.9 91.208.28.4 91.208.28.5 91.208.28.6
13
+ 193.105.47.4 193.105.47.5 193.105.47.6 193.105.47.7 193.105.47.8 193.105.47.9}
14
+
15
+ class << self
16
+ attr_accessor :merchant_id, :email, :secret_word_md5, :password
17
+
18
+ def configure
19
+ yield self
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,56 @@
1
+ require "rexml/document"
2
+
3
+ module Moneybookers::API
4
+ class PayOnDemand
5
+ attr_reader :parameters, :prepare_response, :request_response, :session_id, :mb_transaction_id, :amount, :currency, :status, :status_code
6
+
7
+ def initialize(params={})
8
+ params[:password] ||= Moneybookers.password
9
+ params[:email] ||= Moneybookers.email
10
+ @parameters = params
11
+ end
12
+
13
+ def prepare
14
+ validate_prepare_parameters
15
+ @prepare_response = Moneybookers::Request.new.post("/app/ondemand_request.pl", parameters.merge({:action => "prepare"}))
16
+ handle_prepare_response
17
+ end
18
+
19
+ def request(params={})
20
+ params[:action] ||= "request"
21
+ params[:sid] ||= session_id || raise(ArgumentError.new("You must specify sid for pay-on-demand request transaction"))
22
+ @request_response = Moneybookers::Request.new.post("/app/ondemand_request.pl", params)
23
+ handle_request_response
24
+ end
25
+
26
+ # TODO: handle errors - moneybookers returns 200 with xml error_msg
27
+ def handle_prepare_response
28
+ document = REXML::Document.new(@prepare_response.body)
29
+ raise StandardError.new(document.elements["response/error/error_msg"].text) if document.elements["response/error"]
30
+ @session_id = document.elements["response/sid"].text
31
+ true
32
+ end
33
+
34
+ def handle_request_response
35
+ document = REXML::Document.new(@request_response.body)
36
+ raise StandardError.new(document.elements["response/error/error_msg"].text) if document.elements["response/error"]
37
+ document = document.elements["response/transaction"]
38
+ @mb_transaction_id = document.elements["id"].text
39
+ @amount = document.elements["amount"].text
40
+ @currency = document.elements["currency"].text
41
+ @status = document.elements["status_msg"].text
42
+ @status_code = document.elements["status"].text
43
+ true
44
+ end
45
+
46
+ def validate_prepare_parameters
47
+ [:email, :password, :amount, :currency].each do |attribute|
48
+ raise ArgumentError.new("You must specify #{attribute} for preparing pay-on-demand transaction") unless parameters[attribute]
49
+ end
50
+ if !parameters.has_key?(:rec_payment_id) and !parameters.has_key?(:frn_transaction_id)
51
+ raise ArgumentError.new("You must specify frn_transaction_id or rec_payment_id for preparing pay-on-demand transaction")
52
+ end
53
+ true
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,20 @@
1
+ require "cgi"
2
+
3
+ module Moneybookers::PaymentGateway
4
+ class Client
5
+ attr_reader :response, :parameters
6
+
7
+ def initialize(params={})
8
+ @parameters = params
9
+ end
10
+
11
+ # TODO: validate required params
12
+ def prepare
13
+ @response = Moneybookers::Request.new.post("/app/payment.pl", {:prepare_only => 1}.merge(parameters))
14
+ end
15
+
16
+ def session_id
17
+ CGI::Cookie.parse(response["Set-Cookie"])["SESSION_ID"].first
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ module Moneybookers::PaymentGateway
2
+ class Response
3
+ attr_reader :params
4
+
5
+ def initialize(params)
6
+ raise ArgumentError.new("Params must be passed as a hash") unless params.kind_of?(Hash)
7
+ @params = params
8
+ end
9
+
10
+ def status_code
11
+ params["status"]
12
+ end
13
+
14
+ def status
15
+ case status_code
16
+ when "2" then "processed"
17
+ when "0" then "pending"
18
+ when "-1" then "cancelled"
19
+ when "-2" then "failed"
20
+ when "-3" then "chargeback"
21
+ end
22
+ end
23
+
24
+ def processed?
25
+ status == "processed"
26
+ end
27
+
28
+ def pay_on_demand_authorized?
29
+ processed? and (params["rec_payment_type"] == "on-demand")
30
+ end
31
+
32
+ def pay_on_demand_id
33
+ params["rec_payment_id"] if pay_on_demand_authorized?
34
+ end
35
+
36
+ def amount
37
+ params["mb_amount"]
38
+ end
39
+
40
+ def currency
41
+ params["mb_currency"]
42
+ end
43
+
44
+ def mb_transaction_id
45
+ params["mb_transaction_id"]
46
+ end
47
+
48
+ def signature_verified?(args={})
49
+ Moneybookers::Signature::Status.new(signature_params.merge(args)).match?(params["md5sig"])
50
+ end
51
+
52
+ private
53
+
54
+ def signature_params
55
+ {:transaction_id => params["transaction_id"], :mb_amount => amount, :mb_currency => currency, :status => status_code}
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,33 @@
1
+ require "net/http"
2
+ require "net/https"
3
+ require "uri"
4
+
5
+ module Moneybookers
6
+ class Request
7
+ attr_reader :response, :path
8
+
9
+ def http
10
+ http = Net::HTTP.new(uri.host, uri.port)
11
+ http.use_ssl = true
12
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
13
+ http
14
+ end
15
+
16
+ def uri
17
+ @uri ||= URI.parse(Moneybookers::HOST)
18
+ end
19
+
20
+ def post(to, params={})
21
+ @path = URI.parse(to).path
22
+ @response = http.post(path, prepare_params(params), headers)
23
+ end
24
+
25
+ def prepare_params(params)
26
+ params.map { |k, v| "#{k}=#{v}" }.join("&")
27
+ end
28
+
29
+ def headers
30
+ {"User-Agent" => "ruby-moneybookers-gem"}
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,21 @@
1
+ require "digest/md5"
2
+
3
+ module Moneybookers::Signature
4
+ class Base
5
+ attr_accessor :merchant_id, :transaction_id, :secret_word_md5
6
+
7
+ def initialize(params={})
8
+ self.merchant_id = params.fetch(:merchant_id, Moneybookers.merchant_id) || raise(ArgumentError, "No merchant_id given")
9
+ self.secret_word_md5 = params.fetch(:secret_word_md5, Moneybookers.secret_word_md5) || raise(ArgumentError, "No secret_word_md5 given")
10
+ self.transaction_id = params[:transaction_id] || raise(ArgumentError, "No transaction_id given")
11
+ end
12
+
13
+ def to_s
14
+ Digest::MD5.hexdigest(params.join).upcase
15
+ end
16
+
17
+ def match?(signature)
18
+ to_s == signature
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ module Moneybookers::Signature
2
+ class SecureUrl < Base
3
+ def params
4
+ [merchant_id.to_s, transaction_id.to_s, secret_word_md5.upcase]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module Moneybookers::Signature
2
+ class Status < Base
3
+ attr_accessor :mb_amount, :mb_currency, :status
4
+
5
+ def initialize(params={})
6
+ super
7
+ @mb_amount = params[:mb_amount] || raise(ArgumentError, "No mb_amount given")
8
+ @mb_currency = params[:mb_currency] || raise(ArgumentError, "No mb_currency given")
9
+ @status = params[:status] || raise(ArgumentError, "No status given")
10
+ end
11
+
12
+ def params
13
+ [merchant_id.to_s, transaction_id.to_s, secret_word_md5.upcase, mb_amount.to_s, mb_currency.to_s, status.to_s]
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ module Moneybookers
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "moneybookers/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "moneybookers"
7
+ s.version = Moneybookers::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Wojciech Wnętrzak"]
10
+ s.email = ["w.wnetrzak@gmail.com"]
11
+ s.homepage = "https://github.com/morgoth/moneybookers"
12
+ s.summary = %q{Ruby client for Moneybookers}
13
+ s.description = %q{Ruby client for Moneybookers Automated Payment Interface and Payment Gateway}
14
+
15
+ s.rubyforge_project = "moneybookers"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency("fakeweb")
23
+ end
@@ -0,0 +1,17 @@
1
+ require "helper"
2
+
3
+ describe "Configuration" do
4
+ it "should allow to set custom settings" do
5
+ Moneybookers.configure do |config|
6
+ config.merchant_id = "fake"
7
+ config.email = "john@doe.com"
8
+ config.secret_word_md5 = "md5"
9
+ config.password = "secretmd5"
10
+ end
11
+
12
+ assert_equal "fake", Moneybookers.merchant_id
13
+ assert_equal "john@doe.com", Moneybookers.email
14
+ assert_equal "md5", Moneybookers.secret_word_md5
15
+ assert_equal "secretmd5", Moneybookers.password
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ require "minitest/autorun"
2
+ require "fakeweb"
3
+
4
+ require "moneybookers"
5
+
6
+ class MiniTest::Unit::TestCase
7
+ def setup
8
+ FakeWeb.allow_net_connect = false
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ require "helper"
2
+
3
+ describe "Signature::SecureUrl" do
4
+ it "should be calculated" do
5
+ signature = Moneybookers::Signature::SecureUrl.new({:merchant_id => "20422434", :transaction_id => "s667", :secret_word_md5 => "FB834F96921EA0ACAAB7792BD9A46DD7"})
6
+ assert_equal "1E9B7834103B2DCAD524544622D41E91", signature.to_s
7
+ end
8
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: moneybookers
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - "Wojciech Wn\xC4\x99trzak"
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-01 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: fakeweb
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ type: :development
25
+ version_requirements: *id001
26
+ description: Ruby client for Moneybookers Automated Payment Interface and Payment Gateway
27
+ email:
28
+ - w.wnetrzak@gmail.com
29
+ executables: []
30
+
31
+ extensions: []
32
+
33
+ extra_rdoc_files: []
34
+
35
+ files:
36
+ - .gitignore
37
+ - Gemfile
38
+ - LICENSE
39
+ - README.markdown
40
+ - Rakefile
41
+ - lib/moneybookers.rb
42
+ - lib/moneybookers/api/pay_on_demand.rb
43
+ - lib/moneybookers/payment_gateway/client.rb
44
+ - lib/moneybookers/payment_gateway/response.rb
45
+ - lib/moneybookers/request.rb
46
+ - lib/moneybookers/signature/base.rb
47
+ - lib/moneybookers/signature/secure_url.rb
48
+ - lib/moneybookers/signature/status.rb
49
+ - lib/moneybookers/version.rb
50
+ - moneybookers.gemspec
51
+ - test/config_test.rb
52
+ - test/helper.rb
53
+ - test/signature_test.rb
54
+ homepage: https://github.com/morgoth/moneybookers
55
+ licenses: []
56
+
57
+ post_install_message:
58
+ rdoc_options: []
59
+
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ requirements: []
75
+
76
+ rubyforge_project: moneybookers
77
+ rubygems_version: 1.8.4
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Ruby client for Moneybookers
81
+ test_files: []
82
+