solidus_braintree 1.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +78 -0
  3. data/.gem_release.yml +5 -0
  4. data/.github/stale.yml +1 -0
  5. data/.github_changelog_generator +2 -0
  6. data/.gitignore +21 -10
  7. data/.rspec +1 -1
  8. data/.rubocop.yml +86 -0
  9. data/CHANGELOG.md +186 -18
  10. data/Gemfile +35 -17
  11. data/LICENSE +26 -0
  12. data/README.md +389 -24
  13. data/Rakefile +6 -16
  14. data/app/assets/config/solidus_braintree_manifest.js +0 -0
  15. data/app/assets/javascripts/spree/backend/solidus_braintree/client.js +239 -0
  16. data/app/assets/javascripts/spree/backend/solidus_braintree/constants.js +89 -0
  17. data/app/assets/javascripts/spree/backend/solidus_braintree/hosted_form.js +46 -0
  18. data/app/assets/javascripts/spree/backend/solidus_braintree/promise.js +20 -0
  19. data/app/assets/javascripts/spree/backend/solidus_braintree.js +96 -0
  20. data/app/assets/stylesheets/spree/backend/solidus_braintree.scss +28 -0
  21. data/app/decorators/controllers/solidus_braintree/admin_payments_controller_decorator.rb +11 -0
  22. data/app/decorators/controllers/solidus_braintree/client_tokens_controller.rb +41 -0
  23. data/app/decorators/models/solidus_braintree/spree/store_decorator.rb +20 -0
  24. data/app/decorators/models/solidus_braintree/spree/user_decorator.rb +13 -0
  25. data/app/helpers/solidus_braintree/braintree_admin_helper.rb +23 -0
  26. data/app/models/application_record.rb +5 -0
  27. data/app/models/solidus_braintree/address.rb +64 -0
  28. data/app/models/solidus_braintree/avs_result.rb +69 -0
  29. data/app/models/solidus_braintree/configuration.rb +39 -0
  30. data/app/models/solidus_braintree/customer.rb +8 -0
  31. data/app/models/solidus_braintree/gateway.rb +437 -0
  32. data/app/models/solidus_braintree/response.rb +80 -0
  33. data/app/models/solidus_braintree/source.rb +140 -0
  34. data/app/models/solidus_braintree/transaction.rb +31 -0
  35. data/app/models/solidus_braintree/transaction_address.rb +88 -0
  36. data/app/models/solidus_braintree/transaction_import.rb +98 -0
  37. data/app/views/spree/api/payments/source_views/_braintree.json.jbuilder +3 -0
  38. data/bin/console +4 -1
  39. data/bin/dummy-app +37 -0
  40. data/bin/rails +5 -5
  41. data/bin/rails-dummy-app +17 -0
  42. data/bin/rails-engine +13 -0
  43. data/bin/rails-sandbox +16 -0
  44. data/bin/rake +7 -0
  45. data/bin/rspec +11 -0
  46. data/bin/sandbox +61 -0
  47. data/bin/setup +5 -4
  48. data/config/locales/en.yml +94 -2
  49. data/config/locales/it.yml +56 -0
  50. data/config/routes.rb +12 -3
  51. data/db/migrate/20160830061749_create_solidus_paypal_braintree_sources.rb +16 -0
  52. data/db/migrate/20160906201711_create_solidus_paypal_braintree_customers.rb +13 -0
  53. data/db/migrate/20161114231422_create_solidus_paypal_braintree_configurations.rb +11 -0
  54. data/db/migrate/20161125172005_add_braintree_configuration_to_stores.rb +7 -0
  55. data/db/migrate/20170203191030_add_credit_card_to_braintree_configuration.rb +6 -0
  56. data/db/migrate/20170505193712_add_null_constraint_to_sources.rb +38 -0
  57. data/db/migrate/20170508085402_add_not_null_constraint_to_sources_payment_type.rb +14 -0
  58. data/db/migrate/20190705115327_add_paypal_button_preferences_to_braintree_configurations.rb +5 -0
  59. data/db/migrate/20190911141712_add_3d_secure_to_braintree_configuration.rb +5 -0
  60. data/db/migrate/20211222170950_add_paypal_funding_source_to_solidus_paypal_braintree_sources.rb +5 -0
  61. data/db/migrate/20220104150301_add_venmo_to_braintree_configuration.rb +5 -0
  62. data/db/migrate/20230109080950_rename_solidus_paypal_braintree_source_type.rb +31 -0
  63. data/db/migrate/20230210104310_add_device_data_to_braintree_sources.rb +5 -0
  64. data/lib/controllers/backend/solidus_braintree/configurations_controller.rb +48 -0
  65. data/lib/generators/solidus_braintree/install/install_generator.rb +155 -19
  66. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_blue_button_280x48.svg +19 -0
  67. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_blue_button_320x48.svg +19 -0
  68. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_blue_button_375x48.svg +19 -0
  69. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_white_button_280x48.svg +19 -0
  70. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_white_button_320x48.svg +19 -0
  71. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_active_white_button_375x48.svg +19 -0
  72. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_blue_acceptance_mark.svg +15 -0
  73. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_blue_button_280x48.svg +19 -0
  74. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_blue_button_320x48.svg +19 -0
  75. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_blue_button_375x48.svg +19 -0
  76. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_blue_logo.svg +18 -0
  77. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_white_acceptance_mark.svg +20 -0
  78. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_white_button_280x48.svg +19 -0
  79. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_white_button_320x48.svg +19 -0
  80. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_white_button_375x48.svg +19 -0
  81. data/lib/generators/solidus_braintree/install/templates/app/assets/images/solidus_braintree/venmo/venmo_white_logo.svg +18 -0
  82. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/paypal_button.js +34 -0
  83. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/ajax.js +13 -0
  84. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/apple_pay_button.js +179 -0
  85. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/checkout.js +113 -0
  86. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/client.js +239 -0
  87. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/constants.js +89 -0
  88. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/frontend.js +15 -0
  89. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/hosted_form.js +48 -0
  90. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/paypal_button.js +178 -0
  91. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/paypal_messaging.js +22 -0
  92. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/promise.js +20 -0
  93. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree/venmo_button.js +86 -0
  94. data/lib/generators/solidus_braintree/install/templates/app/assets/javascripts/spree/frontend/solidus_braintree.js +1 -0
  95. data/lib/generators/solidus_braintree/install/templates/app/assets/stylesheets/spree/frontend/solidus_braintree.scss +62 -0
  96. data/lib/generators/solidus_braintree/install/templates/app/controllers/solidus_braintree/checkouts_controller.rb +31 -0
  97. data/lib/generators/solidus_braintree/install/templates/app/controllers/solidus_braintree/transactions_controller.rb +67 -0
  98. data/lib/generators/solidus_braintree/install/templates/app/helpers/solidus_braintree/braintree_checkout_helper.rb +60 -0
  99. data/lib/generators/solidus_braintree/install/templates/app/views/checkouts/existing_payment/_braintree.html.erb +2 -0
  100. data/lib/generators/solidus_braintree/install/templates/app/views/checkouts/payment/_braintree.html.erb +23 -0
  101. data/lib/generators/solidus_braintree/install/templates/app/views/payments/_braintree_payment_details.html.erb +9 -0
  102. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_apple_pay_button.html.erb +27 -0
  103. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_braintree_errors.html.erb +16 -0
  104. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_braintree_head_scripts.html.erb +26 -0
  105. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_braintree_hosted_fields.html.erb +40 -0
  106. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_paypal_cart_button.html.erb +38 -0
  107. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_paypal_checkout_button.html.erb +32 -0
  108. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_paypal_messaging.html.erb +13 -0
  109. data/lib/generators/solidus_braintree/install/templates/app/views/spree/shared/_venmo_button.html.erb +33 -0
  110. data/lib/generators/solidus_braintree/install/templates/config/initializers/solidus_braintree.rb +6 -0
  111. data/lib/solidus_braintree/country_mapper.rb +37 -0
  112. data/lib/solidus_braintree/engine.rb +61 -11
  113. data/lib/solidus_braintree/extension_configuration.rb +23 -0
  114. data/lib/solidus_braintree/request_protection.rb +21 -0
  115. data/lib/solidus_braintree/version.rb +3 -1
  116. data/lib/solidus_braintree.rb +14 -2
  117. data/lib/solidus_paypal_braintree.rb +6 -0
  118. data/lib/views/backend/solidus_braintree/configurations/list.html.erb +63 -0
  119. data/lib/views/backend/spree/admin/payments/source_forms/_braintree.html.erb +16 -0
  120. data/lib/views/backend/spree/admin/payments/source_views/_braintree.html.erb +39 -0
  121. data/lib/views/backend/spree/admin/shared/preference_fields/_preference_select.html.erb +13 -0
  122. data/lib/views/backend_v1.2/spree/admin/payments/source_forms/_braintree.html.erb +16 -0
  123. data/lib/views/backend_v2.4/spree/admin/shared/preference_fields/_hash.html.erb +12 -0
  124. data/solidus_braintree.gemspec +37 -38
  125. data/spec/controllers/solidus_braintree/checkouts_controller_spec.rb +99 -0
  126. data/spec/controllers/solidus_braintree/client_tokens_controller_spec.rb +55 -0
  127. data/spec/controllers/solidus_braintree/configurations_controller_spec.rb +73 -0
  128. data/spec/controllers/solidus_braintree/transactions_controller_spec.rb +183 -0
  129. data/spec/fixtures/cassettes/admin/invalid_credit_card.yml +63 -0
  130. data/spec/fixtures/cassettes/admin/resubmit_credit_card.yml +352 -0
  131. data/spec/fixtures/cassettes/admin/valid_credit_card.yml +412 -0
  132. data/spec/fixtures/cassettes/braintree/create_profile.yml +71 -0
  133. data/spec/fixtures/cassettes/braintree/generate_token.yml +63 -0
  134. data/spec/fixtures/cassettes/braintree/token.yml +63 -0
  135. data/spec/fixtures/cassettes/checkout/invalid_credit_card.yml +63 -0
  136. data/spec/fixtures/cassettes/checkout/resubmit_credit_card.yml +216 -0
  137. data/spec/fixtures/cassettes/checkout/update.yml +71 -0
  138. data/spec/fixtures/cassettes/checkout/valid_credit_card.yml +171 -0
  139. data/spec/fixtures/cassettes/checkout/valid_venmo_transaction.yml +599 -0
  140. data/spec/fixtures/cassettes/gateway/authorize/credit_card/address.yml +86 -0
  141. data/spec/fixtures/cassettes/gateway/authorize/merchant_account/EUR.yml +154 -0
  142. data/spec/fixtures/cassettes/gateway/authorize/paypal/EUR.yml +90 -0
  143. data/spec/fixtures/cassettes/gateway/authorize/paypal/address.yml +90 -0
  144. data/spec/fixtures/cassettes/gateway/authorize.yml +86 -0
  145. data/spec/fixtures/cassettes/gateway/authorized_transaction.yml +73 -0
  146. data/spec/fixtures/cassettes/gateway/cancel/missing.yml +63 -0
  147. data/spec/fixtures/cassettes/gateway/cancel/refunds.yml +272 -0
  148. data/spec/fixtures/cassettes/gateway/cancel/void.yml +201 -0
  149. data/spec/fixtures/cassettes/gateway/capture.yml +141 -0
  150. data/spec/fixtures/cassettes/gateway/complete.yml +157 -0
  151. data/spec/fixtures/cassettes/gateway/credit.yml +208 -0
  152. data/spec/fixtures/cassettes/gateway/customer.yml +79 -0
  153. data/spec/fixtures/cassettes/gateway/purchase.yml +87 -0
  154. data/spec/fixtures/cassettes/gateway/settled_transaction.yml +140 -0
  155. data/spec/fixtures/cassettes/gateway/void.yml +137 -0
  156. data/spec/fixtures/cassettes/source/bin.yml +295 -0
  157. data/spec/fixtures/cassettes/source/card_type.yml +267 -0
  158. data/spec/fixtures/cassettes/source/last4.yml +267 -0
  159. data/spec/fixtures/cassettes/transaction/import/valid/capture.yml +224 -0
  160. data/spec/fixtures/cassettes/transaction/import/valid.yml +71 -0
  161. data/spec/fixtures/views/carts/_cart_footer.html.erb +18 -0
  162. data/spec/helpers/solidus_braintree/braintree_admin_helper_spec.rb +17 -0
  163. data/spec/helpers/solidus_braintree/braintree_checkout_helper_spec.rb +70 -0
  164. data/spec/models/solidus_braintree/address_spec.rb +71 -0
  165. data/spec/models/solidus_braintree/avs_result_spec.rb +317 -0
  166. data/spec/models/solidus_braintree/gateway_spec.rb +774 -0
  167. data/spec/models/solidus_braintree/response_spec.rb +280 -0
  168. data/spec/models/solidus_braintree/source_spec.rb +555 -0
  169. data/spec/models/solidus_braintree/transaction_address_spec.rb +235 -0
  170. data/spec/models/solidus_braintree/transaction_import_spec.rb +302 -0
  171. data/spec/models/solidus_braintree/transaction_spec.rb +86 -0
  172. data/spec/models/spree/store_spec.rb +14 -0
  173. data/spec/requests/spree/api/orders_controller_spec.rb +36 -0
  174. data/spec/solidus_braintree_helper.rb +7 -0
  175. data/spec/support/solidus_braintree/capybara.rb +7 -0
  176. data/spec/support/solidus_braintree/factories.rb +55 -0
  177. data/spec/support/solidus_braintree/gateway_helpers.rb +29 -0
  178. data/spec/support/solidus_braintree/order_ready_for_payment.rb +44 -0
  179. data/spec/support/solidus_braintree/order_walkthrough.rb +87 -0
  180. data/spec/support/solidus_braintree/vcr.rb +42 -0
  181. data/spec/support/solidus_braintree/with_prepended_view_fixtures.rb +19 -0
  182. data/spec/system/backend/configuration_spec.rb +23 -0
  183. data/spec/system/backend/new_payment_spec.rb +136 -0
  184. data/spec/system/frontend/braintree_credit_card_checkout_spec.rb +199 -0
  185. data/spec/system/frontend/paypal_checkout_spec.rb +169 -0
  186. data/spec/system/frontend/venmo_checkout_spec.rb +193 -0
  187. metadata +289 -255
  188. data/.travis.yml +0 -41
  189. data/LICENSE.txt +0 -21
  190. data/app/controllers/spree/api/braintree_client_token_controller.rb +0 -13
  191. data/app/helpers/braintree_view_helpers.rb +0 -20
  192. data/app/models/concerns/solidus_braintree/add_name_validation_concern.rb +0 -8
  193. data/app/models/concerns/solidus_braintree/inject_device_data_concern.rb +0 -18
  194. data/app/models/concerns/solidus_braintree/payment_braintree_nonce_concern.rb +0 -8
  195. data/app/models/concerns/solidus_braintree/permitted_attributes_concern.rb +0 -11
  196. data/app/models/concerns/solidus_braintree/skip_require_card_numbers_concern.rb +0 -14
  197. data/app/models/concerns/solidus_braintree/use_data_field_concern.rb +0 -23
  198. data/app/models/credit_card_decorator.rb +0 -3
  199. data/app/models/payment_decorator.rb +0 -2
  200. data/app/models/permitted_attributes_decorator.rb +0 -1
  201. data/app/models/solidus/gateway/braintree_gateway.rb +0 -306
  202. data/app/overrides/spree/checkout/_confirm/braintree_security.html.erb.deface +0 -9
  203. data/app/views/spree/admin/payments/source_forms/_braintree.html.erb +0 -38
  204. data/app/views/spree/admin/payments/source_views/_braintree.html.erb +0 -30
  205. data/app/views/spree/checkout/payment/_braintree.html.erb +0 -55
  206. data/app/views/spree/checkout/payment/_braintree_initialization.html.erb +0 -12
  207. data/config/initializers/braintree.rb +0 -1
  208. data/db/migrate/20150910170527_add_data_to_credit_card.rb +0 -5
  209. data/db/migrate/20160426221931_add_braintree_device_data_to_order.rb +0 -5
  210. data/lib/assets/javascripts/spree/backend/braintree/solidus_braintree.js +0 -59
  211. data/lib/assets/javascripts/spree/frontend/braintree/solidus_braintree.js +0 -144
  212. data/lib/assets/javascripts/vendor/braintree.js +0 -8
  213. data/lib/assets/stylesheets/spree/frontend/solidus_braintree.scss +0 -26
