ruby-gpwebpay 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Build Status](https://travis-ci.org/redrick/gpwebpay.svg?branch=master)](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: []
|