smart_pay 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md ADDED
@@ -0,0 +1,43 @@
1
+ ## SmartPay
2
+
3
+ Provides HMAC signing and verification when passing parameters
4
+ to and from Barclays SmartPay hosted payment pages.
5
+
6
+ More information can be found in the [SmartPay hosted payment process integration guide](http://www.barclaycard.com/smartpay/documentation/pdf/SmartPay_HPP_IntegrationGuide.pdf)
7
+
8
+ ### Usage
9
+ ```
10
+ req = SmartPay::Request.new("Kah942*$7sdp0)", {
11
+ :merchant_reference => "Internet Order 12345",
12
+ :payment_amount => 10000,
13
+ :currency_code => "GBP",
14
+ :ship_before_date => "2007-10-20",
15
+ :skin_code => "4aD37dJA",
16
+ :merchant_account => "TestMerchant",
17
+ :shopper_locale => "en_GB",
18
+ :order_data => "H4sIAAAAAAAAALMpsOPlCkssyswvLVZIz89PKVZIzEtRKE4tKstMTi3W4+Wy0S+wAwDOGUCXJgAAAA==",
19
+ :session_validity => "2007-10-11T11:00:00Z",
20
+ :merchant_signature => "yARtfsxD47jeXzOlEyZ0j3pg="
21
+ })
22
+ req.hmac_signature # => 'x58ZcRVL1H6y+XSeBGrySJ9ACVo=\n'
23
+
24
+
25
+ res = SmartPay::Response.new("Kah942*$7sdp0)", {
26
+ :merchant_reference => "Internet Order 12345",
27
+ :skin_code => "4aD37dJA",
28
+ :shopper_locale => "en_GB",
29
+ :auth_result => "AUTHORISED",
30
+ :psp_reference => "1211992213193029",
31
+ :merchant_sig => "ytt3QxWoEhAskUzUne0P5VA9lPw="
32
+ })
33
+ res.verified # => true
34
+ ```
35
+
36
+ ### Contributing
37
+
38
+ 1. Fork it
39
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
40
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
41
+ 4. Run the tests (`bundle exec rake`)
42
+ 5. Push to the branch (`git push origin my-new-feature`)
43
+ 6. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env rake
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ Bundler::GemHelper.install_tasks
10
+
11
+ require 'rake/testtask'
12
+
13
+ require 'gem_publisher'
14
+ Rake::TestTask.new(:test) do |t|
15
+ t.libs << 'lib'
16
+ t.libs << 'test'
17
+ t.pattern = 'test/**/*_test.rb'
18
+ t.verbose = false
19
+ end
20
+
21
+ task :publish_gem do |t|
22
+ gem = GemPublisher.publish_if_updated("smart_pay.gemspec", :rubygems)
23
+ puts "Published #{gem}" if gem
24
+ end
25
+
26
+ task :default => :test
data/lib/smart_pay.rb ADDED
@@ -0,0 +1,21 @@
1
+ require 'smart_pay/request'
2
+ require 'smart_pay/response'
3
+
4
+ module SmartPay
5
+
6
+ def self.test_mode=(test_mode)
7
+ @@test_mode = test_mode
8
+ end
9
+
10
+ def self.test_mode
11
+ !!@@test_mode
12
+ end
13
+
14
+ def self.ordered_parameters(ordered_keys, parameters)
15
+ [].tap do |ary|
16
+ ordered_keys.each do |k|
17
+ ary << parameters[k] if parameters[k]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,28 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+
4
+ module SmartPay
5
+ class HmacCalculator
6
+ def initialize(psk, parameters)
7
+ @psk = psk
8
+ @parameters = parameters
9
+ end
10
+
11
+ def signature
12
+ raise_if_key_missing
13
+ hmac = OpenSSL::HMAC.digest('sha1', @psk, @parameters.join)
14
+ Base64.encode64(hmac)
15
+ end
16
+
17
+ def verify(merchant_sig)
18
+ raise_if_key_missing
19
+ "#{merchant_sig}\n" == signature
20
+ end
21
+
22
+ private
23
+
24
+ def raise_if_key_missing
25
+ raise "missing or empty pre-shared key" unless @psk && @psk.length > 0
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'hmac_calculator'
2
+
3
+ module SmartPay
4
+ class Request
5
+
6
+ TEST_URL = "https://test.barclaycardsmartpay.com/hpp/pay.shtml"
7
+ LIVE_URL = "https://live.barclaycardsmartpay.com/hpp/pay.shtml"
8
+ ORDERED_KEYS = [:payment_amount, :currency_code, :ship_before_date, :merchant_reference,
9
+ :skin_code, :merchant_account, :session_validity, :shopper_email, :shopper_reference,
10
+ :allowed_methods, :blocked_methods, :shopper_statement, :billing_address_type]
11
+
12
+ def initialize(shared_key, parameters = {})
13
+ @shared_key = shared_key
14
+ @parameters = SmartPay.ordered_parameters(ORDERED_KEYS, parameters)
15
+ end
16
+
17
+ def hmac_signature
18
+ SmartPay::HmacCalculator.new(@shared_key, @parameters).signature
19
+ end
20
+
21
+ def request_url
22
+ SmartPay.test_mode ? TEST_URL : LIVE_URL
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'hmac_calculator'
2
+
3
+ module SmartPay
4
+ class Response
5
+
6
+ attr_reader :parameters
7
+
8
+ ORDERED_KEYS = [:auth_result, :psp_reference, :merchant_reference,
9
+ :skin_code, :merchant_return_data]
10
+
11
+ def initialize(shared_key, parameters = {})
12
+ raise "Response signature not found" unless parameters.has_key?(:merchant_sig)
13
+ @shared_key = shared_key
14
+ @merchant_sig = parameters.delete(:merchant_sig)
15
+ @parameters = SmartPay.ordered_parameters(ORDERED_KEYS, parameters)
16
+ end
17
+
18
+ def verified
19
+ SmartPay::HmacCalculator.new(@shared_key, @parameters).verify(@merchant_sig)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,4 @@
1
+ module SmartPay
2
+ # Changing this causes Jenkins to tag and release the gem into the wild
3
+ VERSION = "0.1"
4
+ end
@@ -0,0 +1,33 @@
1
+ require 'test_helper'
2
+
3
+ describe SmartPay::Request do
4
+ before do
5
+ SmartPay.test_mode = true
6
+ @shared_key = "Kah942*$7sdp0)"
7
+ @parameters = {
8
+ :merchant_reference => "Internet Order 12345",
9
+ :payment_amount => 10000,
10
+ :currency_code => "GBP",
11
+ :ship_before_date => "2007-10-20",
12
+ :skin_code => "4aD37dJA",
13
+ :merchant_account => "TestMerchant",
14
+ :shopper_locale => "en_GB",
15
+ :order_data => "H4sIAAAAAAAAALMpsOPlCkssyswvLVZIz89PKVZIzEtRKE4tKstMTi3W4+Wy0S+wAwDOGUCXJgAAAA==",
16
+ :session_validity => "2007-10-11T11:00:00Z",
17
+ :merchant_signature => "yARtfsxD47jeXzOlEyZ0j3pg="
18
+ }
19
+ end
20
+
21
+ # Based on example in http://www.barclaycard.com/smartpay/documentation/pdf/SmartPay_HPP_IntegrationGuide.pdf
22
+ it "should calculate the correct hmac signature" do
23
+ request = SmartPay::Request.new(@shared_key, @parameters)
24
+ assert_equal "x58ZcRVL1H6y+XSeBGrySJ9ACVo=\n", request.hmac_signature
25
+ end
26
+
27
+ it "should use the appropriate request URL" do
28
+ SmartPay.test_mode = false
29
+ assert_equal SmartPay::Request::LIVE_URL, SmartPay::Request.new(nil).request_url
30
+ SmartPay.test_mode = true
31
+ assert_equal SmartPay::Request::TEST_URL, SmartPay::Request.new(nil).request_url
32
+ end
33
+ end
@@ -0,0 +1,20 @@
1
+ require 'test_helper'
2
+
3
+ describe SmartPay::Response do
4
+ before do
5
+ SmartPay.test_mode = true
6
+ @shared_key = "Kah942*$7sdp0)"
7
+ @parameters = {
8
+ :merchant_reference => "Internet Order 12345",
9
+ :skin_code => "4aD37dJA",
10
+ :shopper_locale => "en_GB",
11
+ :auth_result => "AUTHORISED",
12
+ :psp_reference => "1211992213193029",
13
+ :merchant_sig => "ytt3QxWoEhAskUzUne0P5VA9lPw="
14
+ }
15
+ end
16
+ it "should verify the response parameters" do
17
+ response = SmartPay::Response.new(@shared_key, @parameters)
18
+ assert response.verified, "Merchant signature is incorrect"
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: smart_pay
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.1'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steve Laing
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-11-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rdoc
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - '='
20
+ - !ruby/object:Gem::Version
21
+ version: '3.12'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - '='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.12'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - '='
36
+ - !ruby/object:Gem::Version
37
+ version: 10.1.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - '='
44
+ - !ruby/object:Gem::Version
45
+ version: 10.1.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: gem_publisher
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - '='
52
+ - !ruby/object:Gem::Version
53
+ version: 1.2.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.0
62
+ description:
63
+ email: steve.laing@digital.cabinet-office.gov.uk
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files: []
67
+ files:
68
+ - lib/smart_pay.rb
69
+ - lib/smart_pay/hmac_calculator.rb
70
+ - lib/smart_pay/version.rb
71
+ - lib/smart_pay/request.rb
72
+ - lib/smart_pay/response.rb
73
+ - Rakefile
74
+ - README.md
75
+ - test/request_test.rb
76
+ - test/response_test.rb
77
+ homepage:
78
+ licenses: []
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ! '>='
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ segments:
90
+ - 0
91
+ hash: 3111097971645311082
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ! '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ segments:
99
+ - 0
100
+ hash: 3111097971645311082
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 1.8.23
104
+ signing_key:
105
+ specification_version: 3
106
+ summary: Ruby library for handling Barclaycard Smartpay requests and responses
107
+ test_files:
108
+ - test/request_test.rb
109
+ - test/response_test.rb