ruby-gpwebpay 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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +3 -0
- data/.ruby_gemset +1 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -0
- data/README.md +111 -0
- data/Rakefile +6 -0
- data/bin/console +7 -0
- data/bin/setup +7 -0
- data/certs/muzo.signing_prod.pem +20 -0
- data/certs/muzo.signing_test.pem +20 -0
- data/gp_webpay.gemspec +35 -0
- data/lib/gp_webpay.rb +9 -0
- data/lib/gp_webpay/config.rb +64 -0
- data/lib/gp_webpay/payment.rb +58 -0
- data/lib/gp_webpay/payment_attributes.rb +58 -0
- data/lib/gp_webpay/verification.rb +60 -0
- data/lib/gp_webpay/version.rb +3 -0
- data/lib/gp_webpay/web_services.rb +125 -0
- data/lib/gp_webpay/web_services/response.rb +18 -0
- data/lib/gp_webpay/web_services/template.rb +225 -0
- metadata +246 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0536ecb57b136380a6c1662e93b0cec5439bd59c655fa524a82ac14c0ac33117
|
4
|
+
data.tar.gz: 325be4295cd941abffa4d5e7569572fe8f93de3799f2a529bb2f5f85228b2540
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dcb7675ac86150be1b9c25c631b15d7176ceae25cb07da9dedf06a55fd2684478b728ee5c010179f28df5cdce13fac763373d30d9cca99fed821970b34fe7527
|
7
|
+
data.tar.gz: 8d50edcae500961cd41a30ce7698cdc1b2772391a928841a379803c32f12148a3729eb281af3cbcbe04ded9b0616c17d49d87866e8fba3dbc30d4cc6768239ed
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby_gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
gpwebpay
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
# GpWebpay
|
2
|
+
|
3
|
+
[](https://travis-ci.org/redrick/gpwebpay)
|
4
|
+
|
5
|
+
Started as [this fork](https://github.com/redrick/gp_webpay) of https://github.com/blueberryapps/gp_webpay, Thanks for that one ;)
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'gpwebpay'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install gpwebpay
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
Generate own certificate, put into your repository.
|
26
|
+
|
27
|
+
### Initialize
|
28
|
+
|
29
|
+
config/initializers/gpwebpay.rb
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
GpWebpay.configure do |config|
|
33
|
+
config.merchant_number = ##########
|
34
|
+
config.merchant_pem_path = 'my_cert.pem'
|
35
|
+
config.merchant_password = 'password'
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
### Payment
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
class Payment
|
43
|
+
include GpWebpay::Payment
|
44
|
+
|
45
|
+
def order_number
|
46
|
+
id
|
47
|
+
end
|
48
|
+
|
49
|
+
def amount_in_cents
|
50
|
+
100
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# implement this method if multiple types of payments required, otherwise default to normal one-time payment
|
55
|
+
#
|
56
|
+
# allows for 2 types:
|
57
|
+
# default -> normal one-time payment
|
58
|
+
# recurring -> master + recurring payments
|
59
|
+
##
|
60
|
+
def payment_type
|
61
|
+
case variable
|
62
|
+
when one
|
63
|
+
return 'master'
|
64
|
+
when two
|
65
|
+
return 'recurring'
|
66
|
+
else
|
67
|
+
'default'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def currency
|
72
|
+
840 # CZK = 203, EUR = 978, GBP = 826, HUF = 348, PLN = 985, RUB = 643, USD = 840
|
73
|
+
end
|
74
|
+
end
|
75
|
+
```
|
76
|
+
|
77
|
+
### Controller
|
78
|
+
```ruby
|
79
|
+
class OrdersController
|
80
|
+
def create
|
81
|
+
...
|
82
|
+
payment = Payment.create
|
83
|
+
redirect_to payment.pay_url(redirect_url: 'http://example.com/orders/callback')
|
84
|
+
end
|
85
|
+
|
86
|
+
def callback
|
87
|
+
...
|
88
|
+
payment = Payment.find(params['ORDERNUMBER'])
|
89
|
+
if payment.success?(params)
|
90
|
+
# Payment success
|
91
|
+
else
|
92
|
+
# Payment failed
|
93
|
+
# params['PRCODE'], params['SRCODE']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
```
|
98
|
+
|
99
|
+
## Development
|
100
|
+
|
101
|
+
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.
|
102
|
+
|
103
|
+
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).
|
104
|
+
|
105
|
+
## Contributing
|
106
|
+
|
107
|
+
1. Fork it ( https://github.com/[my-github-username]/gpwebpay/fork )
|
108
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
109
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
110
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
111
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/bin/console
ADDED
data/bin/setup
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDLzCCAhegAwIBAgIBAjANBgkqhkiG9w0BAQUFADBNMRgwFgYDVQQDEw9NZXNz
|
3
|
+
YWdlIFNpZ25pbmcxEDAOBgNVBAsTB1BheU1VWk8xEjAQBgNVBAoTCU1VWk8sYS5z
|
4
|
+
LjELMAkGA1UEBhMCQ1owHhcNMDQwNjExMTAyMzU5WhcNMTQwNzI5MTAyMzU5WjBN
|
5
|
+
MRgwFgYDVQQDEw9NZXNzYWdlIFNpZ25pbmcxEDAOBgNVBAsTB1BheU1VWk8xEjAQ
|
6
|
+
BgNVBAoTCU1VWk8sYS5zLjELMAkGA1UEBhMCQ1owggEiMA0GCSqGSIb3DQEBAQUA
|
7
|
+
A4IBDwAwggEKAoIBAQDimVN4A77p26u2yx6x+gC9nQ4bVqEuTk6Qj18EKPftws2W
|
8
|
+
hZavsQIZPK6Xq3mVkM5teTdn0To1EA2jr5gySkTeBPWEKTn3pqrcx1hgri/J9MnX
|
9
|
+
v+csD5ThAgW/IZKpfETxZqzF+1biX1/4tjWDOFi7VPrl1E+M5BTd8CSZn6ixfSDr
|
10
|
+
m2YLPIz5UbWk5GmqYH9u7kXLXx4oEhiWZkPVpjVoFm4b36Dof2UBXOECjRb1brmc
|
11
|
+
hTa1mfsvb8e0PbtxkRZUsf+/K3IG12E01qSdDIynBfK/dYpOq23tb0mREwpj/Ntr
|
12
|
+
foOX4YWjkF/PQjEA2Yl8FhVpYK2efvGJUGhv/gx1AgMBAAGjGjAYMAkGA1UdEwQC
|
13
|
+
MAAwCwYDVR0PBAQDAgbAMA0GCSqGSIb3DQEBBQUAA4IBAQARcUvHXzYh0J3kI8ii
|
14
|
+
v5zNltb0EPBNW5CC6nc3OicwsHkQUo6/KnueIXjnICG8RD3jAc3c2QIz8//Z2YrE
|
15
|
+
xjEQY3l6IM1NSjmFLq8xEkaFcgOcU/Wv372AtjrFuJeB2NXxxaJuWzPqcmZuDyX2
|
16
|
+
tP8lSqEhO+EKK/vgec3RiBvKiN/uDurj7EmVClux1nYVXS85BmuEx5p1IM04KyJd
|
17
|
+
3lSle9jyjQI62ELorkMM7UVHv2nWQ076u+0piIHuvxRIwUM3IEPCLZ71Ss7yPxoK
|
18
|
+
YKBip/BA8mF4shRjXE+uYcLPMgF0tKBn1obIwSS718x2ykAWcTzVWczlupi8ornT
|
19
|
+
c1yE
|
20
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,20 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDOTCCAiGgAwIBAgIBATANBgkqhkiG9w0BAQUFADBSMR0wGwYDVQQDExRUZXN0
|
3
|
+
IE1lc3NhZ2UgU2lnbmluZzEQMA4GA1UECxMHUGF5TVVaTzESMBAGA1UEChMJTVVa
|
4
|
+
TyxhLnMuMQswCQYDVQQGEwJDWjAeFw0wNDA2MTExMDIxMTJaFw0xNDA3MjkxMDIx
|
5
|
+
MTJaMFIxHTAbBgNVBAMTFFRlc3QgTWVzc2FnZSBTaWduaW5nMRAwDgYDVQQLEwdQ
|
6
|
+
YXlNVVpPMRIwEAYDVQQKEwlNVVpPLGEucy4xCzAJBgNVBAYTAkNaMIIBIjANBgkq
|
7
|
+
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAukooJBqkgau4pjhxkDC35hDl0SHOn3Bo
|
8
|
+
nEU1ldz/l6886nJhypHNkLSHgBJRvhbLz/QdOD3mZShrupcxNRKTcA1oLzWWWOeL
|
9
|
+
lgmK0cSM5Xchy/vE6LVbij4+wKtujfPZWg4XIdJFpb4VBTj0mx3NX5nKshu2A987
|
10
|
+
uIZGYB6YapS3NGWPSJL5VPwdv5PRqV4U0v4/DuQl01A9v8fuqr3bs+AsqUXzWfLA
|
11
|
+
LHLnxxoCzaEzUC+EV2b7jcNyngjv9vDhOeGsxrojQA73w2Lf16BuaSQrlIUWDt4B
|
12
|
+
AhIc+L8ZM8pKGXtbwXP1NwBtxQ2FvtAqfHqwHdw4yrb/V2Q/QMaB8wIDAQABoxow
|
13
|
+
GDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEArLoK
|
14
|
+
QdCHoIEFdp2HLQOmyp/086NAB6jlh+/xwTpYeQcymKP0krO65N36WKEiA34N/zfn
|
15
|
+
4pJRt6dk8PkWWs7f8C3twSwoP/gd9UC0u0EDIR2i0wxejfVmSDmn80uUOOWR4M9j
|
16
|
+
xsz5ik5nro7QR+oZuG4lHSGbKjtt4Gf5js1hjqX/NPXNUMnqhYrua+jsd/KdVpuo
|
17
|
+
4emFhl7dd5eF7LvMLiS6r/tDOOQBtQ50Y3NDhFVQVXiSeQimsuv+tplFBf3/p31u
|
18
|
+
edm6ZG7g9Ws8a/Nl3tFkJ4CnnRwrkHMZHG95MlqM9twotEIXZ3tIs2k3ZUj99/M/
|
19
|
+
AhtX+V3MIyAWh2Dsow==
|
20
|
+
-----END CERTIFICATE-----
|
data/gp_webpay.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'gp_webpay/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ruby-gpwebpay"
|
8
|
+
spec.version = GpWebpay::VERSION
|
9
|
+
spec.authors = ["Andrej Antas"]
|
10
|
+
spec.email = ["andrej@antas.cz"]
|
11
|
+
|
12
|
+
spec.summary = %q{GP webpay, payments, SOAP, payment gateway}
|
13
|
+
spec.homepage = "https://github.com/redrick/gpwebpay"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = "exe"
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency 'activesupport'
|
22
|
+
spec.add_runtime_dependency 'nokogiri'
|
23
|
+
spec.add_runtime_dependency 'curb'
|
24
|
+
|
25
|
+
spec.add_development_dependency "bundler", "~> 2.2"
|
26
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
28
|
+
spec.add_development_dependency 'simplecov', '~> 0.14'
|
29
|
+
spec.add_development_dependency 'vcr', '~> 3.0'
|
30
|
+
spec.add_development_dependency 'webmock', '~> 3.0'
|
31
|
+
spec.add_development_dependency 'pry'
|
32
|
+
spec.add_development_dependency 'wasabi'
|
33
|
+
spec.add_development_dependency 'libxml-ruby'
|
34
|
+
spec.add_development_dependency 'timecop'
|
35
|
+
end
|
data/lib/gp_webpay.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require "active_support/configurable"
|
2
|
+
|
3
|
+
module GpWebpay
|
4
|
+
# Configures global settings for Kaminari
|
5
|
+
# GpWebpay.configure do |config|
|
6
|
+
# config.default_per_page = 10
|
7
|
+
# end
|
8
|
+
def self.configure(&block)
|
9
|
+
yield @config ||= GpWebpay::Configuration.new
|
10
|
+
end
|
11
|
+
|
12
|
+
# Global settings for Kaminari
|
13
|
+
def self.config
|
14
|
+
@config
|
15
|
+
end
|
16
|
+
|
17
|
+
# need a Class for 3.0
|
18
|
+
class Configuration #:nodoc:
|
19
|
+
include ActiveSupport::Configurable
|
20
|
+
config_accessor :merchant_number do nil; end
|
21
|
+
config_accessor :merchant_pem do nil; end
|
22
|
+
config_accessor :merchant_pem_path do nil; end
|
23
|
+
config_accessor :merchant_password do nil; end
|
24
|
+
config_accessor :gpe_pem_path do nil; end
|
25
|
+
config_accessor :environment do
|
26
|
+
defined?(Rails) && Rails.env || "test"
|
27
|
+
end
|
28
|
+
|
29
|
+
def param_name
|
30
|
+
config.param_name.respond_to?(:call) ? config.param_name.call : config.param_name
|
31
|
+
end
|
32
|
+
|
33
|
+
def pay_url
|
34
|
+
if production?
|
35
|
+
"https://3dsecure.gpwebpay.com/kb/order.do"
|
36
|
+
else
|
37
|
+
"https://test.3dsecure.gpwebpay.com/kb/order.do"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def web_services_url
|
42
|
+
if production?
|
43
|
+
"https://3dsecure.gpwebpay.com/pay-ws/v1/PaymentService"
|
44
|
+
else
|
45
|
+
"https://test.3dsecure.gpwebpay.com/pay-ws/v1/PaymentService"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def gpe_pem_path
|
50
|
+
file_name = production? ? "muzo.signing_prod.pem" : "muzo.signing_test.pem"
|
51
|
+
|
52
|
+
File.expand_path("../../../certs/#{file_name}", __FILE__)
|
53
|
+
end
|
54
|
+
|
55
|
+
def production?
|
56
|
+
config.environment == "production"
|
57
|
+
end
|
58
|
+
|
59
|
+
# define param_name writer (copied from AS::Configurable)
|
60
|
+
writer, line = "def param_name=(value); config.param_name = value; end", __LINE__
|
61
|
+
singleton_class.class_eval writer, __FILE__, line
|
62
|
+
class_eval writer, __FILE__, line
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module GpWebpay
|
2
|
+
module Payment
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
attr_accessor :redirect_url
|
7
|
+
end
|
8
|
+
|
9
|
+
def deposit_flag
|
10
|
+
1
|
11
|
+
end
|
12
|
+
|
13
|
+
def user_param
|
14
|
+
"R"
|
15
|
+
end
|
16
|
+
|
17
|
+
def payment_type
|
18
|
+
super || "default"
|
19
|
+
end
|
20
|
+
|
21
|
+
def merchant_number
|
22
|
+
config.merchant_number
|
23
|
+
end
|
24
|
+
|
25
|
+
def operation
|
26
|
+
"CREATE_ORDER"
|
27
|
+
end
|
28
|
+
|
29
|
+
def pay_url(options = {})
|
30
|
+
self.redirect_url = options[:redirect_url]
|
31
|
+
|
32
|
+
"#{config.pay_url}?#{pay_verification.payment_attributes_with_digest.to_param}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def success?(params)
|
36
|
+
pay_verification.verified_response?(params) &&
|
37
|
+
params["PRCODE"] == "0" && params["SRCODE"] == "0"
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def pay_verification_attrs
|
43
|
+
%i(operation order_number prcode srcode resulttext)
|
44
|
+
end
|
45
|
+
|
46
|
+
def pay_attributes
|
47
|
+
@pay_attributes ||= PaymentAttributes.new(self).to_h
|
48
|
+
end
|
49
|
+
|
50
|
+
def config
|
51
|
+
GpWebpay.config
|
52
|
+
end
|
53
|
+
|
54
|
+
def pay_verification
|
55
|
+
::GpWebpay::Verification.new(pay_attributes, pay_verification_attrs)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module GpWebpay
|
2
|
+
class PaymentAttributes
|
3
|
+
KEYS = %i(merchant_number operation order_number amount_in_cents currency deposit_flag redirect_url description merchant_description user_param)
|
4
|
+
|
5
|
+
WS_KEYS = %i(message_id bank_id merchant_number order_number)
|
6
|
+
|
7
|
+
REGULAR_PAYMENT_KEYS = %i(
|
8
|
+
message_id bank_id merchant_number order_number master_order_number merchant_order_number amount_in_cents capture_flag
|
9
|
+
card_holder.name card_holder.email card_holder.phone_country card_holder.phone card_holder.mobile_phone_country card_holder.mobile_phone
|
10
|
+
address_match
|
11
|
+
billing.name billing.address1 billing.city billing.postal_code billing.country
|
12
|
+
shipping.name shipping.address1 shipping.city shipping.postal_code shipping.country
|
13
|
+
)
|
14
|
+
|
15
|
+
OPTIONAL_KEYS = %i(merchant_order_number description merchant_description)
|
16
|
+
|
17
|
+
MASTER_KEYS = %i(user_param)
|
18
|
+
|
19
|
+
def initialize(payment, ws_flag = false, type = "")
|
20
|
+
@payment = payment
|
21
|
+
@ws_flag = ws_flag
|
22
|
+
@type = type
|
23
|
+
end
|
24
|
+
|
25
|
+
def keys
|
26
|
+
case @payment.payment_type
|
27
|
+
when "master"
|
28
|
+
return (@ws_flag ? WS_KEYS : KEYS)
|
29
|
+
when "recurring"
|
30
|
+
case @type
|
31
|
+
when "processRegularSubscriptionPayment"
|
32
|
+
return REGULAR_PAYMENT_KEYS
|
33
|
+
else
|
34
|
+
return WS_KEYS
|
35
|
+
end
|
36
|
+
else
|
37
|
+
return KEYS.reject { |k| MASTER_KEYS.include?(k) }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_h
|
42
|
+
keys.each_with_object({}) do |method, hash|
|
43
|
+
method_chain = method.to_s.split(".").map(&:to_sym)
|
44
|
+
if @payment.respond_to?(*method_chain)
|
45
|
+
if method == :message_id
|
46
|
+
hash[method] = @payment.public_send(method, @type)
|
47
|
+
else
|
48
|
+
hash[method] = method_chain.inject(@payment, :public_send)
|
49
|
+
end
|
50
|
+
elsif !OPTIONAL_KEYS.include?(method)
|
51
|
+
method_missing(method)
|
52
|
+
end
|
53
|
+
|
54
|
+
hash
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require "openssl"
|
2
|
+
|
3
|
+
module GpWebpay
|
4
|
+
class Verification
|
5
|
+
def initialize(payment_attributes, verification_attrs = nil)
|
6
|
+
@payment_attributes = payment_attributes
|
7
|
+
@verification_attrs = verification_attrs
|
8
|
+
end
|
9
|
+
|
10
|
+
def verified_response?(params)
|
11
|
+
verify_digest(params["DIGEST"], digest_verification(params)) &&
|
12
|
+
verify_digest(params["DIGEST1"], digest1_verification(params))
|
13
|
+
end
|
14
|
+
|
15
|
+
def payment_attributes_with_digest
|
16
|
+
@payment_attributes.merge("DIGEST" => digest)
|
17
|
+
end
|
18
|
+
|
19
|
+
def digest
|
20
|
+
sign = merchant_key.sign(OpenSSL::Digest::SHA1.new, digest_text)
|
21
|
+
Base64.encode64(sign).gsub("\n", "")
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def config
|
27
|
+
GpWebpay.config
|
28
|
+
end
|
29
|
+
|
30
|
+
def digest_text
|
31
|
+
@payment_attributes.values.join("|")
|
32
|
+
end
|
33
|
+
|
34
|
+
def digest_verification(params)
|
35
|
+
@verification_attrs.map { |key| params[key] }.join("|")
|
36
|
+
end
|
37
|
+
|
38
|
+
def digest1_verification(params)
|
39
|
+
digest_verification(params) + "|#{config.merchant_number}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def verify_digest(signature, data)
|
43
|
+
gpe_key.verify(OpenSSL::Digest::SHA1.new, Base64.decode64(signature), data)
|
44
|
+
end
|
45
|
+
|
46
|
+
def merchant_key
|
47
|
+
@merchant_key ||= begin
|
48
|
+
pem = config.merchant_pem || File.read(config.merchant_pem_path)
|
49
|
+
OpenSSL::PKey::RSA.new(pem, config.merchant_password)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def gpe_key
|
54
|
+
@gpe_key ||= begin
|
55
|
+
pem = File.read config.gpe_pem_path
|
56
|
+
OpenSSL::X509::Certificate.new(pem).public_key
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require "nokogiri"
|
2
|
+
require "curb"
|
3
|
+
require "active_support/core_ext/hash"
|
4
|
+
require "gp_webpay/web_services/template"
|
5
|
+
require "gp_webpay/web_services/response"
|
6
|
+
|
7
|
+
module GpWebpay
|
8
|
+
module WebServices
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
def send_request(request_xml)
|
12
|
+
request = Curl::Easy.new(config.web_services_url)
|
13
|
+
request.headers["Content-Type"] = "text/xml;charset=UTF-8"
|
14
|
+
request.http_post(request_xml)
|
15
|
+
request
|
16
|
+
end
|
17
|
+
|
18
|
+
##
|
19
|
+
# Expected output
|
20
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
|
21
|
+
# <soapenv:Body>
|
22
|
+
# <ns2:echoResponse xmlns:ns2="http://gpe.cz/pay/pay-ws/core" xmlns="http://gpe.cz/pay/pay-ws/core/type"/>
|
23
|
+
# </soapenv:Body>
|
24
|
+
# </soapenv:Envelope>
|
25
|
+
##
|
26
|
+
def ws_echo
|
27
|
+
get_params_from(send_request(template.echo).body_str)
|
28
|
+
end
|
29
|
+
|
30
|
+
def ws_process_regular_subscription_payment
|
31
|
+
attributes = request_attributes("processRegularSubscriptionPayment")
|
32
|
+
raw_response = send_request(template.process_regular_subscription_payment(attributes)).body_str
|
33
|
+
get_params_from(raw_response)
|
34
|
+
end
|
35
|
+
|
36
|
+
def ws_get_payment_detail
|
37
|
+
attributes = request_attributes("getPaymentDetail")
|
38
|
+
raw_response = send_request(template.get_payment_detail(attributes)).body_str
|
39
|
+
get_params_from(raw_response)
|
40
|
+
end
|
41
|
+
|
42
|
+
def ws_get_payment_status
|
43
|
+
attributes = request_attributes("getPaymentStatus")
|
44
|
+
raw_response = send_request(template.get_payment_status(attributes)).body_str
|
45
|
+
get_params_from(raw_response)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ws_get_master_payment_status
|
49
|
+
attributes = request_attributes("getMasterPaymentStatus")
|
50
|
+
raw_response = send_request(template.get_master_payment_status(attributes)).body_str
|
51
|
+
get_params_from(raw_response)
|
52
|
+
end
|
53
|
+
|
54
|
+
def message_id(type = "")
|
55
|
+
"#{order_number}0100#{config.merchant_number}#{type}#{Time.now.to_i}"
|
56
|
+
end
|
57
|
+
|
58
|
+
def bank_id
|
59
|
+
"0100"
|
60
|
+
end
|
61
|
+
|
62
|
+
def capture_flag
|
63
|
+
1
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def get_params_from(response)
|
69
|
+
hash_response = Hash.from_xml(Nokogiri::XML(response).to_s)["Envelope"]["Body"]
|
70
|
+
first_lvl_key = hash_response.keys.first
|
71
|
+
hash_response = hash_response["#{first_lvl_key}"]
|
72
|
+
second_lvl_key = hash_response.keys.last
|
73
|
+
hash_response = hash_response["#{second_lvl_key}"]
|
74
|
+
GpWebpay::WebServices::Response.new(hash_response)
|
75
|
+
end
|
76
|
+
|
77
|
+
def request_attributes(type = "")
|
78
|
+
{
|
79
|
+
message_id: message_id(type),
|
80
|
+
merchant_number: config.merchant_number,
|
81
|
+
order_number: order_number,
|
82
|
+
merchant_order_number: merchant_order_number,
|
83
|
+
master_order_number: master_order_number,
|
84
|
+
amount: amount_in_cents,
|
85
|
+
capture_flag: capture_flag,
|
86
|
+
card_holder_name: card_holder.name,
|
87
|
+
card_holder_email: card_holder.email,
|
88
|
+
card_holder_phone_country: card_holder.phone_country,
|
89
|
+
card_holder_phone: card_holder.phone,
|
90
|
+
card_holder_mobile_phone_country: card_holder.mobile_phone_country,
|
91
|
+
card_holder_mobile_phone: card_holder.mobile_phone,
|
92
|
+
address_match: address_match,
|
93
|
+
billing_name: billing.name,
|
94
|
+
billing_address1: billing.address1,
|
95
|
+
billing_city: billing.city,
|
96
|
+
billing_postal_code: billing.postal_code,
|
97
|
+
billing_country: billing.country,
|
98
|
+
shipping_name: shipping.name,
|
99
|
+
shipping_address1: shipping.address1,
|
100
|
+
shipping_city: shipping.city,
|
101
|
+
shipping_postal_code: shipping.postal_code,
|
102
|
+
shipping_country: shipping.country,
|
103
|
+
digest: ws_verification(type).digest,
|
104
|
+
# Deprecated Attrs, will remove
|
105
|
+
currency: currency,
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
def config
|
110
|
+
GpWebpay.config
|
111
|
+
end
|
112
|
+
|
113
|
+
def template
|
114
|
+
GpWebpay::WebServices::Template.new
|
115
|
+
end
|
116
|
+
|
117
|
+
def ws_attributes(type)
|
118
|
+
PaymentAttributes.new(self, true, type).to_h
|
119
|
+
end
|
120
|
+
|
121
|
+
def ws_verification(type)
|
122
|
+
::GpWebpay::Verification.new(ws_attributes(type))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GpWebpay
|
2
|
+
module WebServices
|
3
|
+
class Response
|
4
|
+
attr_accessor :plain
|
5
|
+
|
6
|
+
def initialize(data)
|
7
|
+
@plain = data
|
8
|
+
|
9
|
+
return unless data.respond_to?(:keys)
|
10
|
+
data.keys.each do |key|
|
11
|
+
define_singleton_method key.underscore do
|
12
|
+
data[key]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,225 @@
|
|
1
|
+
module GpWebpay
|
2
|
+
module WebServices
|
3
|
+
class Template
|
4
|
+
|
5
|
+
##
|
6
|
+
# Generated XML request body
|
7
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:core="http://gpe.cz/pay/pay-ws/core">
|
8
|
+
# <soapenv:Header/>
|
9
|
+
# <soapenv:Body>
|
10
|
+
# <v1:echo/>
|
11
|
+
# </soapenv:Body>
|
12
|
+
# </soapenv:Envelope>
|
13
|
+
##
|
14
|
+
def echo
|
15
|
+
::Nokogiri::XML::Builder.new(:encoding => "utf-8") do |xml|
|
16
|
+
xml.send("soapenv:Envelope", "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:v1" => "http://gpe.cz/pay/pay-ws/proc/v1") {
|
17
|
+
xml.send("soapenv:Header")
|
18
|
+
xml.send("soapenv:Body") {
|
19
|
+
xml.send("v1:echo")
|
20
|
+
}
|
21
|
+
}
|
22
|
+
end.to_xml
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://gpe.cz/pay/pay-ws/proc/v1" xmlns:type="http://gpe.cz/pay/pay-ws/proc/v1/type">
|
27
|
+
# <soapenv:Header/>
|
28
|
+
# <soapenv:Body>
|
29
|
+
# <v1:processRegularSubscriptionPayment>
|
30
|
+
# <v1:regularSubscriptionPaymentRequest>
|
31
|
+
# <type:messageId>?</type:messageId>
|
32
|
+
# <type:provider>?</type:provider> -> previously as acquirer
|
33
|
+
# <type:merchantNumber>?</type:merchantNumber>
|
34
|
+
# <type:paymentNumber>?</type:paymentNumber> -> previously orderNumber (now optional)
|
35
|
+
# <type:masterPaymentNumber>?</type:masterPaymentNumber>
|
36
|
+
# <type:orderNumber>?</type:orderNumber>
|
37
|
+
# <type:subscriptionAmount>?</type:subscriptionAmount> -> previously amount, now unable to change
|
38
|
+
# <type:captureFlag>?</type:captureFlag>
|
39
|
+
# <type:cardHolderData>
|
40
|
+
# <type:cardholderDetails>
|
41
|
+
# <type:name>?</type:name>
|
42
|
+
# <type:email>?</type:email>
|
43
|
+
# <type:phoneCountry>?</type:phoneCountry>
|
44
|
+
# <type:phone>?</type:phone>
|
45
|
+
# <type:mobilePhoneCountry>?</type:mobilePhoneCountry>
|
46
|
+
# <type:mobilePhone>?</type:mobilePhone>
|
47
|
+
# <type:clientIpAddress>?</type:clientIpAddress>
|
48
|
+
# </type:cardholderDetails>
|
49
|
+
# <type:addressMatch>?</type:addressMatch>
|
50
|
+
# <type:billingDetails>
|
51
|
+
# <type:name>?</type:name>
|
52
|
+
# <type:address1>?</type:address1>
|
53
|
+
# <type:city>?</type:city>
|
54
|
+
# <type:postalCode>?</type:postalCode>
|
55
|
+
# <type:country>?</type:country>
|
56
|
+
# </type:billingDetails>
|
57
|
+
# <type:shippingDetails>
|
58
|
+
# <type:name>?</type:name>
|
59
|
+
# <type:address1>?</type:address1>
|
60
|
+
# <type:city>?</type:city>
|
61
|
+
# <type:postalCode>?</type:postalCode>
|
62
|
+
# <type:country>?</type:country>
|
63
|
+
# </type:shippingDetails>
|
64
|
+
# </type:cardHolderData>
|
65
|
+
# <type:signature>cid:992953179904</type:signature>
|
66
|
+
# </v1:regularSubscriptionPaymentRequest>
|
67
|
+
# </v1:processRegularSubscriptionPayment>
|
68
|
+
# </soapenv:Body>
|
69
|
+
# </soapenv:Envelope>
|
70
|
+
##
|
71
|
+
def process_regular_subscription_payment(attributes = {})
|
72
|
+
::Nokogiri::XML::Builder.new(:encoding => "utf-8") do |xml|
|
73
|
+
xml.send("soapenv:Envelope", "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:v1" => "http://gpe.cz/pay/pay-ws/proc/v1", "xmlns:type" => "http://gpe.cz/pay/pay-ws/proc/v1/type") {
|
74
|
+
xml.send("soapenv:Header")
|
75
|
+
xml.send("soapenv:Body") {
|
76
|
+
xml.send("v1:processRegularSubscriptionPayment") {
|
77
|
+
xml.send("v1:regularSubscriptionPaymentRequest") {
|
78
|
+
xml.send("type:messageId", attributes[:message_id])
|
79
|
+
xml.send("type:provider", "0100")
|
80
|
+
xml.send("type:merchantNumber", attributes[:merchant_number])
|
81
|
+
xml.send("type:paymentNumber", attributes[:order_number])
|
82
|
+
xml.send("type:masterPaymentNumber", attributes[:master_order_number])
|
83
|
+
xml.send("type:orderNumber", attributes[:merchant_order_number])
|
84
|
+
xml.send("type:subscriptionAmount", attributes[:amount])
|
85
|
+
xml.send("type:captureFlag", attributes[:capture_flag])
|
86
|
+
xml.send("type:cardHolderData") {
|
87
|
+
xml.send("type:cardholderDetails") {
|
88
|
+
xml.send("type:name", attributes[:card_holder_name])
|
89
|
+
xml.send("type:email", attributes[:card_holder_email])
|
90
|
+
xml.send("type:phoneCountry", attributes[:card_holder_phone_country])
|
91
|
+
xml.send("type:phone", attributes[:card_holder_phone])
|
92
|
+
xml.send("type:mobilePhoneCountry", attributes[:card_holder_mobile_phone_country])
|
93
|
+
xml.send("type:mobilePhone", attributes[:card_holder_mobile_phone])
|
94
|
+
}
|
95
|
+
xml.send("type:addressMatch", attributes[:address_match])
|
96
|
+
xml.send("type:billingDetails") {
|
97
|
+
xml.send("type:name", attributes[:billing_name])
|
98
|
+
xml.send("type:address1", attributes[:billing_address1])
|
99
|
+
xml.send("type:city", attributes[:billing_city])
|
100
|
+
xml.send("type:postalCode", attributes[:billing_postal_code])
|
101
|
+
xml.send("type:country", attributes[:billing_country])
|
102
|
+
}
|
103
|
+
xml.send("type:shippingDetails") {
|
104
|
+
xml.send("type:name", attributes[:shipping_name])
|
105
|
+
xml.send("type:address1", attributes[:shipping_address1])
|
106
|
+
xml.send("type:city", attributes[:shipping_city])
|
107
|
+
xml.send("type:postalCode", attributes[:shipping_postal_code])
|
108
|
+
xml.send("type:country", attributes[:shipping_country])
|
109
|
+
}
|
110
|
+
}
|
111
|
+
xml.send("type:signature", attributes[:digest])
|
112
|
+
}
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
end.to_xml
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://gpe.cz/pay/pay-ws/proc/v1" xmlns:type="http://gpe.cz/pay/pay-ws/proc/v1/type">
|
121
|
+
# <soapenv:Header/>
|
122
|
+
# <soapenv:Body>
|
123
|
+
# <v1:getPaymentDetail>
|
124
|
+
# <v1:paymentDetailRequest>
|
125
|
+
# <type:messageId>?</type:messageId>
|
126
|
+
# <type:provider>?</type:provider>
|
127
|
+
# <type:merchantNumber>?</type:merchantNumber>
|
128
|
+
# <type:paymentNumber>?</type:paymentNumber>
|
129
|
+
# <type:signature>cid:1203306453242</type:signature>
|
130
|
+
# </v1:paymentDetailRequest>
|
131
|
+
# </v1:getPaymentDetail>
|
132
|
+
# </soapenv:Body>
|
133
|
+
# </soapenv:Envelope>
|
134
|
+
##
|
135
|
+
def get_payment_detail(attributes = {})
|
136
|
+
::Nokogiri::XML::Builder.new(:encoding => "utf-8") do |xml|
|
137
|
+
xml.send("soapenv:Envelope", "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:v1" => "http://gpe.cz/pay/pay-ws/proc/v1", "xmlns:type" => "http://gpe.cz/pay/pay-ws/proc/v1/type") {
|
138
|
+
xml.send("soapenv:Header")
|
139
|
+
xml.send("soapenv:Body") {
|
140
|
+
xml.send("v1:getPaymentDetail") {
|
141
|
+
xml.send("v1:paymentDetailRequest") {
|
142
|
+
xml.send("type:messageId", attributes[:message_id])
|
143
|
+
xml.send("type:provider", "0100")
|
144
|
+
xml.send("type:merchantNumber", attributes[:merchant_number])
|
145
|
+
xml.send("type:paymentNumber", attributes[:order_number])
|
146
|
+
xml.send("type:signature", attributes[:digest])
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
}
|
151
|
+
end.to_xml
|
152
|
+
end
|
153
|
+
|
154
|
+
##
|
155
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://gpe.cz/pay/pay-ws/proc/v1" xmlns:type="http://gpe.cz/pay/pay-ws/proc/v1/type">
|
156
|
+
# <soapenv:Header/>
|
157
|
+
# <soapenv:Body>
|
158
|
+
# <v1:getPaymentStatus>
|
159
|
+
# <v1:paymentStatusRequest>
|
160
|
+
# <type:messageId>?</type:messageId>
|
161
|
+
# <type:provider>?</type:provider>
|
162
|
+
# <type:merchantNumber>?</type:merchantNumber>
|
163
|
+
# <type:paymentNumber>?</type:paymentNumber>
|
164
|
+
# <type:signature>cid:619237523074</type:signature>
|
165
|
+
# </v1:paymentStatusRequest>
|
166
|
+
# </v1:getPaymentStatus>
|
167
|
+
# </soapenv:Body>
|
168
|
+
# </soapenv:Envelope>
|
169
|
+
##
|
170
|
+
def get_payment_status(attributes = {})
|
171
|
+
::Nokogiri::XML::Builder.new(:encoding => "utf-8") do |xml|
|
172
|
+
xml.send("soapenv:Envelope", "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:v1" => "http://gpe.cz/pay/pay-ws/proc/v1", "xmlns:type" => "http://gpe.cz/pay/pay-ws/proc/v1/type") {
|
173
|
+
xml.send("soapenv:Header")
|
174
|
+
xml.send("soapenv:Body") {
|
175
|
+
xml.send("v1:getPaymentStatus") {
|
176
|
+
xml.send("v1:paymentStatusRequest") {
|
177
|
+
xml.send("type:messageId", attributes[:message_id])
|
178
|
+
xml.send("type:provider", "0100")
|
179
|
+
xml.send("type:merchantNumber", attributes[:merchant_number])
|
180
|
+
xml.send("type:paymentNumber", attributes[:order_number])
|
181
|
+
xml.send("type:signature", attributes[:digest])
|
182
|
+
}
|
183
|
+
}
|
184
|
+
}
|
185
|
+
}
|
186
|
+
end.to_xml
|
187
|
+
end
|
188
|
+
|
189
|
+
##
|
190
|
+
# <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="http://gpe.cz/pay/pay-ws/proc/v1" xmlns:type="http://gpe.cz/pay/pay-ws/proc/v1/type">
|
191
|
+
# <soapenv:Header/>
|
192
|
+
# <soapenv:Body>
|
193
|
+
# <v1:getMasterPaymentStatus>
|
194
|
+
# <v1:masterPaymentStatusRequest>
|
195
|
+
# <type:messageId>?</type:messageId>
|
196
|
+
# <type:provider>?</type:provider>
|
197
|
+
# <type:merchantNumber>?</type:merchantNumber>
|
198
|
+
# <type:paymentNumber>?</type:paymentNumber>
|
199
|
+
# <type:signature>cid:300161986033</type:signature>
|
200
|
+
# </v1:masterPaymentStatusRequest>
|
201
|
+
# </v1:getMasterPaymentStatus>
|
202
|
+
# </soapenv:Body>
|
203
|
+
# </soapenv:Envelope>
|
204
|
+
##
|
205
|
+
def get_master_payment_status(attributes = {})
|
206
|
+
::Nokogiri::XML::Builder.new(:encoding => "utf-8") do |xml|
|
207
|
+
xml.send("soapenv:Envelope", "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:v1" => "http://gpe.cz/pay/pay-ws/proc/v1", "xmlns:type" => "http://gpe.cz/pay/pay-ws/proc/v1/type") {
|
208
|
+
xml.send("soapenv:Header")
|
209
|
+
xml.send("soapenv:Body") {
|
210
|
+
xml.send("v1:getMasterPaymentStatus") {
|
211
|
+
xml.send("v1:masterPaymentStatusRequest") {
|
212
|
+
xml.send("type:messageId", attributes[:message_id])
|
213
|
+
xml.send("type:provider", "0100")
|
214
|
+
xml.send("type:merchantNumber", attributes[:merchant_number])
|
215
|
+
xml.send("type:paymentNumber", attributes[:order_number])
|
216
|
+
xml.send("type:signature", attributes[:digest])
|
217
|
+
}
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
end.to_xml
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
metadata
ADDED
@@ -0,0 +1,246 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-gpwebpay
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrej Antas
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: curb
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.2'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.2'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.14'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.14'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: vcr
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '3.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: webmock
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '3.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '3.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: pry
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: wasabi
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: libxml-ruby
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: timecop
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
description:
|
196
|
+
email:
|
197
|
+
- andrej@antas.cz
|
198
|
+
executables: []
|
199
|
+
extensions: []
|
200
|
+
extra_rdoc_files: []
|
201
|
+
files:
|
202
|
+
- ".gitignore"
|
203
|
+
- ".rspec"
|
204
|
+
- ".ruby_gemset"
|
205
|
+
- ".travis.yml"
|
206
|
+
- Gemfile
|
207
|
+
- README.md
|
208
|
+
- Rakefile
|
209
|
+
- bin/console
|
210
|
+
- bin/setup
|
211
|
+
- certs/muzo.signing_prod.pem
|
212
|
+
- certs/muzo.signing_test.pem
|
213
|
+
- gp_webpay.gemspec
|
214
|
+
- lib/gp_webpay.rb
|
215
|
+
- lib/gp_webpay/config.rb
|
216
|
+
- lib/gp_webpay/payment.rb
|
217
|
+
- lib/gp_webpay/payment_attributes.rb
|
218
|
+
- lib/gp_webpay/verification.rb
|
219
|
+
- lib/gp_webpay/version.rb
|
220
|
+
- lib/gp_webpay/web_services.rb
|
221
|
+
- lib/gp_webpay/web_services/response.rb
|
222
|
+
- lib/gp_webpay/web_services/template.rb
|
223
|
+
homepage: https://github.com/redrick/gpwebpay
|
224
|
+
licenses:
|
225
|
+
- MIT
|
226
|
+
metadata: {}
|
227
|
+
post_install_message:
|
228
|
+
rdoc_options: []
|
229
|
+
require_paths:
|
230
|
+
- lib
|
231
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
+
requirements:
|
233
|
+
- - ">="
|
234
|
+
- !ruby/object:Gem::Version
|
235
|
+
version: '0'
|
236
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
|
+
requirements:
|
238
|
+
- - ">="
|
239
|
+
- !ruby/object:Gem::Version
|
240
|
+
version: '0'
|
241
|
+
requirements: []
|
242
|
+
rubygems_version: 3.0.8
|
243
|
+
signing_key:
|
244
|
+
specification_version: 4
|
245
|
+
summary: GP webpay, payments, SOAP, payment gateway
|
246
|
+
test_files: []
|