active_paypal_adaptive_payment 0.2.5 → 0.2.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/active_merchant/billing/integrations/notification.rb +20 -0
- data/lib/active_merchant/billing/integrations/paypal_adaptive_payment.rb +40 -0
- data/lib/active_merchant/billing/integrations/paypal_adaptive_payment/helper.rb +11 -0
- data/lib/active_merchant/billing/integrations/paypal_adaptive_payment/notification.rb +125 -0
- data/lib/active_merchant/billing/integrations/paypal_adaptive_payment/return.rb +10 -0
- data/lib/active_paypal_adaptive_payment.rb +4 -2
- metadata +26 -10
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ActiveMerchant #:nodoc:
|
3
|
+
module Billing #:nodoc:
|
4
|
+
module Integrations #:nodoc:
|
5
|
+
class Notification
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Take the posted data and move the relevant data into a hash
|
10
|
+
def parse(post)
|
11
|
+
@raw = post.to_s
|
12
|
+
for line in @raw.split('&')
|
13
|
+
key, value = CGI.unescape(*line).scan( %r{^([A-Za-z0-9_.\[\]]+)\=(.*)$} ).flatten
|
14
|
+
params[key] = CGI.unescape(value)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module ActiveMerchant #:nodoc:
|
3
|
+
module Billing #:nodoc:
|
4
|
+
module Integrations #:nodoc:
|
5
|
+
module PaypalAdaptivePayment
|
6
|
+
autoload :Return, 'active_merchant/billing/integrations/paypal_adaptive_payment/return.rb'
|
7
|
+
autoload :Helper, 'active_merchant/billing/integrations/paypal_adaptive_payment/helper.rb'
|
8
|
+
autoload :Notification, 'active_merchant/billing/integrations/paypal_adaptive_payment/notification.rb'
|
9
|
+
|
10
|
+
# Overwrite this if you want to change the Paypal test url
|
11
|
+
mattr_accessor :test_url
|
12
|
+
self.test_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr'
|
13
|
+
|
14
|
+
# Overwrite this if you want to change the Paypal production url
|
15
|
+
mattr_accessor :production_url
|
16
|
+
self.production_url = 'https://www.paypal.com/cgi-bin/webscr'
|
17
|
+
|
18
|
+
def self.service_url
|
19
|
+
mode = ActiveMerchant::Billing::Base.integration_mode
|
20
|
+
case mode
|
21
|
+
when :production
|
22
|
+
self.production_url
|
23
|
+
when :test
|
24
|
+
self.test_url
|
25
|
+
else
|
26
|
+
raise StandardError, "Integration mode set to an invalid value: #{mode}"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.notification(post, options = {})
|
31
|
+
Notification.new(post)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.return(query_string, options = {})
|
35
|
+
Return.new(query_string)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'net/http'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
module Integrations #:nodoc:
|
7
|
+
module PaypalAdaptivePayment
|
8
|
+
# Parser and handler for incoming Instant payment notifications from paypal.
|
9
|
+
# The Example shows a typical handler in a rails application. Note that this
|
10
|
+
# is an example, please read the Paypal API documentation for all the details
|
11
|
+
# on creating a safe payment controller.
|
12
|
+
#
|
13
|
+
# Example
|
14
|
+
#
|
15
|
+
# class BackendController < ApplicationController
|
16
|
+
# include ActiveMerchant::Billing::Integrations
|
17
|
+
#
|
18
|
+
# def paypal_ipn
|
19
|
+
# notify = PaypalAdaptivePayment::Notification.new(request.raw_post)
|
20
|
+
#
|
21
|
+
# order = Order.find(notify.item_id)
|
22
|
+
#
|
23
|
+
# if notify.acknowledge
|
24
|
+
# begin
|
25
|
+
#
|
26
|
+
# if notify.complete? and order.total == notify.amount
|
27
|
+
# order.status = 'COMPLETED'
|
28
|
+
#
|
29
|
+
# shop.ship(order)
|
30
|
+
# else
|
31
|
+
# logger.error("Failed to verify Paypal's notification, please investigate")
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# rescue => e
|
35
|
+
# order.status = 'ERROR'
|
36
|
+
# raise
|
37
|
+
# ensure
|
38
|
+
# order.save
|
39
|
+
# end
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# render :nothing
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
46
|
+
include PostsData
|
47
|
+
|
48
|
+
# Was the transaction complete?
|
49
|
+
def complete?
|
50
|
+
status == "COMPLETED"
|
51
|
+
end
|
52
|
+
|
53
|
+
# Status of transaction. List of possible values:
|
54
|
+
# <tt>CREATED</tt>::
|
55
|
+
# <tt>COMPLETED</tt>::
|
56
|
+
# <tt>INCOMPLETE</tt>::
|
57
|
+
# <tt>ERROR</tt>::
|
58
|
+
# <tt>REVERSALERROR</tt>::
|
59
|
+
# <tt>PROCESSING</tt>::
|
60
|
+
# <tt>PENDING</tt>::
|
61
|
+
def status
|
62
|
+
params['status']
|
63
|
+
end
|
64
|
+
|
65
|
+
# Id of this transaction (paypal number)
|
66
|
+
def transaction_id
|
67
|
+
params['transaction[0].id_for_sender_txn']
|
68
|
+
end
|
69
|
+
|
70
|
+
def type
|
71
|
+
params['action_type']
|
72
|
+
end
|
73
|
+
|
74
|
+
# This is the item number which we submitted to paypal
|
75
|
+
# The custom field is also mapped to item_id because PayPal
|
76
|
+
# doesn't return item_number in dispute notifications
|
77
|
+
def item_id
|
78
|
+
params['item_number'] || params['custom']
|
79
|
+
end
|
80
|
+
|
81
|
+
# This is the invoice which you passed to paypal
|
82
|
+
def invoice
|
83
|
+
params['transaction[0].invoiceId']
|
84
|
+
end
|
85
|
+
|
86
|
+
# Was this a test transaction?
|
87
|
+
def test?
|
88
|
+
params['test_ipn'] == '1'
|
89
|
+
end
|
90
|
+
|
91
|
+
def account
|
92
|
+
params['business'] || params['transaction[0].receiver']
|
93
|
+
end
|
94
|
+
|
95
|
+
# Acknowledge the transaction to paypal. This method has to be called after a new
|
96
|
+
# ipn arrives. Paypal will verify that all the information we received are correct and will return a
|
97
|
+
# ok or a fail.
|
98
|
+
#
|
99
|
+
# Example:
|
100
|
+
#
|
101
|
+
# def paypal_ipn
|
102
|
+
# notify = PaypalAdaptivePaymentNotification.new(request.raw_post)
|
103
|
+
#
|
104
|
+
# if notify.acknowledge
|
105
|
+
# ... process order ... if notify.complete?
|
106
|
+
# else
|
107
|
+
# ... log possible hacking attempt ...
|
108
|
+
# end
|
109
|
+
def acknowledge
|
110
|
+
payload = raw
|
111
|
+
|
112
|
+
response = ssl_post(Paypal.service_url + '?cmd=_notify-validate', payload,
|
113
|
+
'Content-Length' => "#{payload.size}",
|
114
|
+
'User-Agent' => "Active Merchant -- http://activemerchant.org"
|
115
|
+
)
|
116
|
+
|
117
|
+
raise StandardError.new("Faulty paypal result: #{response}") unless ["VERIFIED", "INVALID"].include?(response)
|
118
|
+
|
119
|
+
response == "VERIFIED"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'active_merchant'
|
2
|
-
require
|
3
|
-
|
3
|
+
require '/active_merchant/billing/gateways/paypal_adaptive_payment'
|
4
|
+
require '/active_merchant/billing/integrations/paypal_adaptive_payment'
|
5
|
+
require '/active_merchant/billing/integrations/notification'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_paypal_adaptive_payment
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-10-
|
12
|
+
date: 2011-10-06 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activemerchant
|
16
|
-
requirement: &
|
16
|
+
requirement: &12059900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 1.5.1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *12059900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multi_json
|
27
|
-
requirement: &
|
27
|
+
requirement: &12057740 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.0.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *12057740
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rash
|
38
|
-
requirement: &
|
38
|
+
requirement: &12056220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.3.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *12056220
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: money
|
49
|
-
requirement: &
|
49
|
+
requirement: &12052900 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: 3.6.0
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *12052900
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: mocha
|
60
|
+
requirement: &12049960 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.10.0
|
66
|
+
type: :runtime
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *12049960
|
58
69
|
description: ! ' This library is meant to interface with PayPal''s Adaptive Payment
|
59
70
|
Gateway.
|
60
71
|
|
@@ -66,6 +77,11 @@ extensions: []
|
|
66
77
|
extra_rdoc_files: []
|
67
78
|
files:
|
68
79
|
- lib/active_paypal_adaptive_payment.rb
|
80
|
+
- lib/active_merchant/billing/integrations/paypal_adaptive_payment.rb
|
81
|
+
- lib/active_merchant/billing/integrations/paypal_adaptive_payment/helper.rb
|
82
|
+
- lib/active_merchant/billing/integrations/paypal_adaptive_payment/return.rb
|
83
|
+
- lib/active_merchant/billing/integrations/paypal_adaptive_payment/notification.rb
|
84
|
+
- lib/active_merchant/billing/integrations/notification.rb
|
69
85
|
- lib/active_merchant/billing/gateways/paypal_adaptive_payment.rb
|
70
86
|
- lib/active_merchant/billing/gateways/paypal_adaptive_payments/ext.rb
|
71
87
|
- lib/active_merchant/billing/gateways/paypal_adaptive_payments/exceptions.rb
|