mandarin_pay 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +29 -0
- data/.rubocop.yml +63 -0
- data/.travis.yml +6 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +9 -0
- data/MIT-LICENSE +20 -0
- data/README.md +88 -0
- data/Rakefile +7 -0
- data/app/controllers/.gitkeep +0 -0
- data/app/controllers/mandarin_pay_controller.rb +33 -0
- data/bin/bundler +16 -0
- data/bin/cdiff +16 -0
- data/bin/colortab +16 -0
- data/bin/coveralls +16 -0
- data/bin/decolor +16 -0
- data/bin/erubis +16 -0
- data/bin/htmldiff +16 -0
- data/bin/ldiff +16 -0
- data/bin/nokogiri +16 -0
- data/bin/rackup +16 -0
- data/bin/rails +16 -0
- data/bin/rake +16 -0
- data/bin/rspec +16 -0
- data/bin/sprockets +16 -0
- data/bin/term_display +16 -0
- data/bin/term_mandel +16 -0
- data/bin/thor +16 -0
- data/config/routes.rb +11 -0
- data/lib/generators/mandarin_pay/install_generator.rb +10 -0
- data/lib/generators/mandarin_pay/templates/mandarin_pay.rb +15 -0
- data/lib/mandarin_pay/action_view_extension.rb +17 -0
- data/lib/mandarin_pay/client.rb +16 -0
- data/lib/mandarin_pay/configuration.rb +17 -0
- data/lib/mandarin_pay/conformity_params.rb +47 -0
- data/lib/mandarin_pay/engine.rb +9 -0
- data/lib/mandarin_pay/notification.rb +29 -0
- data/lib/mandarin_pay/payment_interface.rb +25 -0
- data/lib/mandarin_pay/signature_generator.rb +28 -0
- data/lib/mandarin_pay/version.rb +3 -0
- data/lib/mandarin_pay.rb +26 -0
- data/mandarin_pay.gemspec +24 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/controllers/application_controller.rb +4 -0
- data/spec/dummy/app/controllers/welcome_controller.rb +5 -0
- data/spec/dummy/app/views/layouts/application.html.erb +12 -0
- data/spec/dummy/app/views/welcome/index.html.erb +17 -0
- data/spec/dummy/config/application.rb +56 -0
- data/spec/dummy/config/boot.rb +11 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +6 -0
- data/spec/dummy/config/environments/development.rb +40 -0
- data/spec/dummy/config/environments/production.rb +70 -0
- data/spec/dummy/config/environments/test.rb +40 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +8 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mandarin_pay.rb +4 -0
- data/spec/dummy/config/initializers/mime_types.rb +6 -0
- data/spec/dummy/config/initializers/secret_token.rb +8 -0
- data/spec/dummy/config/initializers/session_store.rb +9 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +15 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +6 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/mandarin_pay/client_configuration_spec.rb +35 -0
- data/spec/mandarin_pay/notification_spec.rb +51 -0
- data/spec/mandarin_pay/payment_interface_spec.rb +39 -0
- data/spec/spec_helper.rb +11 -0
- metadata +177 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c6aa66899bf036fe36b6d408f2a7f123ed8036d6
|
4
|
+
data.tar.gz: 13e097421df68143d2c77129e9d697835104dd8e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 782885f15b6a4286a390003e57910a855d00d6250f9d168abd44199395fb29d4269d0f6bb5d788eb57d68f49bf0611b3d36a7c5400f0a505fdabbea6fdf0aa6b
|
7
|
+
data.tar.gz: db5859cb85061582a8dfeba7855ce168dd20c34bbde686c5a45286db883f3ea60668f984d325064f46500bf31c86e3b9bb8e065946a3bf693db5a2549fadb638
|
data/.gitignore
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
.bundle/
|
2
|
+
log/*.log
|
3
|
+
pkg/
|
4
|
+
spec/dummy/log
|
5
|
+
spec/dummy/db/*.sqlite3
|
6
|
+
spec/dummy/tmp/
|
7
|
+
spec/dummy/.sass-cache
|
8
|
+
*.gem
|
9
|
+
*.rbc
|
10
|
+
.config
|
11
|
+
coverage
|
12
|
+
InstalledFiles
|
13
|
+
lib/bundler/man
|
14
|
+
rdoc
|
15
|
+
spec/reports
|
16
|
+
spec/tmp
|
17
|
+
spec/version_tmp
|
18
|
+
tmp
|
19
|
+
.DS_Store
|
20
|
+
passenger.3000.log
|
21
|
+
passenger.3000.pid.lock
|
22
|
+
|
23
|
+
# YARD artifacts
|
24
|
+
.yardoc
|
25
|
+
_yardoc
|
26
|
+
doc/
|
27
|
+
Gemfile.lock
|
28
|
+
*.swp
|
29
|
+
*.swo
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
AllCops:
|
2
|
+
Include:
|
3
|
+
- "**/Rakefile"
|
4
|
+
- "**/config.ru"
|
5
|
+
Exclude:
|
6
|
+
- "db/**/*"
|
7
|
+
- "config/**/*"
|
8
|
+
- "script/**/*"
|
9
|
+
- "frontend/**/*"
|
10
|
+
- "vendor/**/*"
|
11
|
+
- "lib/generators/**/*"
|
12
|
+
- "lib/templates/**/*"
|
13
|
+
TargetRubyVersion: 2.3
|
14
|
+
|
15
|
+
Rails:
|
16
|
+
Enabled: true
|
17
|
+
|
18
|
+
Style/Documentation:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Style/Encoding:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
Style/StringLiterals:
|
25
|
+
EnforcedStyle: double_quotes
|
26
|
+
|
27
|
+
Style/MultilineOperationIndentation:
|
28
|
+
EnforcedStyle: indented
|
29
|
+
|
30
|
+
Style/MultilineMethodCallIndentation:
|
31
|
+
EnforcedStyle: indented
|
32
|
+
|
33
|
+
Style/IfUnlessModifier:
|
34
|
+
MaxLineLength: 120
|
35
|
+
|
36
|
+
Style/WhileUntilModifier:
|
37
|
+
MaxLineLength: 120
|
38
|
+
|
39
|
+
Style/LambdaCall:
|
40
|
+
Enabled: false
|
41
|
+
|
42
|
+
Metrics/LineLength:
|
43
|
+
Max: 120
|
44
|
+
|
45
|
+
Metrics/ClassLength:
|
46
|
+
CountComments: false
|
47
|
+
Max: 300
|
48
|
+
|
49
|
+
Metrics/ModuleLength:
|
50
|
+
CountComments: false
|
51
|
+
Max: 300
|
52
|
+
|
53
|
+
Metrics/MethodLength:
|
54
|
+
CountComments: false
|
55
|
+
Max: 15
|
56
|
+
|
57
|
+
Metrics/AbcSize:
|
58
|
+
Max: 25
|
59
|
+
|
60
|
+
Style/AsciiComments:
|
61
|
+
Description: "Use only ascii symbols in comments."
|
62
|
+
StyleGuide: "https://github.com/bbatsov/ruby-style-guide#english-comments"
|
63
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2016 Alexander Maslov <drakmail@gmail.com>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
## The MandarinPay gem
|
2
|
+
|
3
|
+
by [Drakmail][]
|
4
|
+
|
5
|
+
[Drakmail]: http://drakmail.ru
|
6
|
+
|
7
|
+
Ruby wrapper for [Mandarin Pay API][]. Make Mandarin Pay to work with your Rails project without pain. MandarinPay took the best from [rubykassa gem][] and [Active Merchant Robokassa integration] but easier to use and setup.
|
8
|
+
|
9
|
+
[MandarinPay API]: http://mandarin_pay.com/sites/default/files/protokol_integracii_v0.5.5_0.pdf
|
10
|
+
[rubykassa gem]: https://github.com/ZeroOneStudio/rubykassa
|
11
|
+
[Active Merchant Robokassa integration]: https://github.com/Shopify/active_merchant/tree/master/lib/active_merchant/billing/integrations/robokassa
|
12
|
+
|
13
|
+
## Installation
|
14
|
+
|
15
|
+
Add to your `Gemfile`:
|
16
|
+
|
17
|
+
gem "mandarin_pay"
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Run `rails g mandarin_pay:install`, get an initializer with the following code:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
MandarinPay.configure do |config|
|
25
|
+
config.merchant_id = ENV["MANDARINPAY_MERCHANT_ID"]
|
26
|
+
config.sharedsec = ENV["MANDARINPAY_SHAREDSEC"]
|
27
|
+
|
28
|
+
# Result callback is called in MandarinPayController#paid action if valid signature
|
29
|
+
# was generated. It should always return "OK#{ invoice_id }" string, so implement
|
30
|
+
# your custom logic above `render text: notification.success` line
|
31
|
+
|
32
|
+
config.result_callback = ->(notification) { render text: notification.success }
|
33
|
+
|
34
|
+
# Define success or failure callbacks here like:
|
35
|
+
|
36
|
+
# config.success_callback = ->(notification) { render text: 'success' }
|
37
|
+
# config.fail_callback = ->(notification) { redirect_to root_path }
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
and configure it with your credentials.
|
42
|
+
|
43
|
+
Also, you need to specify Result URL, Success URL and Fail URL at the "Technical Settings" (Технические настройки) in your MandarinPay dashboard:
|
44
|
+
|
45
|
+
* Result URL: `http://<your_domain>/mandarin_pay/paid`
|
46
|
+
* Success URL: `http://<your_domain>/mandarin_pay/success`
|
47
|
+
* Fail URL: `http://<your_domain>/mandarin_pay/fail`
|
48
|
+
|
49
|
+
To define custom success/fail callbacks you can also use the initializer:
|
50
|
+
|
51
|
+
MandarinPay.configure do |config|
|
52
|
+
...
|
53
|
+
config.success_callback = ->(notification) { render text: 'success' }
|
54
|
+
config.fail_callback = ->(notification) { redirect_to root_path }
|
55
|
+
config.result_callback = ->(notification) { render text: notification.success }
|
56
|
+
end
|
57
|
+
|
58
|
+
Lambdas are called in MandarinPayController so you can respond with [any kind that is supported by Rails](http://guides.rubyonrails.org/layouts_and_rendering.html#creating-responses).
|
59
|
+
|
60
|
+
NOTE: `result_callback` should always return `"OK"` string. So, implement your custom logic above `render text: notification.success` line.
|
61
|
+
|
62
|
+
Once you are done, simply use `pay_form` helper in your view:
|
63
|
+
|
64
|
+
<%= pay_form "Pay with Mandarin Pay", "invoice_number", 20.00 %>
|
65
|
+
|
66
|
+
Additionally you may want to pass extra options. There is no problem:
|
67
|
+
|
68
|
+
<%= pay_form "Pay with Mandarin Pay", "invoice_number", 20.00, customer_email: "user@example.com", class: "btn btn-succses", form_class: "mp-form" %>
|
69
|
+
|
70
|
+
## Supported Rubies and Rails versions
|
71
|
+
|
72
|
+
Rubies:
|
73
|
+
* 2.0.0
|
74
|
+
* 2.1.0
|
75
|
+
* 2.2.0
|
76
|
+
* 2.3.0
|
77
|
+
|
78
|
+
Rails:
|
79
|
+
* ~> 4.0.0
|
80
|
+
* ~> 4.1.0
|
81
|
+
* ~> 4.2.0
|
82
|
+
|
83
|
+
## License
|
84
|
+
|
85
|
+
This project rocks and uses MIT-LICENSE
|
86
|
+
Copyright (c) 2016 [Drakmail][]
|
87
|
+
|
88
|
+
[Drakmail]: http://drakmail.ru
|
data/Rakefile
ADDED
File without changes
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class MandarinPayController < ApplicationController
|
2
|
+
before_action :create_notification
|
3
|
+
|
4
|
+
def paid
|
5
|
+
if @notification.valid_result_signature?
|
6
|
+
instance_exec @notification, &MandarinPay.result_callback
|
7
|
+
else
|
8
|
+
instance_exec @notification, &MandarinPay.fail_callback
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def success
|
13
|
+
if @notification.valid_success_signature?
|
14
|
+
instance_exec @notification, &MandarinPay.success_callback
|
15
|
+
else
|
16
|
+
instance_exec @notification, &MandarinPay.fail_callback
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def fail
|
21
|
+
instance_exec @notification, &MandarinPay.fail_callback
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def create_notification
|
27
|
+
if request.get?
|
28
|
+
@notification = MandarinPay::Notification.new request.query_parameters
|
29
|
+
elsif request.post?
|
30
|
+
@notification = MandarinPay::Notification.new request.request_parameters
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/bin/bundler
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'bundler' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("bundler", "bundler")
|
data/bin/cdiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'cdiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("term-ansicolor", "cdiff")
|
data/bin/colortab
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'colortab' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("term-ansicolor", "colortab")
|
data/bin/coveralls
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'coveralls' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("coveralls", "coveralls")
|
data/bin/decolor
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'decolor' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("term-ansicolor", "decolor")
|
data/bin/erubis
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'erubis' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("erubis", "erubis")
|
data/bin/htmldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'htmldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("diff-lcs", "htmldiff")
|
data/bin/ldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("diff-lcs", "ldiff")
|
data/bin/nokogiri
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'nokogiri' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("nokogiri", "nokogiri")
|
data/bin/rackup
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rackup' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rack", "rackup")
|
data/bin/rails
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rails' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("railties", "rails")
|
data/bin/rake
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rake' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rake", "rake")
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("rspec-core", "rspec")
|
data/bin/sprockets
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'sprockets' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("sprockets", "sprockets")
|
data/bin/term_display
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'term_display' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("term-ansicolor", "term_display")
|
data/bin/term_mandel
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'term_mandel' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("term-ansicolor", "term_mandel")
|
data/bin/thor
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'thor' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require "pathname"
|
10
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require "rubygems"
|
14
|
+
require "bundler/setup"
|
15
|
+
|
16
|
+
load Gem.bin_path("thor", "thor")
|
data/config/routes.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Rails.application.routes.draw do
|
4
|
+
if MandarinPay::Client.configuration
|
5
|
+
scope "/mandarin_pay" do
|
6
|
+
%w(paid success fail).map do |route|
|
7
|
+
post "/#{route}" => "mandarin_pay##{route}", as: "mandarin_pay_#{route}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
|
3
|
+
module MandarinPay
|
4
|
+
class InstallGenerator < Rails::Generators::Base
|
5
|
+
source_root File.expand_path("../templates", __FILE__)
|
6
|
+
def create_initializer_file
|
7
|
+
template "mandarin_pay.rb", File.join("config", "initializers", "mandarin_pay.rb")
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
MandarinPay.configure do |config|
|
2
|
+
config.merchant_id = ENV["MANDARINPAY_MERCHANT_ID"]
|
3
|
+
config.sharedsec = ENV["MANDARINPAY_SHAREDSEC"]
|
4
|
+
|
5
|
+
# Result callback is called in MandarinPayController#paid action if valid signature
|
6
|
+
# was generated. It should always return "OK#{ invoice_id }" string, so implement
|
7
|
+
# your custom logic above `render text: notification.success` line
|
8
|
+
|
9
|
+
config.result_callback = ->(notification) { render text: notification.success }
|
10
|
+
|
11
|
+
# Define success or failure callbacks here like:
|
12
|
+
|
13
|
+
# config.success_callback = ->(notification) { render text: 'success' }
|
14
|
+
# config.fail_callback = ->(notification) { redirect_to root_path }
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module MandarinPay
|
2
|
+
module ActionViewExtension
|
3
|
+
def pay_form(phrase, order_id, price, options = {})
|
4
|
+
pi = MandarinPay::PaymentInterface.new
|
5
|
+
class_names = options.delete(:class)
|
6
|
+
form_class = options.delete(:form_class)
|
7
|
+
params = pi.pay_params({ order_id: order_id, price: price }.merge(options))
|
8
|
+
form_tag pi.base_url, method: :post, class: form_class do
|
9
|
+
fields = params.map do |param, value|
|
10
|
+
hidden_field_tag param, value
|
11
|
+
end
|
12
|
+
fields.push submit_tag(phrase, class: class_names)
|
13
|
+
fields.join.html_safe
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mandarin_pay/configuration"
|
4
|
+
|
5
|
+
module MandarinPay
|
6
|
+
class Client
|
7
|
+
class << self
|
8
|
+
attr_accessor :configuration
|
9
|
+
|
10
|
+
def configure
|
11
|
+
self.configuration = MandarinPay::Configuration.new
|
12
|
+
yield configuration
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module MandarinPay
|
4
|
+
class Configuration
|
5
|
+
ATTRIBUTES = [:merchant_id, :sharedsec, :success_callback, :fail_callback, :result_callback].freeze
|
6
|
+
|
7
|
+
attr_accessor(*ATTRIBUTES)
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
self.merchant_id = "your_merchant_id"
|
11
|
+
self.sharedsec = "sharedsec"
|
12
|
+
self.success_callback = ->(_notification) { render text: "success" }
|
13
|
+
self.fail_callback = ->(_notification) { render text: "fail" }
|
14
|
+
self.result_callback = ->(_notification) { render text: notification.success }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|