data/.travis.yml DELETED
@@ -1,41 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- cache:
4
- directories:
5
- - travis_phantomjs
6
-
7
- before_install:
8
- - "export PATH=$PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64/bin:$PATH"
9
- - "if [ $(phantomjs --version) != '2.1.1' ]; then rm -rf $PWD/travis_phantomjs; mkdir -p $PWD/travis_phantomjs; fi"
10
- - "if [ $(phantomjs --version) != '2.1.1' ]; then wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2 -O $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2; fi"
11
- - "if [ $(phantomjs --version) != '2.1.1' ]; then tar -xvf $PWD/travis_phantomjs/phantomjs-2.1.1-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs; fi"
12
- - "phantomjs --version"
13
-
14
- rvm:
15
- - 2.3.1
16
- env:
17
- matrix:
18
- - SOLIDUS_BRANCH=v1.1 DB=postgres
19
- - SOLIDUS_BRANCH=v1.2 DB=postgres
20
- - SOLIDUS_BRANCH=v1.3 DB=postgres
21
- - SOLIDUS_BRANCH=v1.4 DB=postgres
22
- - SOLIDUS_BRANCH=v2.0 DB=postgres
23
- - SOLIDUS_BRANCH=v2.1 DB=postgres
24
- - SOLIDUS_BRANCH=v2.2 DB=postgres
25
- - SOLIDUS_BRANCH=v2.3 DB=postgres
26
- - SOLIDUS_BRANCH=v2.4 DB=postgres
27
- - SOLIDUS_BRANCH=v2.5 DB=postgres
28
- - SOLIDUS_BRANCH=v2.6 DB=postgres
29
- - SOLIDUS_BRANCH=master DB=postgres
30
- - SOLIDUS_BRANCH=v1.1 DB=mysql
31
- - SOLIDUS_BRANCH=v1.2 DB=mysql
32
- - SOLIDUS_BRANCH=v1.3 DB=mysql
33
- - SOLIDUS_BRANCH=v1.4 DB=mysql
34
- - SOLIDUS_BRANCH=v2.0 DB=mysql
35
- - SOLIDUS_BRANCH=v2.1 DB=mysql
36
- - SOLIDUS_BRANCH=v2.2 DB=mysql
37
- - SOLIDUS_BRANCH=v2.3 DB=mysql
38
- - SOLIDUS_BRANCH=v2.4 DB=mysql
39
- - SOLIDUS_BRANCH=v2.5 DB=mysql
40
- - SOLIDUS_BRANCH=v2.6 DB=mysql
41
- - SOLIDUS_BRANCH=master DB=mysql
data/LICENSE.txt DELETED
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2015 Jack Chu
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.
@@ -1,13 +0,0 @@
1
- class Spree::Api::BraintreeClientTokenController < Spree::Api::BaseController
2
- skip_before_action :authenticate_user
3
-
4
- def create
5
- if params[:payment_method_id]
6
- gateway = Solidus::Gateway::BraintreeGateway.find_by!(id: params[:payment_method_id])
7
- else
8
- gateway = Solidus::Gateway::BraintreeGateway.find_by!(active: true)
9
- end
10
-
11
- render json: { client_token: gateway.generate_client_token, payment_method_id: gateway.id }
12
- end
13
- end
@@ -1,20 +0,0 @@
1
- module BraintreeViewHelpers
2
- # Returns a link to the Braintree web UI for the given Braintree +payment_id+
3
- # (e.g. from Spree::Payment#response_code), or just the +payment_id+ if
4
- # Braintree's merchant ID is not configured or +payment_id+ is blank
5
- def braintree_transaction_link(payment_id)
6
- env = ENV['BRAINTREE_ENV'] == 'production' ? 'www' : 'sandbox'
7
- merchant = ENV['BRAINTREE_MERCHANT_ID']
8
-
9
- if payment_id.present? && merchant.present?
10
- link_to(
11
- payment_id,
12
- "https://#{env}.braintreegateway.com/merchants/#{merchant}/transactions/#{payment_id}",
13
- title: 'Show payment on Braintree',
14
- target: '_blank'
15
- )
16
- else
17
- payment_id
18
- end
19
- end
20
- end
@@ -1,8 +0,0 @@
1
- module SolidusBraintree
2
- module AddNameValidationConcern
3
- extend ActiveSupport::Concern
4
- included do
5
- validates :name, presence: true, on: :create
6
- end
7
- end
8
- end
@@ -1,18 +0,0 @@
1
- module SolidusBraintree
2
- module InjectDeviceDataConcern
3
- extend ActiveSupport::Concern
4
- included do
5
- prepend(InstanceMethods)
6
- end
7
-
8
- module InstanceMethods
9
- def gateway_options
10
- options = super
11
-
12
- options[:device_data] = order.braintree_device_data if order.braintree_device_data
13
-
14
- options
15
- end
16
- end
17
- end
18
- end
@@ -1,8 +0,0 @@
1
- module SolidusBraintree
2
- module PaymentBraintreeNonceConcern
3
- extend ActiveSupport::Concern
4
- included do
5
- attr_accessor :payment_method_nonce
6
- end
7
- end
8
- end
@@ -1,11 +0,0 @@
1
- module SolidusBraintree
2
- module PermittedAttributesConcern
3
- def payment_attributes
4
- super | [:payment_method_nonce]
5
- end
6
-
7
- def checkout_attributes
8
- super | [:braintree_device_data]
9
- end
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- module SolidusBraintree
2
- module SkipRequireCardNumbersConcern
3
- extend ActiveSupport::Concern
4
- included do
5
- prepend(InstanceMethods)
6
- end
7
-
8
- module InstanceMethods
9
- def require_card_numbers?
10
- super && !self.payment_method.kind_of?(Solidus::Gateway::BraintreeGateway)
11
- end
12
- end
13
- end
14
- end
@@ -1,23 +0,0 @@
1
- module SolidusBraintree
2
- module UseDataFieldConcern
3
- extend ActiveSupport::Concern
4
- included do
5
- prepend(InstanceMethods)
6
- end
7
-
8
- module InstanceMethods
9
-
10
- def email
11
- data["email"]
12
- end
13
-
14
- def display_number
15
- cc_type == 'paypal' ? email : super
16
- end
17
-
18
- def data
19
- super.is_a?(String) ? JSON.parse(super) : super
20
- end
21
- end
22
- end
23
- end
@@ -1,3 +0,0 @@
1
- Spree::CreditCard.include SolidusBraintree::SkipRequireCardNumbersConcern
2
- Spree::CreditCard.include SolidusBraintree::AddNameValidationConcern
3
- Spree::CreditCard.include SolidusBraintree::UseDataFieldConcern
@@ -1,2 +0,0 @@
1
- Spree::Payment.include SolidusBraintree::PaymentBraintreeNonceConcern
2
- Spree::Payment.include SolidusBraintree::InjectDeviceDataConcern
@@ -1 +0,0 @@
1
- Spree::PermittedAttributes.singleton_class.prepend SolidusBraintree::PermittedAttributesConcern
@@ -1,306 +0,0 @@
1
- require "braintree"
2
-
3
- module Solidus
4
- gateway_superclass =
5
- if SolidusSupport.solidus_gem_version < Gem::Version.new('2.3.x')
6
- ::Spree::Gateway
7
- else
8
- ::Spree::PaymentMethod::CreditCard
9
- end
10
-
11
- class Gateway::BraintreeGateway < gateway_superclass
12
- preference :environment, :string
13
- preference :merchant_id, :string
14
- preference :public_key, :string
15
- preference :private_key, :string
16
- preference :always_send_bill_address, :boolean, default: false
17
- preference :transmit_shipping_address, :boolean, default: true
18
-
19
- CARD_TYPE_MAPPING = {
20
- 'American Express' => 'american_express',
21
- 'Diners Club' => 'diners_club',
22
- 'Discover' => 'discover',
23
- 'JCB' => 'jcb',
24
- 'Laser' => 'laser',
25
- 'Maestro' => 'maestro',
26
- 'MasterCard' => 'master',
27
- 'Solo' => 'solo',
28
- 'Switch' => 'switch',
29
- 'Visa' => 'visa',
30
- }
31
-
32
- if SolidusSupport.solidus_gem_version < Gem::Version.new('2.3.x')
33
- def method_type
34
- 'braintree'
35
- end
36
- else
37
- def partial_name
38
- 'braintree'
39
- end
40
- end
41
-
42
- def gateway_options
43
- {
44
- environment: preferred_environment.to_sym,
45
- merchant_id: preferred_merchant_id,
46
- public_key: preferred_public_key,
47
- private_key: preferred_private_key,
48
- logger: ::Braintree::Configuration.logger.clone,
49
- }
50
- end
51
-
52
- def braintree_gateway
53
- @braintree_gateway ||= ::Braintree::Gateway.new(gateway_options)
54
- end
55
-
56
- def payment_profiles_supported?
57
- true
58
- end
59
-
60
- def generate_client_token(options = {})
61
- braintree_gateway.client_token.generate(options)
62
- end
63
-
64
- def create_profile(payment)
65
- source = payment.source
66
-
67
- return if source.gateway_customer_profile_id.present? || payment.payment_method_nonce.nil?
68
-
69
- user = payment.order.user
70
- email = user ? user.email : payment.order.email
71
- address = (payment.source.address || payment.order.bill_address).try(:active_merchant_hash)
72
-
73
- params = {
74
- first_name: source.first_name,
75
- last_name: source.last_name,
76
- email: email,
77
- credit_card: {
78
- cardholder_name: source.name,
79
- billing_address: map_address(address),
80
- payment_method_nonce: payment.payment_method_nonce,
81
- options: {
82
- verify_card: true,
83
- },
84
- },
85
- device_data: payment.order.braintree_device_data
86
- }
87
-
88
- result = braintree_gateway.customer.create(params)
89
-
90
- if result.success?
91
- card = result.customer.payment_methods.last
92
- source.tap do |solidus_cc|
93
- if card.is_a?(::Braintree::PayPalAccount)
94
- solidus_cc.cc_type = 'paypal'
95
- data = {
96
- email: card.email
97
- }
98
- solidus_cc.data = data.to_json
99
- else
100
- solidus_cc.name = card.cardholder_name
101
- solidus_cc.cc_type = CARD_TYPE_MAPPING[card.card_type]
102
- solidus_cc.month = card.expiration_month
103
- solidus_cc.year = card.expiration_year
104
- solidus_cc.last_digits = card.last_4
105
- end
106
- solidus_cc.payment_method = self
107
- solidus_cc.gateway_customer_profile_id = result.customer.id
108
- solidus_cc.gateway_payment_profile_id = card.token
109
- end
110
- source.save!
111
- else
112
- raise ::Spree::Core::GatewayError, result.message
113
- end
114
- end
115
-
116
- def supports?(payment)
117
- true
118
- end
119
-
120
- def provider_class
121
- self
122
- end
123
-
124
- def authorize(cents, creditcard, options = {})
125
- result = braintree_gateway.transaction.sale(transaction_authorize_or_purchase_params(cents, creditcard, options))
126
- handle_result(result)
127
- end
128
-
129
- def purchase(cents, creditcard, options = {})
130
- params = transaction_authorize_or_purchase_params(cents, creditcard, options)
131
- params[:options][:submit_for_settlement] = true
132
- result = braintree_gateway.transaction.sale(params)
133
- handle_result(result)
134
- end
135
-
136
- def capture(money, authorization_code, options = {})
137
- result = braintree_gateway.transaction.submit_for_settlement(authorization_code, amount(money))
138
- handle_result(result)
139
- end
140
-
141
- def void(authorization_code, source = {}, options = {})
142
- # Allows voiding payments that are in a checkout state
143
- if authorization_code.nil?
144
- # Fake response since we don't need to void anything with Braintree
145
- ActiveMerchant::Billing::Response.new(
146
- true,
147
- "OK",
148
- {},
149
- {}
150
- )
151
- else
152
- result = braintree_gateway.transaction.void(authorization_code)
153
- handle_result(result)
154
- end
155
- end
156
-
157
- def credit(cents, source, authorization_code, options = {})
158
- result = braintree_gateway.transaction.refund(authorization_code, amount(cents))
159
- handle_result(result)
160
- end
161
-
162
- def voidable?(response_code)
163
- transaction = braintree_gateway.transaction.find(response_code)
164
- [
165
- ::Braintree::Transaction::Status::SubmittedForSettlement,
166
- ::Braintree::Transaction::Status::Authorized,
167
- ].include?(transaction.status)
168
- end
169
-
170
- def card_number_placeholder
171
- '4141 4141 4141 4141'
172
- end
173
-
174
- def expiration_date_placeholder
175
- '01/2020'
176
- end
177
-
178
- def card_code_placeholder
179
- '123'
180
- end
181
-
182
- def cancel(response)
183
- if voidable?(response)
184
- void(response)
185
- else
186
- handle_result(
187
- braintree_gateway.transaction.refund(response)
188
- )
189
- end
190
- end
191
-
192
- private
193
- def message_from_result(result)
194
- if result.success?
195
- "OK"
196
- elsif result.errors.count == 0 && result.credit_card_verification
197
- "Processor declined: #{result.credit_card_verification.processor_response_text} (#{result.credit_card_verification.processor_response_code})"
198
- elsif result.errors.count == 0 && result.transaction
199
- result.transaction.status
200
- else
201
- result.errors.map { |e| "#{e.message} (#{e.code})" }.join(" ")
202
- end
203
- end
204
-
205
- def build_results_hash(result)
206
- if result.success?
207
- {
208
- authorization: result.transaction.id,
209
- avs_result: {
210
- code: result.transaction.avs_street_address_response_code
211
- }
212
- }
213
- else
214
- {}
215
- end
216
- end
217
-
218
- def handle_result(result)
219
- ActiveMerchant::Billing::Response.new(
220
- result.success?,
221
- message_from_result(result),
222
- {},
223
- build_results_hash(result)
224
- )
225
- end
226
-
227
- def map_address(addr)
228
- full_name = addr.fetch(:name, "")
229
- *first_name_parts, last_name = full_name.split(" ")
230
- first_name = first_name_parts.join(" ")
231
- last_name ||= ""
232
-
233
- {
234
- first_name: first_name,
235
- last_name: last_name,
236
- street_address: addr[:address1],
237
- extended_address: addr[:address2],
238
- locality: addr[:city],
239
- region: addr[:state],
240
- country_code_alpha2: addr[:country],
241
- postal_code: addr[:zip],
242
- }
243
- end
244
-
245
- def amount(cents)
246
- sprintf("%.2f", cents.to_f / 100)
247
- end
248
-
249
- def transaction_authorize_or_purchase_params(cents, creditcard, options = {})
250
- params = options.select {|k| %i[
251
- billing_address_id
252
- channel
253
- custom_fields
254
- descriptor
255
- device_data
256
- device_session_id
257
- merchant_account_id
258
- options
259
- order_id
260
- purchase_order_number
261
- recurring
262
- service_fee_amount
263
- shipping_address_id
264
- tax_amount
265
- tax_exempt
266
- ].include?(k)}
267
-
268
- params[:options] ||= {}
269
- params[:amount] = amount(cents)
270
- params[:channel] ||= "Solidus"
271
- if (options[:shipping_address] && preferred_transmit_shipping_address)
272
- params[:shipping] = map_address(options[:shipping_address])
273
- end
274
-
275
- if options[:payment_method_nonce]
276
- params[:payment_method_nonce] = options[:payment_method_nonce]
277
- else
278
- params[:payment_method_token] = creditcard.gateway_payment_profile_id
279
- end
280
-
281
- # Send the bill address if we're using a nonce (i.e. doing a one-time
282
- # payment) or if we're configured to always send the bill address
283
- if (
284
- options[:payment_method_nonce] || preferred_always_send_bill_address
285
- ) && options[:billing_address]
286
- params[:billing] = map_address(options[:billing_address])
287
- end
288
-
289
- # if has profile, set the customer_id to the profile_id and delete the customer key
290
- if creditcard.try(:gateway_customer_profile_id)
291
- params[:customer_id] = creditcard.gateway_customer_profile_id
292
- # if no profile, define the customer key, delete the customer_id because they are
293
- # mutually exclusive
294
- else
295
- params[:customer] = {
296
- id: options[:customer_id],
297
- email: options[:customer],
298
- first_name: creditcard.first_name,
299
- last_name: creditcard.last_name,
300
- }
301
- end
302
-
303
- params
304
- end
305
- end
306
- end
@@ -1,9 +0,0 @@
1
- <!-- insert_before "erb[loud]:contains('place_order')" -->
2
-
3
- <%
4
- # Currently we assume we only have one braintree
5
- # payment method. In practice this should be true and it simplifies the code.
6
- braintree_payment = @order.unprocessed_payments.find {|p| p.payment_method.class == Solidus::Gateway::BraintreeGateway }
7
- if braintree_payment %>
8
- <%= render 'spree/checkout/payment/braintree_initialization', payment_method: braintree_payment.payment_method %>
9
- <% end %>
@@ -1,38 +0,0 @@
1
- <fieldset data-id='credit-card' class="no-border-bottom">
2
- <div class="field" data-hook="previous_cards">
3
- <% if previous_cards.any? %>
4
- <% previous_cards.each do |card| %>
5
- <label><%= radio_button_tag :card, card.id, card == previous_cards.first %> <%= card.display_number %><br /></label>
6
- <% end %>
7
- <% end %>
8
- <label><%= radio_button_tag :card, 'new', false, { id: "card_new#{payment_method.id}" } %> <%= Spree.t(:use_new_cc) %></label>
9
- </div>
10
-
11
- <div id="card_form<%= payment_method.id %>" data-hook>
12
- <% param_prefix = "payment_source[#{payment_method.id}]" %>
13
-
14
- <div class="clear"></div>
15
-
16
- <div class="alpha four columns">
17
- <div data-hook="card_name">
18
- <div class="field">
19
- <%= label_tag "card_name#{payment_method.id}", Spree::CreditCard.human_attribute_name(:name), class: 'required' %>
20
- <%= text_field_tag "#{param_prefix}[name]", '', id: "card_name#{payment_method.id}", class: 'required fullwidth', maxlength: 19 %>
21
- </div>
22
- </div>
23
- </div>
24
-
25
- <div id="braintree-dropin"></div>
26
- <input type="hidden" id="payment_method_nonce" name="payment[payment_method_nonce]">
27
-
28
- <div class="clear"></div>
29
-
30
- <%= label_tag "card_address#{payment_method.id}", Spree.t(:billing_address) %>
31
- <% address = @order.bill_address || @order.ship_address || Spree::Address.build_default %>
32
- <%= fields_for "#{param_prefix}[address_attributes]", address do |f| %>
33
- <%= render :partial => 'spree/admin/shared/address_form', :locals => { :f => f, :type => "billing" } %>
34
- <% end %>
35
-
36
- <div class="clear"></div>
37
- </div>
38
- </fieldset>
@@ -1,30 +0,0 @@
1
- <fieldset data-hook="credit_card">
2
- <legend align="center"><%= Spree::CreditCard.model_name.human %></legend>
3
-
4
- <div class="row">
5
- <div class="alpha six columns">
6
- <dl>
7
- <dt><%= Spree.t(:identifier) %>:</dt>
8
- <dd><%= payment.number %></dd>
9
-
10
- <dt><%= Spree.t(:response_code) %>:</dt>
11
- <dd><%= braintree_transaction_link(payment.response_code) %></dd>
12
-
13
- <dt><%= Spree.t(:name_on_card) %>:</dt>
14
- <dd><%= payment.source.name %></dd>
15
-
16
- <dt><%= Spree::CreditCard.human_attribute_name(:cc_type) %>:</dt>
17
- <dd><%= payment.source.cc_type %></dd>
18
-
19
- <dt><%= Spree::CreditCard.human_attribute_name(:number) %>:</dt>
20
- <dd><%= payment.source.display_number %></dd>
21
-
22
- <dt><%= Spree::CreditCard.human_attribute_name(:expiration) %>:</dt>
23
- <dd><%= payment.source.month %>/<%= payment.source.year %></dd>
24
- </dl>
25
- <% if payment.source.address %>
26
- <%= render partial: 'spree/admin/shared/address', locals: {address: payment.source.address} %>
27
- <% end %>
28
- </div>
29
- </div>
30
- </fieldset>
@@ -1,55 +0,0 @@
1
- <div class="braintree-payment">
2
- <%= render 'spree/checkout/payment/braintree_initialization', payment_method: payment_method %>
3
-
4
- <div class="braintree-paypal-input">
5
- <div class="braintree-paypal-header">
6
- <%= t('solidus_braintree.paypal_header_html') %>
7
- </div>
8
- <div id="#braintree_paypal_container"></div>
9
- </div>
10
-
11
- <div class="braintree-cc-input">
12
- <div class="braintree-cc-header">
13
- <%= t('solidus_braintree.creditcard_header_html') %>
14
- <%= image_tag 'credit_cards/credit_card.gif', :id => 'credit-card-image' %>
15
- </div>
16
- <% param_prefix = "payment_source[#{payment_method.id}]" %>
17
-
18
- <p class="field">
19
- <%= label_tag "name_on_card_#{payment_method.id}", Spree.t(:name_on_card) %><span class="required">*</span><br />
20
- <%= text_field_tag "#{param_prefix}[name]", "#{@order.billing_firstname} #{@order.billing_lastname}", { id: "name_on_card_#{payment_method.id}", :autocomplete => "cc-name" } %>
21
- </p>
22
-
23
- <p class="field" data-hook="card_number">
24
- <%= label_tag "braintree_card_number", Spree.t(:card_number) %><span class="required">*</span><br />
25
- <label for="braintree_card_number" id="braintree_card_number" class="braintree-hosted-field"></label>
26
- &nbsp;
27
- <span id="card_type" style="display:none;">
28
- ( <span id="looks_like" ><%= Spree.t(:card_type_is) %> <span id="type"></span></span>
29
- <span id="unrecognized"><%= Spree.t(:unrecognized_card_type) %></span>
30
- )
31
- </span>
32
- </p>
33
-
34
- <p class="field" data-hook="card_expiration">
35
- <%= label_tag "braintree_card_expiry", Spree.t(:expiration) %><span class="required">*</span><br />
36
- <label for="braintree_card_expiry" id="braintree_card_expiry" class="braintree-hosted-field"></label>
37
- </p>
38
-
39
- <p class="field" data-hook="card_code">
40
- <%= label_tag "braintree_card_code", Spree.t(:card_code) %><span class="required">*</span><br />
41
-
42
- <label for="braintree_card_code" id="braintree_card_code" class="braintree-hosted-field card-code"></label>
43
- <%= link_to "(#{Spree.t(:what_is_this)})", spree.cvv_path, :target => '_blank', "data-hook" => "cvv_link", :id => "cvv_link" %>
44
- </p>
45
- </div>
46
-
47
- <% if @order.bill_address %>
48
- <%= fields_for "#{param_prefix}[address_attributes]", @order.bill_address do |f| %>
49
- <%= render :partial => 'spree/address/form_hidden', :locals => { :form => f } %>
50
- <% end %>
51
- <% end %>
52
-
53
- <%= hidden_field_tag "#{param_prefix}[cc_type]", '', :id => "cc_type", :class => 'ccType' %>
54
- <%= hidden_field_tag "order[payments_attributes][][payment_method_nonce]", '', :id => "payment_method_nonce" %>
55
- </div>
@@ -1,12 +0,0 @@
1
- <% content_for :head do %>
2
- <%= javascript_tag do %>
3
- braintree.environment = "<%= payment_method.preferred_environment %>"
4
- braintree.placeholders = {
5
- "number": "<%= payment_method.card_number_placeholder %>",
6
- "expirationDate": "<%= payment_method.expiration_date_placeholder %>",
7
- "cvv": "<%= payment_method.card_code_placeholder %>"
8
- }
9
- <% end %>
10
- <% end %>
11
-
12
- <%= hidden_field_tag "order[braintree_device_data]", '', :id => "device_data" %>
@@ -1 +0,0 @@
1
- ActionView::Base.send :include, BraintreeViewHelpers
@@ -1,5 +0,0 @@
1
- class AddDataToCreditCard < SolidusSupport::Migration[4.2]
2
- def change
3
- add_column :spree_credit_cards, :data, :text
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class AddBraintreeDeviceDataToOrder < SolidusSupport::Migration[4.2]
2
- def change
3
- add_column :spree_orders, :braintree_device_data, :text
4
- end
5
- end