payonline 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +4 -0
- data/README.md +54 -0
- data/Rakefile +1 -0
- data/lib/payonline.rb +18 -0
- data/lib/payonline/config.rb +13 -0
- data/lib/payonline/payment_gateway.rb +70 -0
- data/lib/payonline/payment_response.rb +32 -0
- data/lib/payonline/signature.rb +23 -0
- data/lib/payonline/version.rb +3 -0
- data/payonline.gemspec +24 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ffecc72ab316af139858d166bad9f2f061fee703
|
4
|
+
data.tar.gz: e37aa7b384f956ab5a019081a9a8da21efbe042d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 73e84b51ee88012b49eb71a948b7676a285dcc1a7000a0d1d5bd0ae9b81ce9432f6d01af43dde8933516dbefc2c6986442e5edf079e24fcca7bf72b53265f0b6
|
7
|
+
data.tar.gz: fa5ad0967fc1ed6b014ea35140332bfb9f89f5a2ec1496aeb3e22b97306aa9bec0a024fd4ea3111f3db45d8037e484b88dd54ac26b7f64ae2bc85677044e3f39
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
## Payonline
|
2
|
+
|
3
|
+
This is a thin wrapper library that makes using PayOnline API a bit easier.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'payonline'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
```sh
|
16
|
+
$ bundle
|
17
|
+
```
|
18
|
+
|
19
|
+
## Configuring
|
20
|
+
|
21
|
+
Create initialize file. This file is usually located at /config/initializers/payonline.rb
|
22
|
+
```ruby
|
23
|
+
Payonline.config do |c|
|
24
|
+
c.merchant_id = '12345'
|
25
|
+
c.private_security_key = '3844908d-4c2a-42e1-9be0-91bb5d068d22'
|
26
|
+
c.return_url = 'http://you_domain/payments/success'
|
27
|
+
c.fail_url = 'http://you_domain/payments/failed'
|
28
|
+
end
|
29
|
+
```
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
Get payment link
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
Payonline::PaymentGateway.new(order_id: 56789, amount: 9.99 , currency: 'USD').get_payment_url
|
37
|
+
```
|
38
|
+
|
39
|
+
Check Call-back
|
40
|
+
```ruby
|
41
|
+
@paymant_response = Payonline::PaymentResponse.new(prms)
|
42
|
+
if paymant_response.valid_payment?
|
43
|
+
Order.find(@paymant_response.order_id).pay
|
44
|
+
end
|
45
|
+
```
|
46
|
+
|
47
|
+
## Contributing
|
48
|
+
|
49
|
+
1. Fork it
|
50
|
+
2. Clone it `git clone http://github.com/path/to/your/fork`
|
51
|
+
3. Create your feature branch `git checkout -b my-new-feature`
|
52
|
+
4. Commit your changes `git commit -am 'Add some feature`
|
53
|
+
5. Push to the branch `git push origin my-new-feature`
|
54
|
+
6. Create new pull request through Github
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/payonline.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'payonline/config'
|
3
|
+
require 'payonline/payment_gateway'
|
4
|
+
require 'payonline/payment_response'
|
5
|
+
require 'payonline/signature'
|
6
|
+
|
7
|
+
module Payonline
|
8
|
+
extend self
|
9
|
+
|
10
|
+
def self.configuration
|
11
|
+
@configuration ||= Config.new
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.config
|
15
|
+
config = configuration
|
16
|
+
yield(config)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Payonline
|
2
|
+
class Config
|
3
|
+
include ActiveSupport::Configurable
|
4
|
+
|
5
|
+
config_accessor :merchant_id, :private_security_key, :return_url, :fail_url
|
6
|
+
|
7
|
+
def initialize(options = {})
|
8
|
+
options.each do |key, value|
|
9
|
+
config.send("#{key}=", value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Payonline
|
2
|
+
class PaymentGateway
|
3
|
+
class Params < SimpleDelegator
|
4
|
+
|
5
|
+
REQUIED_PARAMS = %w(order_id amount currency valid_until order_description return_url fail_url return_url)
|
6
|
+
|
7
|
+
def initialize(params)
|
8
|
+
@params = prepare_params(params)
|
9
|
+
|
10
|
+
filter_params
|
11
|
+
|
12
|
+
__setobj__ @params
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_query
|
16
|
+
@params.each_with_object({}) do |(k, v), params|
|
17
|
+
params[k.camelize] = v
|
18
|
+
end.to_query
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def prepare_params(params)
|
24
|
+
params[:amount] = '%.2f' % params[:amount]
|
25
|
+
|
26
|
+
default_params = { return_url: return_url, fail_url: fail_url }
|
27
|
+
params.merge(default_params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def filter_params
|
31
|
+
@params.select! { |k, v| REQUIED_PARAMS.include?(k) && v }
|
32
|
+
end
|
33
|
+
|
34
|
+
def return_url
|
35
|
+
@return_url ||= Payonline.configuration.return_url
|
36
|
+
end
|
37
|
+
|
38
|
+
def fail_url
|
39
|
+
@fail_url ||= Payonline.configuration.fail_url
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
SIGNED_PARAMS = %w(order_id amount currency valid_until order_description)
|
44
|
+
|
45
|
+
def initialize(params={})
|
46
|
+
@params = Params.new(params.with_indifferent_access)
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_payment_url(type = 'card')
|
50
|
+
params = Payonline::Signature.sign_params(@params, SIGNED_PARAMS)
|
51
|
+
|
52
|
+
"#{url_by_kind_of_payment(type)}?#{params.to_query}"
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def url_by_kind_of_payment(type, language = 'ru')
|
58
|
+
case type.to_s
|
59
|
+
when 'qiwi'
|
60
|
+
"https://secure.payonlinesystem.com/#{language}/payment/select/qiwi/"
|
61
|
+
when 'webmoney'
|
62
|
+
"https://secure.payonlinesystem.com/#{language}/payment/select/webmoney/"
|
63
|
+
when 'yandexmoney'
|
64
|
+
"https://secure.payonlinesystem.com/#{language}/payment/select/webmoney/"
|
65
|
+
when 'card'
|
66
|
+
"https://secure.payonlinesystem.com/#{language}/payment/"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Payonline
|
2
|
+
class PaymentResponse
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
attr_accessor :response, :params
|
6
|
+
|
7
|
+
RESPONSE_PARAMS = %w(date_time transaction_id order_id amount currency)
|
8
|
+
|
9
|
+
def_delegators :params, *RESPONSE_PARAMS
|
10
|
+
|
11
|
+
def initialize(response = {})
|
12
|
+
self.response = response
|
13
|
+
self.params = OpenStruct.new(normalize_params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def valid_payment?
|
17
|
+
keys = RESPONSE_PARAMS.each_with_object([]).each do |key, array|
|
18
|
+
array << response.keys.select{ |e| e.underscore == key }.first
|
19
|
+
end
|
20
|
+
|
21
|
+
params.security_key == Payonline::Signature.digest(response, keys)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def normalize_params
|
27
|
+
result = response.each_with_object({}) do |(k, v), params|
|
28
|
+
params[k.underscore] = v
|
29
|
+
end.with_indifferent_access
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Payonline
|
2
|
+
class Signature
|
3
|
+
def self.digest(sign_params, keys=[])
|
4
|
+
if keys.present?
|
5
|
+
sign_params = sign_params.slice(*keys)
|
6
|
+
end
|
7
|
+
|
8
|
+
sign_params.merge!({ private_security_key: Payonline.configuration.private_security_key })
|
9
|
+
Digest::MD5.hexdigest(sign_params.each.map{|k, v| "#{k.to_s.camelize}=#{v}"}.join('&'))
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.sign_params(params, keys=[], add_merchant_id = true)
|
13
|
+
params.reverse_merge!({ 'merchant_id' => Payonline.configuration.merchant_id }) if add_merchant_id
|
14
|
+
if keys.present?
|
15
|
+
keys.unshift 'merchant_id' if add_merchant_id
|
16
|
+
end
|
17
|
+
digest = self.digest(params, keys)
|
18
|
+
params.merge!({ 'security_key' => digest, 'content_type' => 'text' })
|
19
|
+
|
20
|
+
params
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/payonline.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'payonline/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "payonline"
|
8
|
+
spec.version = Payonline::VERSION
|
9
|
+
spec.authors = ["Yuri Zubov"]
|
10
|
+
spec.email = ["I0Result86@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{This is a thin wrapper library that makes using PayOnline API a bit easier.}
|
13
|
+
spec.description = %q{This is a thin wrapper library that makes using PayOnline API a bit easier.}
|
14
|
+
spec.homepage = "https://github.com/I0Result/payonline"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.9"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: payonline
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yuri Zubov
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.9'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.9'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
description: This is a thin wrapper library that makes using PayOnline API a bit easier.
|
42
|
+
email:
|
43
|
+
- I0Result86@gmail.com
|
44
|
+
executables: []
|
45
|
+
extensions: []
|
46
|
+
extra_rdoc_files: []
|
47
|
+
files:
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- README.md
|
51
|
+
- Rakefile
|
52
|
+
- lib/payonline.rb
|
53
|
+
- lib/payonline/config.rb
|
54
|
+
- lib/payonline/payment_gateway.rb
|
55
|
+
- lib/payonline/payment_response.rb
|
56
|
+
- lib/payonline/signature.rb
|
57
|
+
- lib/payonline/version.rb
|
58
|
+
- payonline.gemspec
|
59
|
+
homepage: https://github.com/I0Result/payonline
|
60
|
+
licenses:
|
61
|
+
- MIT
|
62
|
+
metadata: {}
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
require_paths:
|
66
|
+
- lib
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: '0'
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 2.4.2
|
80
|
+
signing_key:
|
81
|
+
specification_version: 4
|
82
|
+
summary: This is a thin wrapper library that makes using PayOnline API a bit easier.
|
83
|
+
test_files: []
|