poundpay 0.1.1 → 0.1.2

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.
data/README.rdoc ADDED
@@ -0,0 +1,72 @@
1
+ == Poundpay
2
+
3
+ Poundpay is payments platform for marketplaces
4
+
5
+
6
+ == Adding Poundpay to Rails
7
+
8
+ 1. Add the following to your Gemfile
9
+
10
+ gem 'poundpay', '~> 0.1.2'
11
+
12
+ 2. At the command prompt, install the gem with bundler
13
+
14
+ bundle install
15
+
16
+ 3. Add your Poundpay configuration to config/initializers/poundpay.rb
17
+
18
+ Poundpay.configure(
19
+ "DV0383d447360511e0bbac00264a09ff3c", # developer_sid
20
+ "c31155b9f944d7aed204bdb2a253fef13b4fdcc6ae1540200449cc4526b2381a", # auth_token
21
+ api_url = "https://api-sandbox.poundpay.com" # Note: Leave out for production
22
+ )
23
+
24
+ 4. Protect your callback controller
25
+
26
+ before_filter :verify_poundpay_callback
27
+
28
+
29
+ == Creating a payment
30
+ Adding the payer_sid (from a previous payment), will cause the payer to see
31
+ the repeat flow when they are not prompted to reenter their credit card information
32
+
33
+ @payment = Poundpay::Payment.create(
34
+ :amount => 20000,
35
+ :payer_fee_amount => 0,
36
+ :payer_email_address => "fred@example.com",
37
+ :payer_sid => "97f51e5c38e211e08625e7af17bae06a", # Optional
38
+ :recipient_fee_amount => 500,
39
+ :recipient_email_address => "david@example.com",
40
+ :description => "Beats by Dr. Dre",
41
+ )
42
+
43
+
44
+ == Serving IFRAME
45
+
46
+ <script src="https://www.poundpay.com/js/poundpay.js"></script>
47
+
48
+ <div id="pound-root"></div>
49
+
50
+ <script>
51
+ function handlePaymentSuccess() {
52
+ // do something
53
+ }
54
+
55
+ function handlePaymentError() {
56
+ // handle error
57
+ }
58
+
59
+ PoundPay.init({
60
+ payment_sid: <%= @payment.sid %>,
61
+ success: handlePaymentSuccess,
62
+ error: handlePaymentError,
63
+ cardholder_name: 'Fred Nietzsche', // note: optional
64
+ phone_number: '4085551234', // note: optional
65
+ server: 'https://www-sandbox.poundpay.com' // note: exclude this property when in production
66
+ });
67
+ </script>
68
+
69
+
70
+ == Releasing a payment
71
+
72
+ payment.release
@@ -0,0 +1,36 @@
1
+ require 'base64'
2
+ require 'openssl'
3
+
4
+ module Poundpay
5
+ def self.verified_callback?(signature, params = {})
6
+ # Make a request to Poundpay for callback_url once
7
+ @callback_url = Developer.me.callback_url unless @callback_url
8
+ signature == calculate_signature(@callback_url, params)
9
+ end
10
+
11
+ protected
12
+ def self.calculate_signature(url, params)
13
+ data = url
14
+ @token = Resource.password
15
+ params.sort.each do |name, value|
16
+ data += "#{name}#{value}"
17
+ end
18
+ digest = OpenSSL::Digest::Digest.new('sha1')
19
+ Base64.encode64(OpenSSL::HMAC.digest(digest, @token, data)).strip
20
+ end
21
+ end
22
+
23
+
24
+ module ActionController
25
+ class Base
26
+ protected
27
+ def verify_poundpay_callback
28
+ signature = request.headers['HTTP_X_POUNDPAY_SIGNATURE']
29
+ Poundpay.verified_callback?(signature, request.POST) || handle_unverified_callback
30
+ end
31
+
32
+ def handle_unverified_callback
33
+ raise RoutingError.new('Not Found')
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Poundpay
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/poundpay.rb CHANGED
@@ -1,20 +1,19 @@
1
1
  require 'poundpay/resource'
