payuindia 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile +1 -1
- data/README.md +2 -10
- data/lib/payuindia.rb +230 -3
- data/lib/payuindia/action_view_helper.rb +47 -0
- data/lib/payuindia/version.rb +2 -2
- data/payuindia.gemspec +3 -3
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWRhNWVmZjBjNTdhODk1YTEwYzM1OGRlNThkZDA0MjA5YTFjYjcwOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZDc3Yjg3YmViOGE4ODQ5MjJiY2EwYjAxYjU4ZmM5ODFjMDUxZjU4OQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZDlhNmE5MWFlYzMyOTIxN2M4NjIzNzdmZmJmMDBjMTA2MDMwOGE1YjU5ZmIw
|
10
|
+
ZmYwZmVhYzcyYzY2NDgxMWNiZGZhYmFjNDMwNTkzYTA0MjBhODkwYmIxNmEw
|
11
|
+
ZTAwNzE1NGQxNDY4YmJlNGRjODJiOTE4MDE5NWVmYWQ0NDM5MzM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NjU1NGRlOTZmYzM4ZWQyOTI1NDBhNGJkYWZkNzA0ZDhiMDUxYzYzNWMxNjgy
|
14
|
+
MmE2OTE1OTY2NmY2NTJkN2I1YjQzMmVmYjgwNmE5ZDdhYjIwYjAwNjhiZGM5
|
15
|
+
MTI5MGQwYzc4M2E1MzQ3OTE5ZDBkYmY4N2RlNDNhNTJmZjc5OWY=
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# Payuindia
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
This gem is used to integrate and make transactions with PayU payment gateway. (See [PayU.in](http://payu.in/))
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,13 +20,7 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
## Development
|
28
|
-
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
-
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
23
|
+
Check the README here https://github.com/payu-india/PayU-Integration-Kit-ROR
|
32
24
|
|
33
25
|
## Contributing
|
34
26
|
|
data/lib/payuindia.rb
CHANGED
@@ -1,5 +1,232 @@
|
|
1
1
|
require "payuindia/version"
|
2
|
+
require 'payuindia/action_view_helper'
|
3
|
+
ActionView::Base.send(:include, PayuIndia::ActionViewHelper)
|
2
4
|
|
3
|
-
module
|
4
|
-
|
5
|
-
|
5
|
+
module PayuIndia
|
6
|
+
mattr_accessor :test_url
|
7
|
+
mattr_accessor :production_url
|
8
|
+
|
9
|
+
self.test_url = 'https://test.payu.in/_payment.php'
|
10
|
+
self.production_url = 'https://secure.payu.in/_payment.php'
|
11
|
+
|
12
|
+
def self.service_url
|
13
|
+
defined?(Rails) && Rails.env == 'production' ? self.production_url : self.test_url
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.notification(post, options = {})
|
17
|
+
Notification.new(post, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.return(post, options = {})
|
21
|
+
Return.new(post, options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.checksum(merchant_id, secret_key, payload_items )
|
25
|
+
Digest::SHA512.hexdigest([merchant_id, *payload_items, secret_key].join("|"))
|
26
|
+
end
|
27
|
+
|
28
|
+
class Helper
|
29
|
+
|
30
|
+
CHECKSUM_FIELDS = [ :txnid, :amount, :productinfo, :firstname, :email, :udf1, :udf2, :udf3, :udf4,
|
31
|
+
:udf5, :udf6, :udf7, :udf8, :udf9, :udf10 ]
|
32
|
+
|
33
|
+
def initialize(key, salt, options = {})
|
34
|
+
@key, @salt, @options = key, salt, options
|
35
|
+
end
|
36
|
+
|
37
|
+
def form_fields
|
38
|
+
sanitize_fields
|
39
|
+
@options.merge(:hash => generate_checksum)
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_checksum
|
43
|
+
checksum_payload_items = CHECKSUM_FIELDS.map { |field| @options[field] }
|
44
|
+
PayuIndia.checksum(@key, @salt, checksum_payload_items )
|
45
|
+
end
|
46
|
+
|
47
|
+
def sanitize_fields
|
48
|
+
[:address1, :address2, :city, :state, :country, :productinfo, :email, :phone].each do |field|
|
49
|
+
@options[field].gsub!(/[^a-zA-Z0-9\-_@\/\s.]/, '') if @options[field]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
class Notification
|
56
|
+
def initialize(post, options = {})
|
57
|
+
@key = options[:key]
|
58
|
+
@salt = options[:salt]
|
59
|
+
@params = options[:params]
|
60
|
+
end
|
61
|
+
|
62
|
+
def complete?
|
63
|
+
status == "Completed"
|
64
|
+
end
|
65
|
+
|
66
|
+
def params
|
67
|
+
@params
|
68
|
+
end
|
69
|
+
|
70
|
+
def status
|
71
|
+
@status ||= if checksum_ok?
|
72
|
+
if transaction_id.blank?
|
73
|
+
'Invalid'
|
74
|
+
else
|
75
|
+
case transaction_status.downcase
|
76
|
+
when 'success' then 'Completed'
|
77
|
+
when 'failure' then 'Failed'
|
78
|
+
when 'pending' then 'Pending'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
else
|
82
|
+
'Tampered'
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def invoice_ok?( order_id )
|
87
|
+
order_id.to_s == invoice.to_s
|
88
|
+
end
|
89
|
+
|
90
|
+
# Order amount should be equal to gross - discount
|
91
|
+
def amount_ok?( order_amount, order_discount = BigDecimal.new( '0.0' ) )
|
92
|
+
BigDecimal.new( gross ) == order_amount && BigDecimal.new( discount.to_s ) == order_discount
|
93
|
+
end
|
94
|
+
|
95
|
+
# Status of transaction return from the PayU. List of possible values:
|
96
|
+
# <tt>SUCCESS</tt>::
|
97
|
+
# <tt>PENDING</tt>::
|
98
|
+
# <tt>FAILURE</tt>::
|
99
|
+
def transaction_status
|
100
|
+
params['status']
|
101
|
+
end
|
102
|
+
|
103
|
+
# ID of this transaction (PayU.in number)
|
104
|
+
def transaction_id
|
105
|
+
params['mihpayid']
|
106
|
+
end
|
107
|
+
|
108
|
+
# Mode of Payment
|
109
|
+
#
|
110
|
+
# 'CC' for credit-card
|
111
|
+
# 'NB' for net-banking
|
112
|
+
# 'CD' for cheque or DD
|
113
|
+
# 'CO' for Cash Pickup
|
114
|
+
def type
|
115
|
+
params['mode']
|
116
|
+
end
|
117
|
+
|
118
|
+
# What currency have we been dealing with
|
119
|
+
def currency
|
120
|
+
'INR'
|
121
|
+
end
|
122
|
+
|
123
|
+
# This is the invoice which you passed to PayU.in
|
124
|
+
def invoice
|
125
|
+
params['txnid']
|
126
|
+
end
|
127
|
+
|
128
|
+
# Merchant Id provided by the PayU.in
|
129
|
+
def account
|
130
|
+
params['key']
|
131
|
+
end
|
132
|
+
|
133
|
+
# original amount send by merchant
|
134
|
+
def gross
|
135
|
+
params['amount']
|
136
|
+
end
|
137
|
+
|
138
|
+
# This is discount given to user - based on promotion set by merchants.
|
139
|
+
def discount
|
140
|
+
params['discount']
|
141
|
+
end
|
142
|
+
|
143
|
+
# Description offer for what PayU given the offer to user - based on promotion set by merchants.
|
144
|
+
def offer_description
|
145
|
+
params['offer']
|
146
|
+
end
|
147
|
+
|
148
|
+
# Information about the product as send by merchant
|
149
|
+
def product_info
|
150
|
+
params['productinfo']
|
151
|
+
end
|
152
|
+
|
153
|
+
# Email of the customer
|
154
|
+
def customer_email
|
155
|
+
params['email']
|
156
|
+
end
|
157
|
+
|
158
|
+
# Phone of the customer
|
159
|
+
def customer_phone
|
160
|
+
params['phone']
|
161
|
+
end
|
162
|
+
|
163
|
+
# Firstname of the customer
|
164
|
+
def customer_first_name
|
165
|
+
params['firstname']
|
166
|
+
end
|
167
|
+
|
168
|
+
# Lastname of the customer
|
169
|
+
def customer_last_name
|
170
|
+
params['lastname']
|
171
|
+
end
|
172
|
+
|
173
|
+
# Full address of the customer
|
174
|
+
def customer_address
|
175
|
+
{ :address1 => params['address1'], :address2 => params['address2'],
|
176
|
+
:city => params['city'], :state => params['state'],
|
177
|
+
:country => params['country'], :zipcode => params['zipcode'] }
|
178
|
+
end
|
179
|
+
|
180
|
+
def user_defined
|
181
|
+
@user_defined ||= 10.times.map { |i| params["udf#{i + 1}"] }
|
182
|
+
end
|
183
|
+
|
184
|
+
def checksum
|
185
|
+
params['hash']
|
186
|
+
end
|
187
|
+
|
188
|
+
def message
|
189
|
+
@message || "#{params['error']} - #{params['error_Message']}"
|
190
|
+
end
|
191
|
+
|
192
|
+
def acknowledge(authcode = nil)
|
193
|
+
checksum_ok?
|
194
|
+
end
|
195
|
+
|
196
|
+
def checksum_ok?
|
197
|
+
checksum_fields = [transaction_status, *user_defined.reverse, customer_email, customer_first_name, product_info, gross, invoice]
|
198
|
+
|
199
|
+
unless Digest::SHA512.hexdigest([@salt, *checksum_fields, @key].join("|")) == checksum
|
200
|
+
@message = 'Return checksum not matching the data provided'
|
201
|
+
return false
|
202
|
+
end
|
203
|
+
true
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
class Return
|
208
|
+
def initialize(query_string, options = {})
|
209
|
+
@notification = Notification.new(query_string, options)
|
210
|
+
end
|
211
|
+
|
212
|
+
def transaction_id
|
213
|
+
@notification.transaction_id
|
214
|
+
end
|
215
|
+
|
216
|
+
def status( order_id, order_amount )
|
217
|
+
if @notification.invoice_ok?( order_id ) && @notification.amount_ok?( BigDecimal.new(order_amount) )
|
218
|
+
@notification.status
|
219
|
+
else
|
220
|
+
'Mismatch'
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def success?
|
225
|
+
status( @params['txnid'], @params['amount'] ) == 'Completed'
|
226
|
+
end
|
227
|
+
|
228
|
+
def message
|
229
|
+
@notification.message
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'action_pack'
|
2
|
+
require 'payuindia'
|
3
|
+
|
4
|
+
module PayuIndia #:nodoc:
|
5
|
+
ActionViewHelperError = Class.new(StandardError)
|
6
|
+
|
7
|
+
module ActionViewHelper
|
8
|
+
# This Helper creates form with all parameters added.
|
9
|
+
#
|
10
|
+
# <% payment_form_for_payu 'YOUR_KEY', 'YOUR_SALT',
|
11
|
+
# :txnid => @cart.id,
|
12
|
+
# :amount => @cart.total_price,
|
13
|
+
# :productinfo => 'Book',
|
14
|
+
# :firstname => 'abc',
|
15
|
+
# :email => 'abc@example.com',
|
16
|
+
# :phone => '1234567890',
|
17
|
+
# :surl => 'http://localhost:3000/payu_callback',
|
18
|
+
# :furl => 'http://localhost:3000/payu_callback',
|
19
|
+
# :html => { :id => 'payment-form' } %>
|
20
|
+
|
21
|
+
def payment_form_for_payu(key, salt, options = {})
|
22
|
+
if !options.is_a?(Hash) || !key.is_a?(String) || !salt.is_a?(String)
|
23
|
+
concat("Something Wrong! params order -> key (String), salt (String), options (Hash) ")
|
24
|
+
nil
|
25
|
+
else
|
26
|
+
form_options = options.delete(:html) || {}
|
27
|
+
service = PayuIndia::Helper.new(key, salt, options)
|
28
|
+
result = []
|
29
|
+
|
30
|
+
result << form_tag(PayuIndia.service_url, form_options.merge(:method => :post))
|
31
|
+
|
32
|
+
result << hidden_field_tag('key', key)
|
33
|
+
|
34
|
+
service.form_fields.each do |field, value|
|
35
|
+
result << hidden_field_tag(field, value)
|
36
|
+
end
|
37
|
+
|
38
|
+
result << '<input type=submit value=" Pay with PayU ">'
|
39
|
+
result << '</form>'
|
40
|
+
result= result.join("\n")
|
41
|
+
|
42
|
+
concat(result.respond_to?(:html_safe) ? result.html_safe : result)
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/payuindia/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module
|
2
|
-
VERSION = "0.1.
|
1
|
+
module PayuIndia
|
2
|
+
VERSION = "0.1.1"
|
3
3
|
end
|
data/payuindia.gemspec
CHANGED
@@ -5,12 +5,12 @@ require 'payuindia/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "payuindia"
|
8
|
-
spec.version =
|
8
|
+
spec.version = PayuIndia::VERSION
|
9
9
|
spec.authors = ["Sandeep Kumar"]
|
10
10
|
spec.email = ["sandeep.kumar@payu.in"]
|
11
11
|
|
12
12
|
if spec.respond_to?(:metadata)
|
13
|
-
spec.metadata['allowed_push_host'] = "
|
13
|
+
spec.metadata['allowed_push_host'] = "http://rubygems.org"
|
14
14
|
end
|
15
15
|
|
16
16
|
spec.summary = %q{Gem for Ruby on Rails Apps.}
|
@@ -23,6 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ["lib"]
|
25
25
|
|
26
|
-
spec.add_development_dependency "bundler"
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.8"
|
27
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
28
28
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: payuindia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sandeep Kumar
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '1.8'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '1.8'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -54,13 +54,14 @@ files:
|
|
54
54
|
- bin/console
|
55
55
|
- bin/setup
|
56
56
|
- lib/payuindia.rb
|
57
|
+
- lib/payuindia/action_view_helper.rb
|
57
58
|
- lib/payuindia/version.rb
|
58
59
|
- payuindia.gemspec
|
59
60
|
homepage: https://github.com/payu-india/payuindia
|
60
61
|
licenses:
|
61
62
|
- MIT
|
62
63
|
metadata:
|
63
|
-
allowed_push_host:
|
64
|
+
allowed_push_host: http://rubygems.org
|
64
65
|
post_install_message:
|
65
66
|
rdoc_options: []
|
66
67
|
require_paths:
|
@@ -77,7 +78,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
78
|
version: '0'
|
78
79
|
requirements: []
|
79
80
|
rubyforge_project:
|
80
|
-
rubygems_version: 2.
|
81
|
+
rubygems_version: 2.4.6
|
81
82
|
signing_key:
|
82
83
|
specification_version: 4
|
83
84
|
summary: Gem for Ruby on Rails Apps.
|