paypal_adaptive 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,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ config
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Tommy Chheng
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,68 @@
1
+ # paypal_adaptive
2
+ This gem is a lightweight wrapper for the paypal adaptive payments API.
3
+
4
+ This is very much a work in progress! Use at your own risk or submit bug fixes :)
5
+
6
+ Before you need start, download pp_adaptivepayments.pdf and IPNGuide.pdf from the Paypal's dev site http://x.com
7
+ It'll be invaluable in determining how certain things work and error messages.
8
+
9
+ ## HOWTO
10
+ Create paypal_adaptive.yml to your config folder:
11
+ development:
12
+ environment: "sandbox"
13
+ username: "sandbox_username"
14
+ password: "sandbox_password"
15
+ signature: "sandbox_signature"
16
+ application_id: "sandbox_app_id"
17
+
18
+ test:
19
+ environment: "sandbox"
20
+ username: "sandbox_username"
21
+ password: "sandbox_password"
22
+ signature: "sandbox_signature"
23
+ application_id: "sandbox_app_id"
24
+
25
+ production:
26
+ environment: "production"
27
+ username: "my_production_username"
28
+ password: "my_production_password"
29
+ signature: "my_production_signature"
30
+ application_id: "my_production_app_id"
31
+
32
+ Make the payment request:
33
+
34
+ pay_request = PaypalAdaptive::PayRequest.new
35
+
36
+ data = {
37
+ "returnUrl" => "http://testserver.com/payments/completed_payment_request",
38
+ "requestEnvelope" => {"errorLanguage" => "en_US"},
39
+ "currencyCode"=>"USD",
40
+ "receiverList"=>{"receiver"=>[{"email"=>"testpp_1261697850_per@nextsprocket.com", "amount"=>"10.00"}]},
41
+ "cancelUrl"=>"http://testserver.com/payments/canceled_payment_request",
42
+ "actionType"=>"PAY",
43
+ "ipnNotificationUrl"=>"http://testserver.com/payments/ipn_notification"
44
+ }
45
+
46
+ pp_response = pay_request.pay(data)
47
+
48
+ if pp_response.success?
49
+ redirect_to pp_response.approve_paypal_payment_url
50
+ else
51
+ puts pp_response.errors.first['message']
52
+ redirect_to failed_payment
53
+ end
54
+
55
+ ---
56
+ Once the user goes to pp_response.approve_paypal_payment_url, they will be prompted to login to Paypal for payment.
57
+
58
+ Upon payment completion page, they will be redirected to http://testserver.com/payments/completed_payment_request.
59
+
60
+ They can also click cancel to go to http://testserver.com/payments/canceled_payment_request
61
+
62
+ The actual payment details will be sent to your server via "ipnNotificationUrl"
63
+ You have to create a listener to receive POST messages from paypal. I added a Rails metal template in the templates folder which handles the callbcak.
64
+
65
+
66
+ ## Copyright
67
+
68
+ Copyright (c) 2009 Tommy Chheng. See LICENSE for details.
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "paypal_adaptive"
9
+ gem.summary = %Q{initial import}
10
+ gem.description = %Q{Lightweight wrapper for Paypal's Adaptive Payments API.}
11
+ gem.email = "tommy.chheng@gmail.com"
12
+ gem.homepage = "http://github.com/tc/paypal_adaptive"
13
+ gem.authors = ["Tommy Chheng"]
14
+ gem.add_development_dependency "json", ">= 0"
15
+ gem.add_development_dependency "jsonschema", ">= 0"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "paypal_adaptive #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,53 @@
1
+ module PaypalAdaptive
2
+ class Config
3
+ PAYPAL_BASE_URL_MAPPING = {
4
+ :production => "https://www.paypal.com",
5
+ :sandbox => "https://www.sandbox.paypal.com",
6
+ :beta_sandbox => "https://www.beta-sandbox.paypal.com"
7
+ }
8
+ API_BASE_URL_MAPPING= {
9
+ :production => "https://svcs.paypal.com",
10
+ :sandbox => "https://svcs.sandbox.paypal.com",
11
+ :beta_sandbox => "https://svcs.beta-sandbox.paypal.com"
12
+ }
13
+
14
+ attr_accessor :config_filepath, :paypal_base_url, :api_base_url, :headers
15
+
16
+ def initialize(env=nil)
17
+ if env
18
+ #non-rails env
19
+ @config_filepath = "../config/paypal_adaptive.yml"
20
+ load(env)
21
+ else
22
+ @config_filepath = File.join(Rails.root, "config/paypal_adaptive.yml")
23
+ load(Rails.env)
24
+ end
25
+ end
26
+
27
+ def load(rails_env)
28
+ config= YAML.load_file(@config_filepath)[rails_env]
29
+
30
+ if config["retain_requests_for_test"] == true
31
+ @retain_requests_for_test = true
32
+ else
33
+ pp_env = config['environment'].to_sym
34
+
35
+ @paypal_base_url = PAYPAL_BASE_URL_MAPPING[pp_env]
36
+ @api_base_url = API_BASE_URL_MAPPING[pp_env]
37
+ @headers = {
38
+ "X-PAYPAL-SECURITY-USERID" => config['username'],
39
+ "X-PAYPAL-SECURITY-PASSWORD" => config['password'],
40
+ "X-PAYPAL-SECURITY-SIGNATURE" => config['signature'],
41
+ "X-PAYPAL-APPLICATION-ID" => config['application_id'],
42
+ "X-PAYPAL-REQUEST-DATA-FORMAT" => "JSON",
43
+ "X-PAYPAL-RESPONSE-DATA-FORMAT" => "JSON"
44
+ }
45
+ end
46
+ end
47
+
48
+ def retain_requests_for_test?
49
+ !!@retain_requests_for_test
50
+ end
51
+
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'json'
4
+ require 'config'
5
+
6
+ module PaypalAdaptive
7
+ class IpnNotification
8
+
9
+ def initialize(env=nil)
10
+ @env = env
11
+ @@config ||= PaypalAdaptive::Config.new(@env)
12
+ @@paypal_base_url ||= @@config.paypal_base_url
13
+ end
14
+
15
+ def send_back(data)
16
+ data = "cmd=_notify-validate&#{data}"
17
+ url = URI.parse @@paypal_base_url
18
+ http = Net::HTTP.new(url.host, 443)
19
+ http.use_ssl = (url.scheme == 'https')
20
+
21
+ path = "#{@@paypal_base_url}/cgi-bin/webscr"
22
+ resp, response_data = http.post(path, data)
23
+
24
+ @verified = response_data == "VERIFIED"
25
+ end
26
+
27
+ def verified?
28
+ @verified
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,85 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'json'
4
+ require 'config'
5
+ require 'pay_response'
6
+
7
+ module PaypalAdaptive
8
+ class NoDataError < Exception
9
+ end
10
+
11
+ class PayRequest
12
+ attr_accessor :pay_key
13
+ attr_accessor :errors
14
+ attr_accessor :env
15
+
16
+ def initialize(env = nil)
17
+ @env = env
18
+ @@config ||= PaypalAdaptive::Config.new(@env)
19
+ @@api_base_url ||= @@config.api_base_url
20
+ @@headers ||= @@config.headers
21
+ end
22
+
23
+ def validate
24
+ #TODO the receiverList field not validating properly
25
+
26
+ # @@schema_filepath = "../lib/pay_request_schema.json"
27
+ # @@schema = File.open(@@schema_filepath, "rb"){|f| JSON.parse(f.read)}
28
+ # see page 42 of PP Adaptive Payments PDF for explanation of all fields.
29
+ #JSON::Schema.validate(@data, @@schema)
30
+ end
31
+
32
+ def pay(data)
33
+ raise NoDataError unless data
34
+
35
+ call_api(data, "/AdaptivePayments/Pay")
36
+ end
37
+
38
+ def payment_details(data)
39
+ raise NoDataError unless data
40
+
41
+ call_api(data, "/AdaptivePayments/PaymentDetails")
42
+ end
43
+
44
+ def preapproval(data)
45
+ raise NoDataError unless data
46
+
47
+ call_api(data, "/AdaptivePayments/Preapproval")
48
+ end
49
+
50
+ def preapproval_details(data)
51
+ raise NoDataError unless data
52
+
53
+ call_api(data, "/AdaptivePayments/PreapprovalDetails")
54
+ end
55
+
56
+ def cancel_preapproval(data)
57
+ raise NoDataError unless data
58
+
59
+ call_api(data, "/AdaptivePayments/CancelPreapproval")
60
+ end
61
+
62
+ def convert_currency(data)
63
+ raise NoDataError unless data
64
+
65
+ call_api(data, "/AdaptivePayments/ConvertCurrency")
66
+ end
67
+
68
+ def refund(data)
69
+ raise NoDataError unless data
70
+
71
+ call_api(data, "/AdaptivePayments/Refund")
72
+ end
73
+
74
+ def call_api(data, path)
75
+ #hack fix: JSON.unparse doesn't work in Rails 2.3.5; only {}.to_json does..
76
+ api_request_data = JSON.unparse(data) rescue data.to_json
77
+ url = URI.parse @@api_base_url
78
+ http = Net::HTTP.new(url.host, 443)
79
+ http.use_ssl = (url.scheme == 'https')
80
+
81
+ resp, response_data = http.post(path, api_request_data, @@headers)
82
+ pp_response = PaypalAdaptive::PayResponse.new(response_data, @env)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,39 @@
1
+ {"description":"Paypal PayRequest API",
2
+ "type":"object",
3
+ "properties":
4
+ {
5
+ "actionType": {"type":"string", "options":[{"value":"PAY", "label":"PAY"}]},
6
+ "cancelUrl": {"type":"string"},
7
+ "clientDetails": {"type":"object", "optional": true},
8
+ "currencyCode": {"type":"string"},
9
+ "feesPayer": {"type":"string", "optional":true,
10
+ "options":[
11
+ {"value":"SENDER", "label":"SENDER"},
12
+ {"value":"PRIMARYRECEIVER", "label":"PRIMARYRECEIVER"},
13
+ {"value":"EACHRECEIVER", "label":"EACHRECEIVER"},
14
+ {"value":"SECONDARYONLY", "label":"SECONDARYONLY"}
15
+ ]},
16
+ "fundingConstraint": {"type":"object", "optional": true},
17
+ "ipnNotificationUrl": {"type":"string", "optional": true},
18
+ "memo": {"type":"string", "optional": true},
19
+ "pin": {"type":"string", "optional": true},
20
+ "preapprovalKey": {"type":"string", "optional": true},
21
+ "receiverList": {
22
+ "type":"object", "properties":{
23
+ "receiver":{
24
+ "type":"array",
25
+ "items":{
26
+ "email":{"type":"string"},
27
+ "amount":{"type":"string"},
28
+ "primary":{"type":"string","optional": true}}
29
+ }
30
+ }
31
+ },
32
+
33
+ "requestEnvelope": {"type":"object", "properties":{"errorLanguage":{"type":"string"}}},
34
+ "returnUrl": {"type":"string"},
35
+ "reverseAllParallelPaymentsOnError": {"type":"boolean", "optional": true},
36
+ "senderEmail": {"type":"string", "optional": true},
37
+ "trackingId": {"type":"string", "optional": true}
38
+ }
39
+ }
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+
3
+ module PaypalAdaptive
4
+ class PayResponse
5
+ def initialize(response, env=nil)
6
+ @@config ||= PaypalAdaptive::Config.new(env)
7
+ @@paypal_base_url ||= @@config.paypal_base_url
8
+
9
+ @json_response = JSON.parse(response)
10
+ end
11
+
12
+ def success?
13
+ @json_response['responseEnvelope']['ack'] == 'Success'
14
+ end
15
+
16
+ def pay_key
17
+ @json_response['payKey']
18
+ end
19
+
20
+ def errors
21
+ if success?
22
+ return []
23
+ else
24
+ @json_response['error']
25
+ end
26
+ end
27
+
28
+ def approve_paypal_payment_url
29
+ "#{@@paypal_base_url}/webscr?cmd=_ap-payment&paykey=#{pay_key}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,4 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "config"))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), "pay_request"))
3
+ require File.expand_path(File.join(File.dirname(__FILE__), "pay_response"))
4
+ require File.expand_path(File.join(File.dirname(__FILE__), "ipn_notification"))
@@ -0,0 +1,71 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{paypal_adaptive}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Tommy Chheng"]
12
+ s.date = %q{2009-12-25}
13
+ s.description = %q{Lightweight wrapper for Paypal's Adaptive Payments API.}
14
+ s.email = %q{tommy.chheng@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.markdown"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "README.markdown",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "config/paypal_adaptive.yml",
26
+ "lib/config.rb",
27
+ "lib/ipn_notification.rb",
28
+ "lib/pay_request.rb",
29
+ "lib/pay_request_schema.json",
30
+ "lib/pay_response.rb",
31
+ "lib/paypal_adaptive.rb",
32
+ "paypal_adaptive.gemspec",
33
+ "templates/paypal_ipn.rb",
34
+ "test/data/invalid_chain_pay_request.json",
35
+ "test/data/invalid_parallel_pay_request.json",
36
+ "test/data/invalid_simple_pay_request_1.json",
37
+ "test/data/valid_chain_pay_request.json",
38
+ "test/data/valid_parallel_pay_request.json",
39
+ "test/data/valid_simple_pay_request_1.json",
40
+ "test/helper.rb",
41
+ "test/pay_request_schema_test.rb",
42
+ "test/pay_request_test.rb"
43
+ ]
44
+ s.homepage = %q{http://github.com/tc/paypal_adaptive}
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_paths = ["lib"]
47
+ s.rubygems_version = %q{1.3.5}
48
+ s.summary = %q{initial import}
49
+ s.test_files = [
50
+ "test/helper.rb",
51
+ "test/pay_request_schema_test.rb",
52
+ "test/pay_request_test.rb"
53
+ ]
54
+
55
+ if s.respond_to? :specification_version then
56
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
57
+ s.specification_version = 3
58
+
59
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
60
+ s.add_development_dependency(%q<json>, [">= 0"])
61
+ s.add_development_dependency(%q<jsonschema>, [">= 0"])
62
+ else
63
+ s.add_dependency(%q<json>, [">= 0"])
64
+ s.add_dependency(%q<jsonschema>, [">= 0"])
65
+ end
66
+ else
67
+ s.add_dependency(%q<json>, [">= 0"])
68
+ s.add_dependency(%q<jsonschema>, [">= 0"])
69
+ end
70
+ end
71
+
@@ -0,0 +1,25 @@
1
+ # Allow the metal piece to run in isolation
2
+ require(File.dirname(__FILE__) + "/../../config/environment") unless defined?(Rails)
3
+
4
+ class PaypalIpn
5
+ def self.call(env)
6
+ if env["PATH_INFO"] =~ /^\/paypal_ipn/
7
+ request = Rack::Request.new(env)
8
+ params = request.params
9
+
10
+ ipn = PaypalAdaptive::IpnNotification.new
11
+ ipn.send_back(env['QUERY_STRING'])
12
+ if ipn.verified?
13
+ #mark transaction as completed in your DB
14
+ output = "Verified."
15
+ else
16
+ output = "Not Verified."
17
+ end
18
+
19
+ [200, {"Content-Type" => "text/html"}, [output]]
20
+ else
21
+ [404, {"Content-Type" => "text/html"}, ["Not Found"]]
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,13 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[
6
+ {"email":"testpp_1261697850_per@nextsprocket.com", "amount":"50.00", "primary": "true"},
7
+ {"email":"sender_1261713739_per@nextsprocket.com", "amount":"100.00", "primary": "false"},
8
+ {"email":"ppsell_1261697921_biz@nextsprocket.com", "amount":"100.00", "primary": "false"}
9
+ ]},
10
+ "cancelUrl":"http://127.0.0.1:3000/payments/cancelled_payment",
11
+ "actionType":"PAY"
12
+ }
13
+
@@ -0,0 +1,13 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[
6
+ {"email":"dummy@account.com", "amount":"100.00"},
7
+ {"email":"dummy@account.com", "amount":"50.00"},
8
+ {"email":"dummy@account.com", "amount":"50.00"}
9
+ ]},
10
+ "cancelUrl":"http://127.0.0.1:3000/payments/cancelled_payment",
11
+ "actionType":"PAY"
12
+ }
13
+
@@ -0,0 +1,8 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[{"email":"testpp_1261697850_per@nextsprocket.com", "amount":"10.0"}]},
6
+ "cancelUrl":"http://127.0.0.1:3000/payments/canceled_payment",
7
+ "actionType":1
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment_request",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[
6
+ {"email":"testpp_1261697850_per@nextsprocket.com", "amount":"100.00", "primary": "true"},
7
+ {"email":"sender_1261713739_per@nextsprocket.com", "amount":"50.00", "primary": "false"},
8
+ {"email":"ppsell_1261697921_biz@nextsprocket.com", "amount":"50.00", "primary": "false"}
9
+ ]},
10
+ "cancelUrl":"http://127.0.0.1:3000/payments/canceled_payment_request",
11
+ "actionType":"PAY"
12
+ }
13
+
@@ -0,0 +1,14 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment_request",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[
6
+ {"email":"testpp_1261697850_per@nextsprocket.com", "amount":"100.00"},
7
+ {"email":"sender_1261713739_per@nextsprocket.com", "amount":"50.00"},
8
+ {"email":"ppsell_1261697921_biz@nextsprocket.com", "amount":"50.00"}
9
+ ]},
10
+ "cancelUrl":"http://127.0.0.1:3000/payments/canceled_payment_request",
11
+ "actionType":"PAY",
12
+ "senderEmail": "a@a.com"
13
+ }
14
+
@@ -0,0 +1,9 @@
1
+ {
2
+ "returnUrl":"http://127.0.0.1:3000/payments/completed_payment_request",
3
+ "requestEnvelope":{"errorLanguage":"en_US"},
4
+ "currencyCode":"USD",
5
+ "receiverList":{"receiver":[{"email":"testpp_1261697850_per@nextsprocket.com", "amount":"10.00"}]},
6
+ "cancelUrl":"http://127.0.0.1:3000/payments/canceled_payment_request",
7
+ "actionType":"PAY",
8
+ "ipnNotificationUrl":"http://127.0.0.1:3000/payments/ipn_notification"
9
+ }
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
@@ -0,0 +1,49 @@
1
+ require 'helper'
2
+ require 'json'
3
+ require 'jsonschema'
4
+
5
+ class PayRequestSchemaTest < Test::Unit::TestCase
6
+ def setup
7
+ @schema_filepath = "../lib/pay_request_schema.json"
8
+ @schema = File.open(@schema_filepath, "rb"){|f| JSON.parse(f.read)}
9
+ end
10
+
11
+ def test_valid_simple_pay
12
+ data_filepath = "data/valid_simple_pay_request_1.json"
13
+ data = read_json_file(data_filepath)
14
+
15
+ #receiverList not validating correctly, is it due to the schema or jsonschema parsing?
16
+ assert_nothing_raised do
17
+ JSON::Schema.validate(data, @schema)
18
+ end
19
+ end
20
+
21
+ def test_invalid_simple_pay
22
+ data_filepath = "data/invalid_simple_pay_request_1.json"
23
+ data = read_json_file(data_filepath)
24
+
25
+ assert_raise JSON::Schema::ValueError do
26
+ JSON::Schema.validate(data, @schema)
27
+ end
28
+ end
29
+
30
+ def test_valid_chain_pay
31
+ #TODO
32
+ end
33
+
34
+ def test_invalid_chain_pay
35
+ #TODO
36
+ end
37
+
38
+ def test_valid_parallel_pay
39
+ #TODO
40
+ end
41
+
42
+ def test_invalid_parallel_pay
43
+ #TODO
44
+ end
45
+
46
+ def read_json_file(filepath)
47
+ File.open(filepath, "rb"){|f| JSON.parse(f.read)}
48
+ end
49
+ end
@@ -0,0 +1,100 @@
1
+ require 'helper'
2
+ require '../lib/pay_request'
3
+
4
+ class PayRequestTest < Test::Unit::TestCase
5
+ def setup
6
+ @pay_request = PaypalAdaptive::PayRequest.new("test")
7
+ end
8
+
9
+ def test_valid_simple_pay
10
+ puts "-------"
11
+ puts "simple"
12
+
13
+ data_filepath = "../test/data/valid_simple_pay_request_1.json"
14
+
15
+ data = read_json_file(data_filepath)
16
+ pp_response = @pay_request.pay(data)
17
+
18
+ puts "redirect url to\n #{pp_response.approve_paypal_payment_url}"
19
+ assert pp_response.success?
20
+ end
21
+
22
+ def test_invalid_simple_pay
23
+ data_filepath = "../test/data/invalid_simple_pay_request_1.json"
24
+
25
+ data = read_json_file(data_filepath)
26
+ pp_response = @pay_request.pay(data)
27
+ puts pp_response.errors
28
+ assert pp_response.success? == false
29
+ end
30
+
31
+ def test_valid_chain_pay
32
+ puts "-------"
33
+ puts "chain"
34
+ data_filepath = "../test/data/valid_chain_pay_request.json"
35
+
36
+ data = read_json_file(data_filepath)
37
+ pp_response = @pay_request.pay(data)
38
+ puts "redirect url to\n #{pp_response.approve_paypal_payment_url}"
39
+ assert pp_response.success?
40
+ end
41
+
42
+ def test_invalid_chain_pay
43
+ data_filepath = "../test/data/invalid_chain_pay_request.json"
44
+
45
+ data = read_json_file(data_filepath)
46
+ pp_response = @pay_request.pay(data)
47
+ puts pp_response.errors
48
+ assert pp_response.success? == false
49
+ end
50
+
51
+ def test_valid_parallel_pay
52
+ puts "-------"
53
+ puts "parallel"
54
+
55
+ data_filepath = "../test/data/valid_chain_pay_request.json"
56
+
57
+ data = read_json_file(data_filepath)
58
+ pp_response = @pay_request.pay(data)
59
+ puts "redirect url to\n #{pp_response.approve_paypal_payment_url}"
60
+ assert pp_response.success?
61
+ end
62
+
63
+ def test_invalid_parallel_pay
64
+ data_filepath = "../test/data/invalid_parallel_pay_request.json"
65
+
66
+ data = read_json_file(data_filepath)
67
+ pp_response = @pay_request.pay(data)
68
+ puts pp_response.errors
69
+ assert pp_response.success? == false
70
+ end
71
+
72
+ def test_payment_details
73
+ #TODO
74
+ end
75
+
76
+ def test_preapproval
77
+ #TODO
78
+ end
79
+
80
+ def test_preapproval_details
81
+ #TODO
82
+ end
83
+
84
+ def test_cancel_preapproval
85
+ #TODO
86
+ end
87
+
88
+ def test_convert_currency
89
+ #TODO
90
+ end
91
+
92
+ def test_refund
93
+ #TODO
94
+ end
95
+
96
+ def read_json_file(filepath)
97
+ File.open(filepath, "rb"){|f| JSON.parse(f.read)}
98
+ end
99
+
100
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paypal_adaptive
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tommy Chheng
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-25 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: jsonschema
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description: Lightweight wrapper for Paypal's Adaptive Payments API.
36
+ email: tommy.chheng@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.markdown
44
+ files:
45
+ - .gitignore
46
+ - LICENSE
47
+ - README.markdown
48
+ - Rakefile
49
+ - VERSION
50
+ - config/paypal_adaptive.yml
51
+ - lib/config.rb
52
+ - lib/ipn_notification.rb
53
+ - lib/pay_request.rb
54
+ - lib/pay_request_schema.json
55
+ - lib/pay_response.rb
56
+ - lib/paypal_adaptive.rb
57
+ - paypal_adaptive.gemspec
58
+ - templates/paypal_ipn.rb
59
+ - test/data/invalid_chain_pay_request.json
60
+ - test/data/invalid_parallel_pay_request.json
61
+ - test/data/invalid_simple_pay_request_1.json
62
+ - test/data/valid_chain_pay_request.json
63
+ - test/data/valid_parallel_pay_request.json
64
+ - test/data/valid_simple_pay_request_1.json
65
+ - test/helper.rb
66
+ - test/pay_request_schema_test.rb
67
+ - test/pay_request_test.rb
68
+ has_rdoc: true
69
+ homepage: http://github.com/tc/paypal_adaptive
70
+ licenses: []
71
+
72
+ post_install_message:
73
+ rdoc_options:
74
+ - --charset=UTF-8
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: "0"
82
+ version:
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: "0"
88
+ version:
89
+ requirements: []
90
+
91
+ rubyforge_project:
92
+ rubygems_version: 1.3.5
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: initial import
96
+ test_files:
97
+ - test/helper.rb
98
+ - test/pay_request_schema_test.rb
99
+ - test/pay_request_test.rb