2
2
  require 'poundpay/elements'
3
+ require 'poundpay/callback'
3
4
 
4
5
  module Poundpay
5
6
  API_URL = "https://api.poundpay.com"
6
7
  API_VERSION = "silver"
7
8
 
8
- class << self
9
- def configure(developer_sid, auth_token, api_url=API_URL, version=API_VERSION)
10
- unless developer_sid.start_with? "DV"
11
- raise ArgumentError.new "developer_sid should start with 'DV'. Make sure " \
12
- "you're using the right developer_sid"
13
- end
14
- api_url.sub! /(\/)$/, "" # Remove trailing backslash
15
- Resource.site = "#{api_url}/#{version}/"
16
- Resource.user = developer_sid
17
- Resource.password = auth_token
9
+ def self.configure(developer_sid, auth_token, api_url=API_URL, version=API_VERSION)
10
+ unless developer_sid.start_with? "DV"
11
+ raise ArgumentError.new "developer_sid should start with 'DV'. Make sure " \
12
+ "you're using the right developer_sid"
18
13
  end
14
+ api_url.sub! /(\/)$/, "" # Remove trailing backslash
15
+ Resource.site = "#{api_url}/#{version}/"
16
+ Resource.user = developer_sid
17
+ Resource.password = auth_token
19
18
  end
20
19
  end
data/poundpay.gemspec CHANGED
@@ -17,9 +17,10 @@ Gem::Specification.new do |s|
17
17
  s.add_dependency("activeresource", ">= 3.0")
18
18
 
19
19
  s.add_development_dependency("rspec", ">= 2.0")
20
+ s.add_development_dependency("wirble")
20
21
 
21
22
  s.files = `git ls-files`.split("\n")
22
23
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
23
24
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
24
25
  s.require_paths = ["lib"]
25
- end
26
+ end
@@ -0,0 +1,11 @@
1
+ module Poundpay
2
+ module CallbackFixture
3
+ def valid_callback
4
+ {
5
+ :url => "http://awesomemarketplace.com/poundpay/callback",
6
+ :params => { "first" => "hello", "second" => "world" },
7
+ :signature => "gsdhVc5rnDSuDt6MX0wm6TrBVng=",
8
+ }
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,37 @@
1
+ require 'poundpay'
2
+ require 'poundpay/callback'
3
+ require 'fixtures/callback'
4
+
5
+ describe Poundpay do
6
+ include Poundpay
7
+ include Poundpay::CallbackFixture
8
+
9
+ before (:all) do
10
+ Poundpay.configure(
11
+ "DV0383d447360511e0bbac00264a09ff3c",
12
+ "c31155b9f944d7aed204bdb2a253fef13b4fdcc6ae1540200449cc4526b2381a")
13
+ end
14
+
15
+ describe ".calculate_signature" do
16
+ it "should calculate the correct signature using HMAC-SHA1" do
17
+ signature = Poundpay.calculate_signature(valid_callback[:url], valid_callback[:params])
18
+ signature.should == valid_callback[:signature]
19
+ end
20
+ end
21
+
22
+ describe ".verified_callback?" do
23
+ before(:all) do
24
+ @developer = Poundpay::Developer.new :callback_url => valid_callback[:url]
25
+ Poundpay::Developer.should_receive(:me).and_return(@developer)
26
+ end
27
+
28
+ it "should validate a valid callback and only make request for callback_url once" do
29
+ Poundpay.verified_callback?(valid_callback[:signature], valid_callback[:params]).should == true
30
+ Poundpay.verified_callback?(valid_callback[:signature], valid_callback[:params]).should == true
31
+ end
32
+
33
+ it "should invalidate an invalid signature" do
34
+ Poundpay.verified_callback?("invalid signature", valid_callback[:params]).should == false
35
+ end
36
+ end
37
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Matin Tamizi
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-02-14 00:00:00 -08:00
17
+ date: 2011-02-15 00:00:00 -08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -45,6 +45,19 @@ dependencies:
45
45
  version: "2.0"
