solidus_open_pay 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +61 -0
- data/.github/stale.yml +1 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/.rubocop.yml +249 -0
- data/Gemfile +49 -0
- data/LICENSE +26 -0
- data/README.md +37 -0
- data/Rakefile +11 -0
- data/app/assets/images/solidus_open_pay/.gitkeep +0 -0
- data/app/assets/javascripts/spree/backend/solidus_open_pay.js +2 -0
- data/app/assets/javascripts/spree/frontend/solidus_open_pay.js +2 -0
- data/app/assets/stylesheets/spree/backend/solidus_openpay.css +3 -0
- data/app/assets/stylesheets/spree/frontend/solidus_openpay.css +3 -0
- data/app/models/concerns/solidus_open_pay/attributes_access.rb +83 -0
- data/app/models/solidus_open_pay/builders/charge.rb +72 -0
- data/app/models/solidus_open_pay/gateway.rb +98 -0
- data/app/models/solidus_open_pay/payment_method.rb +30 -0
- data/app/models/solidus_open_pay/payment_source.rb +25 -0
- data/app/models/solidus_open_pay/response.rb +63 -0
- data/app/views/checkouts/payment/_open_pay.html.erb +171 -0
- data/app/views/spree/admin/payments/source_views/_open_pay.html.erb +21 -0
- data/app/views/spree/api/payments/source_views/_open_pay.json.jbuilder +3 -0
- data/app/views/spree/checkout/payment/_open_pay.html.erb +183 -0
- data/bin/console +17 -0
- data/bin/rails +7 -0
- data/bin/rails-engine +13 -0
- data/bin/rails-sandbox +16 -0
- data/bin/rake +7 -0
- data/bin/sandbox +86 -0
- data/bin/setup +8 -0
- data/config/locales/en.yml +44 -0
- data/config/locales/es-MX.yml +44 -0
- data/config/locales/es.yml +44 -0
- data/config/routes.rb +7 -0
- data/db/migrate/20241120003957_add_open_pay_sources.rb +23 -0
- data/lib/generators/solidus_open_pay/install/install_generator.rb +113 -0
- data/lib/generators/solidus_open_pay/install/templates/config/initializers/solidus_open_pay.rb +6 -0
- data/lib/solidus_open_pay/configuration.rb +27 -0
- data/lib/solidus_open_pay/engine.rb +38 -0
- data/lib/solidus_open_pay/testing_support/factories.rb +34 -0
- data/lib/solidus_open_pay/version.rb +5 -0
- data/lib/solidus_open_pay.rb +5 -0
- data/lib/tasks/solidus_openpay_tasks.rake +6 -0
- data/solidus_open_pay.gemspec +39 -0
- data/spec/models/solidus_open_pay/payment_method_spec.rb +417 -0
- data/spec/solidus_open_pay_spec_helper.rb +5 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/factory_bot.rb +10 -0
- data/spec/support/solidus.rb +18 -0
- data/spec/support/solidus_open_pay/gateway_helpers.rb +27 -0
- metadata +197 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2a77eeaba7a6f01bbbda6121509295f60486fc77a0eb96dd8abe83c799600ad9
|
4
|
+
data.tar.gz: c3f19ae015068b57cf1fdaa5cc0082004b3f1ca58dbb4b1b678c5b1ba1a956fa
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: cf8148eeb07175b2222a40271f344f362f1654656e95e54df250ff86bd23e61ab6ff7ae4f4604e302b5606e58c995ab9973cf3b04799b28a1688e270a3c98eea
|
7
|
+
data.tar.gz: 85db198e931a44e60bb9c8d979e8d49fbba979ca01c9463ebc8045176c220e2e727b8dc60c96b37bbacaa2b41d78b8a8df2b5d702df4e562c69151f047e4cc10
|
@@ -0,0 +1,61 @@
|
|
1
|
+
version: 2.1
|
2
|
+
|
3
|
+
orbs:
|
4
|
+
# Always take the latest version of the orb, this allows us to
|
5
|
+
# run specs against Solidus supported versions only without the need
|
6
|
+
# to change this configuration every time a Solidus version is released
|
7
|
+
# or goes EOL.
|
8
|
+
solidusio_extensions: solidusio/extensions@volatile
|
9
|
+
|
10
|
+
jobs:
|
11
|
+
run-specs:
|
12
|
+
parameters:
|
13
|
+
solidus:
|
14
|
+
type: string
|
15
|
+
default: main
|
16
|
+
db:
|
17
|
+
type: string
|
18
|
+
default: "postgres"
|
19
|
+
ruby:
|
20
|
+
type: string
|
21
|
+
default: "3.2"
|
22
|
+
executor:
|
23
|
+
name: solidusio_extensions/<< parameters.db >>
|
24
|
+
ruby_version: << parameters.ruby >>
|
25
|
+
steps:
|
26
|
+
- checkout
|
27
|
+
- solidusio_extensions/run-tests-solidus-<< parameters.solidus >>
|
28
|
+
|
29
|
+
workflows:
|
30
|
+
"Run specs on supported Solidus versions":
|
31
|
+
jobs:
|
32
|
+
- run-specs:
|
33
|
+
name: &name "run-specs-solidus-<< matrix.solidus >>-ruby-<< matrix.ruby >>-db-<< matrix.db >>"
|
34
|
+
matrix:
|
35
|
+
parameters: { solidus: ["main"], ruby: ["3.2"], db: ["postgres"] }
|
36
|
+
- run-specs:
|
37
|
+
name: *name
|
38
|
+
matrix:
|
39
|
+
parameters: { solidus: ["current"], ruby: ["3.1"], db: ["mysql"] }
|
40
|
+
- run-specs:
|
41
|
+
name: *name
|
42
|
+
matrix:
|
43
|
+
parameters: { solidus: ["older"], ruby: ["3.0"], db: ["sqlite"] }
|
44
|
+
|
45
|
+
"Weekly run specs against main":
|
46
|
+
triggers:
|
47
|
+
- schedule:
|
48
|
+
cron: "0 0 * * 4" # every Thursday
|
49
|
+
filters:
|
50
|
+
branches:
|
51
|
+
only:
|
52
|
+
- main
|
53
|
+
jobs:
|
54
|
+
- run-specs:
|
55
|
+
name: *name
|
56
|
+
matrix:
|
57
|
+
parameters: { solidus: ["main"], ruby: ["3.2"], db: ["postgres"] }
|
58
|
+
- run-specs:
|
59
|
+
name: *name
|
60
|
+
matrix:
|
61
|
+
parameters: { solidus: ["current"], ruby: ["3.1"], db: ["mysql"] }
|
data/.github/stale.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
_extends: .github
|
data/.gitignore
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
*.gem
|
2
|
+
\#*
|
3
|
+
*~
|
4
|
+
.#*
|
5
|
+
.DS_Store
|
6
|
+
.idea
|
7
|
+
.project
|
8
|
+
.sass-cache
|
9
|
+
coverage
|
10
|
+
dummy-app
|
11
|
+
Gemfile.lock
|
12
|
+
tmp
|
13
|
+
nbproject
|
14
|
+
pkg
|
15
|
+
*.swp
|
16
|
+
spec/dummy
|
17
|
+
spec/examples.txt
|
18
|
+
/sandbox
|
19
|
+
.rvmrc
|
20
|
+
.ruby-version
|
21
|
+
.ruby-gemset
|
22
|
+
coverage/*.html
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,249 @@
|
|
1
|
+
require:
|
2
|
+
- solidus_dev_support/rubocop
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
NewCops: disable
|
6
|
+
TargetRubyVersion: 2.5
|
7
|
+
Exclude:
|
8
|
+
- sandbox/**/*
|
9
|
+
- dummy-app/**/*
|
10
|
+
- spec/dummy/**/*
|
11
|
+
- vendor/bundle/**/*
|
12
|
+
|
13
|
+
# We use class vars and will have to continue doing so for compatability
|
14
|
+
Style/ClassVars:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
# We need these names for backwards compatability
|
18
|
+
Naming/PredicateName:
|
19
|
+
Enabled: false
|
20
|
+
|
21
|
+
Naming/AccessorMethodName:
|
22
|
+
Enabled: false
|
23
|
+
|
24
|
+
# This has been used for customization
|
25
|
+
Style/MutableConstant:
|
26
|
+
Enabled: false
|
27
|
+
|
28
|
+
Style/ClassAndModuleChildren:
|
29
|
+
Enabled: false
|
30
|
+
|
31
|
+
Style/GuardClause:
|
32
|
+
Enabled: false
|
33
|
+
|
34
|
+
Style/WordArray:
|
35
|
+
Enabled: false
|
36
|
+
|
37
|
+
Style/ConditionalAssignment:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Style/RaiseArgs:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Naming/BinaryOperatorParameterName:
|
44
|
+
Enabled: false
|
45
|
+
|
46
|
+
# We can use good judgement here
|
47
|
+
Style/RegexpLiteral:
|
48
|
+
Enabled: false
|
49
|
+
|
50
|
+
# Unicode comments are useful
|
51
|
+
Style/AsciiComments:
|
52
|
+
Enabled: false
|
53
|
+
|
54
|
+
Layout/EndAlignment:
|
55
|
+
Enabled: false
|
56
|
+
|
57
|
+
Layout/ElseAlignment:
|
58
|
+
Enabled: false
|
59
|
+
|
60
|
+
Layout/IndentationWidth:
|
61
|
+
Enabled: false
|
62
|
+
|
63
|
+
Layout/ClosingParenthesisIndentation:
|
64
|
+
Enabled: false
|
65
|
+
|
66
|
+
Layout/MultilineMethodCallIndentation:
|
67
|
+
Enabled: false
|
68
|
+
|
69
|
+
Style/Alias:
|
70
|
+
Enabled: false
|
71
|
+
StyleGuide: http://relaxed.ruby.style/#stylealias
|
72
|
+
|
73
|
+
Style/BeginBlock:
|
74
|
+
Enabled: false
|
75
|
+
StyleGuide: http://relaxed.ruby.style/#stylebeginblock
|
76
|
+
|
77
|
+
Style/BlockDelimiters:
|
78
|
+
Enabled: false
|
79
|
+
StyleGuide: http://relaxed.ruby.style/#styleblockdelimiters
|
80
|
+
|
81
|
+
Style/Documentation:
|
82
|
+
Enabled: false
|
83
|
+
StyleGuide: http://relaxed.ruby.style/#styledocumentation
|
84
|
+
|
85
|
+
Layout/DotPosition:
|
86
|
+
Enabled: false
|
87
|
+
StyleGuide: http://relaxed.ruby.style/#styledotposition
|
88
|
+
|
89
|
+
Style/DoubleNegation:
|
90
|
+
Enabled: false
|
91
|
+
StyleGuide: http://relaxed.ruby.style/#styledoublenegation
|
92
|
+
|
93
|
+
Style/EndBlock:
|
94
|
+
Enabled: false
|
95
|
+
StyleGuide: http://relaxed.ruby.style/#styleendblock
|
96
|
+
|
97
|
+
Style/FormatString:
|
98
|
+
Enabled: false
|
99
|
+
StyleGuide: http://relaxed.ruby.style/#styleformatstring
|
100
|
+
|
101
|
+
Style/IfUnlessModifier:
|
102
|
+
Enabled: false
|
103
|
+
StyleGuide: http://relaxed.ruby.style/#styleifunlessmodifier
|
104
|
+
|
105
|
+
Style/Lambda:
|
106
|
+
Enabled: false
|
107
|
+
StyleGuide: http://relaxed.ruby.style/#stylelambda
|
108
|
+
|
109
|
+
Style/ModuleFunction:
|
110
|
+
Enabled: false
|
111
|
+
StyleGuide: http://relaxed.ruby.style/#stylemodulefunction
|
112
|
+
|
113
|
+
Style/MultilineBlockChain:
|
114
|
+
Enabled: false
|
115
|
+
StyleGuide: http://relaxed.ruby.style/#stylemultilineblockchain
|
116
|
+
|
117
|
+
Style/NegatedIf:
|
118
|
+
Enabled: false
|
119
|
+
StyleGuide: http://relaxed.ruby.style/#stylenegatedif
|
120
|
+
|
121
|
+
Style/NegatedWhile:
|
122
|
+
Enabled: false
|
123
|
+
StyleGuide: http://relaxed.ruby.style/#stylenegatedwhile
|
124
|
+
|
125
|
+
Style/ParallelAssignment:
|
126
|
+
Enabled: false
|
127
|
+
StyleGuide: http://relaxed.ruby.style/#styleparallelassignment
|
128
|
+
|
129
|
+
Style/PercentLiteralDelimiters:
|
130
|
+
Enabled: false
|
131
|
+
StyleGuide: http://relaxed.ruby.style/#stylepercentliteraldelimiters
|
132
|
+
|
133
|
+
Style/PerlBackrefs:
|
134
|
+
Enabled: false
|
135
|
+
StyleGuide: http://relaxed.ruby.style/#styleperlbackrefs
|
136
|
+
|
137
|
+
Style/Semicolon:
|
138
|
+
Enabled: false
|
139
|
+
StyleGuide: http://relaxed.ruby.style/#stylesemicolon
|
140
|
+
|
141
|
+
Style/SignalException:
|
142
|
+
Enabled: false
|
143
|
+
StyleGuide: http://relaxed.ruby.style/#stylesignalexception
|
144
|
+
|
145
|
+
Style/SingleLineBlockParams:
|
146
|
+
Enabled: false
|
147
|
+
StyleGuide: http://relaxed.ruby.style/#stylesinglelineblockparams
|
148
|
+
|
149
|
+
Style/SingleLineMethods:
|
150
|
+
Enabled: false
|
151
|
+
StyleGuide: http://relaxed.ruby.style/#stylesinglelinemethods
|
152
|
+
|
153
|
+
Layout/SpaceBeforeBlockBraces:
|
154
|
+
Enabled: false
|
155
|
+
StyleGuide: http://relaxed.ruby.style/#stylespacebeforeblockbraces
|
156
|
+
|
157
|
+
Layout/SpaceInsideParens:
|
158
|
+
Enabled: false
|
159
|
+
StyleGuide: http://relaxed.ruby.style/#stylespaceinsideparens
|
160
|
+
|
161
|
+
Style/SpecialGlobalVars:
|
162
|
+
Enabled: false
|
163
|
+
StyleGuide: http://relaxed.ruby.style/#stylespecialglobalvars
|
164
|
+
|
165
|
+
Style/StringLiterals:
|
166
|
+
Enabled: false
|
167
|
+
StyleGuide: http://relaxed.ruby.style/#stylestringliterals
|
168
|
+
|
169
|
+
Style/SymbolProc:
|
170
|
+
Enabled: false
|
171
|
+
|
172
|
+
Style/WhileUntilModifier:
|
173
|
+
Enabled: false
|
174
|
+
StyleGuide: http://relaxed.ruby.style/#stylewhileuntilmodifier
|
175
|
+
|
176
|
+
Lint/AmbiguousRegexpLiteral:
|
177
|
+
Enabled: false
|
178
|
+
StyleGuide: http://relaxed.ruby.style/#lintambiguousregexpliteral
|
179
|
+
|
180
|
+
Lint/AssignmentInCondition:
|
181
|
+
Enabled: false
|
182
|
+
StyleGuide: http://relaxed.ruby.style/#lintassignmentincondition
|
183
|
+
|
184
|
+
Lint/SuppressedException:
|
185
|
+
Exclude:
|
186
|
+
- 'Rakefile'
|
187
|
+
|
188
|
+
Metrics/AbcSize:
|
189
|
+
Enabled: false
|
190
|
+
|
191
|
+
Metrics/BlockNesting:
|
192
|
+
Enabled: false
|
193
|
+
|
194
|
+
Metrics/ClassLength:
|
195
|
+
Enabled: false
|
196
|
+
|
197
|
+
Metrics/ModuleLength:
|
198
|
+
Enabled: false
|
199
|
+
|
200
|
+
Metrics/CyclomaticComplexity:
|
201
|
+
Enabled: false
|
202
|
+
|
203
|
+
Layout/LineLength:
|
204
|
+
Enabled: false
|
205
|
+
|
206
|
+
Metrics/MethodLength:
|
207
|
+
Enabled: false
|
208
|
+
|
209
|
+
Metrics/ParameterLists:
|
210
|
+
Enabled: false
|
211
|
+
|
212
|
+
Metrics/PerceivedComplexity:
|
213
|
+
Enabled: false
|
214
|
+
|
215
|
+
Lint/EmptyBlock:
|
216
|
+
Enabled: false
|
217
|
+
|
218
|
+
Gemspec/DevelopmentDependencies:
|
219
|
+
Enabled: false
|
220
|
+
|
221
|
+
Lint/ScriptPermission:
|
222
|
+
Enabled: false
|
223
|
+
|
224
|
+
Lint/NonDeterministicRequireOrder:
|
225
|
+
Enabled: false
|
226
|
+
|
227
|
+
Lint/ShadowingOuterLocalVariable:
|
228
|
+
Enabled: false
|
229
|
+
|
230
|
+
Gemspec/RequireMFA:
|
231
|
+
Enabled: false
|
232
|
+
|
233
|
+
Gemspec/DeprecatedAttributeAssignment:
|
234
|
+
Enabled: false
|
235
|
+
|
236
|
+
Layout/ArgumentAlignment:
|
237
|
+
Enabled: false
|
238
|
+
|
239
|
+
RSpec/AnyInstance:
|
240
|
+
Enabled: false
|
241
|
+
|
242
|
+
RSpec/MultipleMemoizedHelpers:
|
243
|
+
Enabled: false
|
244
|
+
|
245
|
+
RSpec/MultipleExpectations:
|
246
|
+
Enabled: false
|
247
|
+
|
248
|
+
RSpec/NestedGroups:
|
249
|
+
Enabled: false
|
data/Gemfile
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
5
|
+
|
6
|
+
branch = ENV.fetch('SOLIDUS_BRANCH', 'main')
|
7
|
+
gem 'solidus', github: 'solidusio/solidus', branch: branch
|
8
|
+
|
9
|
+
# The solidus_frontend gem has been pulled out since v3.2
|
10
|
+
if branch >= 'v3.2'
|
11
|
+
gem 'solidus_frontend'
|
12
|
+
elsif branch == 'main'
|
13
|
+
gem 'solidus_frontend', github: 'solidusio/solidus_frontend', branch: branch
|
14
|
+
else
|
15
|
+
gem 'solidus_frontend', github: 'solidusio/solidus', branch: branch
|
16
|
+
end
|
17
|
+
|
18
|
+
# Provides basic authentication functionality for testing parts of your engine
|
19
|
+
gem 'solidus_auth_devise'
|
20
|
+
|
21
|
+
case ENV.fetch('DB', nil)
|
22
|
+
when 'mysql'
|
23
|
+
gem 'mysql2'
|
24
|
+
when 'postgresql'
|
25
|
+
gem 'pg'
|
26
|
+
else
|
27
|
+
gem 'sqlite3', '~> 1.4'
|
28
|
+
end
|
29
|
+
|
30
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3')
|
31
|
+
# While we still support Ruby < 3 we need to workaround a limitation in
|
32
|
+
# the 'async' gem that relies on the latest ruby, since RubyGems doesn't
|
33
|
+
# resolve gems based on the required ruby version.
|
34
|
+
gem 'async', '< 3', require: false
|
35
|
+
end
|
36
|
+
|
37
|
+
# 'net/smtp' is required by 'mail', see:
|
38
|
+
# - https://github.com/ruby/net-protocol/issues/10
|
39
|
+
# - https://stackoverflow.com/a/72474475
|
40
|
+
gem 'net-smtp', require: false
|
41
|
+
|
42
|
+
gemspec
|
43
|
+
|
44
|
+
# Use a local Gemfile to include development dependencies that might not be
|
45
|
+
# relevant for the project or for other contributors, e.g. pry-byebug.
|
46
|
+
#
|
47
|
+
# We use `send` instead of calling `eval_gemfile` to work around an issue with
|
48
|
+
# how Dependabot parses projects: https://github.com/dependabot/dependabot-core/issues/1658.
|
49
|
+
send(:eval_gemfile, 'Gemfile-local') if File.exist? 'Gemfile-local'
|
data/LICENSE
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2017 [name of plugin creator]
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without modification,
|
5
|
+
are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
* Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
* Neither the name Spree nor the names of its contributors may be used to
|
13
|
+
endorse or promote products derived from this software without specific
|
14
|
+
prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
20
|
+
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
21
|
+
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
22
|
+
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
23
|
+
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
24
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
25
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
26
|
+
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Solidus OpenPay
|
2
|
+
|
3
|
+
[](https://circleci.com/gh/jtapia/solidus_open_pay)
|
4
|
+
|
5
|
+
Add solidus_open_pay to your Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'solidus_open_pay', github: 'jtapia/solidus_open_pay'
|
9
|
+
```
|
10
|
+
|
11
|
+
Then run:
|
12
|
+
|
13
|
+
```shell
|
14
|
+
bundle
|
15
|
+
bundle exec rails g solidus_open_pay:install
|
16
|
+
```
|
17
|
+
|
18
|
+
## Setup OpenPay Payments
|
19
|
+
|
20
|
+
You need to go to [Openpay](https://www.openpay.mx/), create an account and retrieve your ID, private and public api keys.
|
21
|
+
|
22
|
+
On the solidus application admin side go to:
|
23
|
+
|
24
|
+
- `/admin/payment_methods/new`
|
25
|
+
|
26
|
+
```
|
27
|
+
In the provider box, choose one of the following options depending on your needs (freemium version only works with credit card):
|
28
|
+
|
29
|
+
SolidusOpenPay::PaymentMethod
|
30
|
+
```
|
31
|
+
|
32
|
+
## Source Methods
|
33
|
+
|
34
|
+
Solidus Openpay currently supports:
|
35
|
+
|
36
|
+
#### Card
|
37
|
+
> Card method will let you pay using your credit or debit card. More info: More info: [Openpay Card](https://www.openpay.mx/docs/save-card.html)
|
data/Rakefile
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Don't build a dummy app with solidus_bolt enabled
|
4
|
+
ENV['SKIP_SOLIDUS_BOLT'] = 'true'
|
5
|
+
|
6
|
+
require 'bundler/gem_tasks'
|
7
|
+
|
8
|
+
require 'solidus_dev_support/rake_tasks'
|
9
|
+
SolidusDevSupport::RakeTasks.install
|
10
|
+
|
11
|
+
task default: 'extension:specs'
|
File without changes
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusOpenPay
|
4
|
+
module AttributesAccess
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
attr_accessor :brand,
|
9
|
+
:device_session_id,
|
10
|
+
:expiration_month,
|
11
|
+
:expiration_year,
|
12
|
+
:number,
|
13
|
+
:token_id,
|
14
|
+
:verification_value,
|
15
|
+
:points_card,
|
16
|
+
:points_type
|
17
|
+
|
18
|
+
def brand=(value)
|
19
|
+
self[:brand] = value.to_s.gsub(/\s/, '')
|
20
|
+
end
|
21
|
+
|
22
|
+
def device_session_id=(value)
|
23
|
+
self[:device_session_id] = value.to_s.gsub(/\s/, '')
|
24
|
+
end
|
25
|
+
|
26
|
+
def number=(value)
|
27
|
+
number_value =
|
28
|
+
if value.is_a?(String)
|
29
|
+
value.gsub(/[^0-9]/, '')
|
30
|
+
end
|
31
|
+
|
32
|
+
self[:number] = if number_value.to_s.length <= 4
|
33
|
+
number_value
|
34
|
+
else
|
35
|
+
number_value.to_s.last(4)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def token_id=(value)
|
40
|
+
self[:token_id] = value.to_s.gsub(/\s/, '')
|
41
|
+
end
|
42
|
+
|
43
|
+
def points_card=(value)
|
44
|
+
self[:points_card] = value.to_s.gsub(/\s/, '')
|
45
|
+
end
|
46
|
+
|
47
|
+
def points_type=(value)
|
48
|
+
self[:points_type] = value.to_s.gsub(/\s/, '')
|
49
|
+
end
|
50
|
+
|
51
|
+
def expiration_month=(value)
|
52
|
+
self[:expiration_month] = value.to_i if value
|
53
|
+
end
|
54
|
+
|
55
|
+
def expiration_year=(value)
|
56
|
+
if value
|
57
|
+
self[:expiration_year] = "20#{value}" if value.length == 2
|
58
|
+
self[:expiration_year] = value.to_i
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def brand
|
63
|
+
self[:brand]
|
64
|
+
end
|
65
|
+
|
66
|
+
def device_session_id
|
67
|
+
self[:device_session_id]
|
68
|
+
end
|
69
|
+
|
70
|
+
def number
|
71
|
+
self[:number]
|
72
|
+
end
|
73
|
+
|
74
|
+
def token_id
|
75
|
+
self[:token_id]
|
76
|
+
end
|
77
|
+
|
78
|
+
def display_number
|
79
|
+
"XXXX-XXXX-XXXX-#{number}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SolidusOpenPay
|
4
|
+
module Builders
|
5
|
+
class Charge
|
6
|
+
attr_reader :source, :amount, :options
|
7
|
+
|
8
|
+
def initialize(source:, amount:, options: {})
|
9
|
+
@source = source
|
10
|
+
@amount = amount
|
11
|
+
@options = options
|
12
|
+
end
|
13
|
+
|
14
|
+
def payload
|
15
|
+
{
|
16
|
+
'source_id' => token_id,
|
17
|
+
'method' => 'card',
|
18
|
+
'amount' => amount / 100,
|
19
|
+
'currency' => 'MXN',
|
20
|
+
'capture' => capture,
|
21
|
+
'description' => 'Cargo inicial',
|
22
|
+
'order_id' => order_id,
|
23
|
+
'device_session_id' => device_session_id,
|
24
|
+
'customer' => {
|
25
|
+
'name' => first_name,
|
26
|
+
'last_name' => last_name,
|
27
|
+
'phone_number' => phone_number,
|
28
|
+
'email' => email
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def token_id
|
36
|
+
@token_id ||= source.token_id
|
37
|
+
end
|
38
|
+
|
39
|
+
def email
|
40
|
+
@email ||= order&.email || 'pedidos@donmanolito.com'
|
41
|
+
end
|
42
|
+
|
43
|
+
def capture
|
44
|
+
@capture ||= options[:capture] || false
|
45
|
+
end
|
46
|
+
|
47
|
+
def order_id
|
48
|
+
@order_id ||= options[:order_id]
|
49
|
+
end
|
50
|
+
|
51
|
+
def order
|
52
|
+
@order ||= Spree::Order.find_by(number: order_id.split[0])
|
53
|
+
end
|
54
|
+
|
55
|
+
def phone_number
|
56
|
+
@phone_number ||= order&.bill_address&.phone
|
57
|
+
end
|
58
|
+
|
59
|
+
def device_session_id
|
60
|
+
@device_session_id ||= source.device_session_id
|
61
|
+
end
|
62
|
+
|
63
|
+
def first_name
|
64
|
+
@first_name ||= source.name.split[0]
|
65
|
+
end
|
66
|
+
|
67
|
+
def last_name
|
68
|
+
@last_name ||= source.name.split[1]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|