46
46
  type: :development
47
47
  version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: wirble
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 0
58
+ version: "0"
59
+ type: :development
60
+ version_requirements: *id003
48
61
  description: Payments platform for marketplaces
49
62
  email: devsupport@poundpay.com
50
63
  executables: []
@@ -59,7 +72,7 @@ files:
59
72
  - .rspec
60
73
  - .rvmrc
61
74
  - Gemfile
62
- - README.mkd
75
+ - README.rdoc
63
76
  - Rakefile
64
77
  - examples/simple_application/.gems
65
78
  - examples/simple_application/.rvmrc
@@ -69,13 +82,16 @@ files:
69
82
  - examples/simple_application/config.ru
70
83
  - examples/simple_application/index.html.erb
71
84
  - lib/poundpay.rb
85
+ - lib/poundpay/callback.rb
72
86
  - lib/poundpay/elements.rb
73
87
  - lib/poundpay/formats.rb
74
88
  - lib/poundpay/resource.rb
75
89
  - lib/poundpay/version.rb
76
90
  - poundpay.gemspec
91
+ - spec/fixtures/callback.rb
77
92
  - spec/fixtures/developers.rb
78
93
  - spec/fixtures/payments.rb
94
+ - spec/poundpay/callback_spec.rb
79
95
  - spec/poundpay/elements_spec.rb
80
96
  - spec/poundpay/formats_spec.rb
81
97
  - spec/poundpay/resource_spec.rb
@@ -113,8 +129,10 @@ signing_key:
113
129
  specification_version: 3
114
130
  summary: Poundpay Ruby library
115
131
  test_files:
132
+ - spec/fixtures/callback.rb
116
133
  - spec/fixtures/developers.rb
117
134
  - spec/fixtures/payments.rb
135
+ - spec/poundpay/callback_spec.rb
118
136
  - spec/poundpay/elements_spec.rb
119
137
  - spec/poundpay/formats_spec.rb
120
138
  - spec/poundpay/resource_spec.rb
data/README.mkd DELETED
@@ -1,61 +0,0 @@
1
- Poundpay
2
- ========
3
-
4
-
5
- Install
6
- -------
7
- gem install poundpay
8
-
9
-
10
- Configure
11
- ---------
12
- Poundpay.configure(
13
- "developer_sid",
14
- "auth_token",
15
- api_url = "https://api-sandbox.poundpay.com", # Note: Leave out for production
16
- )
17
-
18
-
19
- Creating a payment
20
- ------------------
21
- require 'poundpay'
22
-
23
- payment = Poundpay::Payment.create(
24
- :amount => 20000,
25
- :payer_fee_amount => 0,
26
- :payer_email_address => "fred@example.com",
27
- :recipient_fee_amount => 500,
28
- :recipient_email_address => "david@example.com",
29
- :description => "Beats by Dr. Dre",
30
- )
31
-
32
- Serving iframe
33
- ---------------
34
- <script src="https://www.poundpay.com/js/poundpay.js"></script>
35
-
36
- <div id="pound-root"></div>
37
-
38
- <script>
39
- function handlePaymentSuccess() {
40
- // do something
41
- }
42
-
43
- function handlePaymentError() {
44
- // handle error
45
- }
46
-
47
- PoundPay.init({
48
- payment_sid: <%= payment.sid %>,
49
- success: handlePaymentSuccess,
50
- error: handlePaymentError,
51
- cardholder_name: 'Fred Nietzsche', // note: optional
52
- phone_number: '4085551234', // note: optional
53
- server: 'https://www-sandbox.poundpay.com' // note: exclude this property when in production
54
- });
55
- </script>
56
-
57
-
58
- Releasing a payment
59
- ------------------
60
- payment.release
61
- payment.save!