spree_vpago 0.1.0.pre.beta

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.
Files changed (262) hide show
  1. checksums.yaml +7 -0
  2. data/.env.example +3 -0
  3. data/.github/workflows/test_and_publish_gem.yml +96 -0
  4. data/.gitignore +24 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +56 -0
  7. data/.ruby-version +1 -0
  8. data/.tool-versions +1 -0
  9. data/.travis.yml +45 -0
  10. data/Appraisals +20 -0
  11. data/Gemfile +27 -0
  12. data/Gemfile.lock +656 -0
  13. data/LICENSE +26 -0
  14. data/README.md +151 -0
  15. data/Rakefile +21 -0
  16. data/app/.gitkeep +0 -0
  17. data/app/assets/config/spree_vpago_manifest.js +3 -0
  18. data/app/assets/images/backend-process.svg +3 -0
  19. data/app/assets/images/vpago/payway/abapay.png +0 -0
  20. data/app/assets/images/vpago/payway/cards.png +0 -0
  21. data/app/assets/javascripts/vpago/vpago_payments/request_process_payment.js +44 -0
  22. data/app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js +15802 -0
  23. data/app/controllers/.gitkeep +0 -0
  24. data/app/controllers/spree/acleda_redirects_controller.rb +22 -0
  25. data/app/controllers/spree/admin/payment_methods_controller_decorator.rb +65 -0
  26. data/app/controllers/spree/admin/payment_payway_base_controller.rb +25 -0
  27. data/app/controllers/spree/admin/payment_payway_checkers_controller.rb +34 -0
  28. data/app/controllers/spree/admin/payment_payway_markers_controller.rb +44 -0
  29. data/app/controllers/spree/admin/payment_payway_queriers_controller.rb +39 -0
  30. data/app/controllers/spree/admin/payment_wing_sdk_base_controller.rb +21 -0
  31. data/app/controllers/spree/admin/payment_wing_sdk_checkers_controller.rb +26 -0
  32. data/app/controllers/spree/admin/payment_wing_sdk_markers_controller.rb +36 -0
  33. data/app/controllers/spree/admin/payment_wing_sdk_queriers_controller.rb +20 -0
  34. data/app/controllers/spree/admin/payments_controller_decorator.rb +19 -0
  35. data/app/controllers/spree/admin/payout_profile_products_controller.rb +21 -0
  36. data/app/controllers/spree/admin/payout_profile_shipping_methods_controller.rb +21 -0
  37. data/app/controllers/spree/admin/payout_profiles_controller.rb +91 -0
  38. data/app/controllers/spree/admin/payouts_controller.rb +16 -0
  39. data/app/controllers/spree/api/v2/storefront/checkout_controller_decorator.rb +84 -0
  40. data/app/controllers/spree/payway_card_popups_controller.rb +20 -0
  41. data/app/controllers/spree/payway_results_controller.rb +11 -0
  42. data/app/controllers/spree/payway_v2_card_popups_controller.rb +20 -0
  43. data/app/controllers/spree/vpago_payments_controller.rb +71 -0
  44. data/app/controllers/spree/webhook/acleda_mobiles_controller.rb +88 -0
  45. data/app/controllers/spree/webhook/acledas_controller.rb +80 -0
  46. data/app/controllers/spree/webhook/base_controller.rb +6 -0
  47. data/app/controllers/spree/webhook/payways_controller.rb +77 -0
  48. data/app/controllers/spree/webhook/wings_controller.rb +63 -0
  49. data/app/controllers/spree/wing/base_controller.rb +29 -0
  50. data/app/controllers/spree/wing/transactions_controller.rb +27 -0
  51. data/app/controllers/spree/wing_redirects_controller.rb +20 -0
  52. data/app/helpers/vpago/admin/base_helper_decorator.rb +40 -0
  53. data/app/helpers/vpago/vpago_payments_helper.rb +12 -0
  54. data/app/javascripts/vpago/vpago_payments/user_informers/firebase.js +62 -0
  55. data/app/jobs/application_unique_job.rb +1 -0
  56. data/app/jobs/vpago/payment_processor_job.rb +8 -0
  57. data/app/models/.gitkeep +0 -0
  58. data/app/models/concerns/vpago/payoutable.rb +11 -0
  59. data/app/models/spree/gateway/acleda.rb +63 -0
  60. data/app/models/spree/gateway/acleda_mobile.rb +46 -0
  61. data/app/models/spree/gateway/payway.rb +66 -0
  62. data/app/models/spree/gateway/payway_v2.rb +174 -0
  63. data/app/models/spree/gateway/wing_sdk.rb +51 -0
  64. data/app/models/spree/payout.rb +23 -0
  65. data/app/models/spree/payout_profile.rb +107 -0
  66. data/app/models/spree/payout_profile_product.rb +14 -0
  67. data/app/models/spree/payout_profile_shipping_method.rb +14 -0
  68. data/app/models/spree/payout_profiles/payway_v2.rb +40 -0
  69. data/app/models/spree/vpago_payment_source.rb +21 -0
  70. data/app/models/vpago/adjustment_decorator.rb +28 -0
  71. data/app/models/vpago/line_item_decorator.rb +75 -0
  72. data/app/models/vpago/order_decorator.rb +78 -0
  73. data/app/models/vpago/payment_decorator.rb +44 -0
  74. data/app/models/vpago/payment_method_decorator.rb +91 -0
  75. data/app/models/vpago/payouts_generator.rb +125 -0
  76. data/app/models/vpago/product_decorator.rb +30 -0
  77. data/app/models/vpago/promotion_action_decorator.rb +9 -0
  78. data/app/models/vpago/shipment_decorator.rb +23 -0
  79. data/app/models/vpago/shipping_method_decorator.rb +33 -0
  80. data/app/models/vpago/shipping_rate_decorator.rb +25 -0
  81. data/app/models/vpago/store_decorator.rb +17 -0
  82. data/app/models/vpago/tax_category_decorator.rb +9 -0
  83. data/app/models/vpago/variant_decorator.rb +22 -0
  84. data/app/models/vpago/vendor_decorator.rb +10 -0
  85. data/app/overrides/spree/admin/adjustments/_adjustment/handle_by_table_body.html.erb.deface +11 -0
  86. data/app/overrides/spree/admin/adjustments/_adjustments_table/handle_by_table_header.html.erb.deface +3 -0
  87. data/app/overrides/spree/admin/adjustments/_form/handle_by_field.html.erb.deface +10 -0
  88. data/app/overrides/spree/admin/orders/_shipment/edit_method.html.erb.deface +26 -0
  89. data/app/overrides/spree/admin/orders/_shipment/show_method.html.erb.deface +27 -0
  90. data/app/overrides/spree/admin/payment_methods/_form/enable_pre_auth_field.html.erb.deface +17 -0
  91. data/app/overrides/spree/admin/payment_methods/_form/vendor_field.html.erb.deface +6 -0
  92. data/app/overrides/spree/admin/payment_methods/index/list.html.erb.deface +45 -0
  93. data/app/overrides/spree/admin/payment_methods/index/payment_methods_tabs.html.erb.deface +9 -0
  94. data/app/overrides/spree/admin/payment_methods/index/vendor_body.html.erb.deface +5 -0
  95. data/app/overrides/spree/admin/payment_methods/index/vendor_header.html.erb.deface +5 -0
  96. data/app/overrides/spree/admin/payments/_list/actions.html.erb.deface +13 -0
  97. data/app/overrides/spree/admin/promotions/_promotion_action/run_by_field.html.erb.deface +13 -0
  98. data/app/overrides/spree/admin/shared/_order_tabs/payouts.html.erb.deface +8 -0
  99. data/app/overrides/spree/admin/shared/_product_tabs/payout_profile_products.html.erb.deface +8 -0
  100. data/app/overrides/spree/admin/shared/sub_menu/_integrations/payout_profiles.html.erb.deface +3 -0
  101. data/app/overrides/spree/admin/shipping_methods/_form/handle_by.html.erb.deface +12 -0
  102. data/app/overrides/spree/admin/shipping_methods/edit/shipping_method_tabs.html.erb.deface +3 -0
  103. data/app/overrides/spree/admin/tax_categories/_form/collect_by_field.html.erb.deface +10 -0
  104. data/app/overrides/spree/admin/tax_categories/index/collect_by_table_body.html.erb.deface +4 -0
  105. data/app/overrides/spree/admin/tax_categories/index/collect_by_table_header.html.erb.deface +4 -0
  106. data/app/serializers/spree/api/v2/platform/vpago_payment_source_serializer.rb +11 -0
  107. data/app/serializers/spree/v2/storefront/payment_method_serializer_decorator.rb +23 -0
  108. data/app/serializers/spree/v2/storefront/payment_redirect_serializer.rb +13 -0
  109. data/app/serializers/spree/v2/storefront/payment_serializer_decorator.rb +13 -0
  110. data/app/serializers/spree/v2/storefront/vpago_payment_source_serializer.rb +9 -0
  111. data/app/services/.gitkeep +0 -0
  112. data/app/services/vpago/payment_finder.rb +27 -0
  113. data/app/services/vpago/payment_processor.rb +72 -0
  114. data/app/services/vpago/payment_redirect_handler.rb +194 -0
  115. data/app/services/vpago/payment_url_constructor.rb +32 -0
  116. data/app/services/vpago/payments/find_or_create.rb +51 -0
  117. data/app/services/vpago/payout_profiles/payway/base_payout_profile_request.rb +38 -0
  118. data/app/services/vpago/payout_profiles/payway/open_ssl_encrypter.rb +31 -0
  119. data/app/services/vpago/payout_profiles/payway/payout_profile_request_creator.rb +50 -0
  120. data/app/services/vpago/payout_profiles/payway/payout_profile_request_params_builder.rb +58 -0
  121. data/app/services/vpago/payout_profiles/payway/payout_profile_request_updater.rb +28 -0
  122. data/app/services/vpago/payway_return_options_builder.rb +39 -0
  123. data/app/services/vpago/user_informers/firebase.rb +52 -0
  124. data/app/views/.gitkeep +0 -0
  125. data/app/views/layouts/acleda.html.erb +18 -0
  126. data/app/views/layouts/payway.html.erb +24 -0
  127. data/app/views/layouts/payway_v2.html.erb +18 -0
  128. data/app/views/layouts/vpago_payments.html.erb +18 -0
  129. data/app/views/layouts/wing.html.erb +18 -0
  130. data/app/views/spree/_payment_icon.html.erb +25 -0
  131. data/app/views/spree/acleda_redirects/show.html.erb +3 -0
  132. data/app/views/spree/admin/payments/source_forms/_payment_payway.html.erb +4 -0
  133. data/app/views/spree/admin/payments/source_forms/_payway_v2.html.erb +7 -0
  134. data/app/views/spree/admin/payments/source_views/_acleda.html.erb +1 -0
  135. data/app/views/spree/admin/payments/source_views/_acleda_mobile.html.erb +1 -0
  136. data/app/views/spree/admin/payments/source_views/_payment_payway.html.erb +98 -0
  137. data/app/views/spree/admin/payments/source_views/_payway_v2.html.erb +5 -0
  138. data/app/views/spree/admin/payments/source_views/_vpago_payment_tmpl.html.erb +113 -0
  139. data/app/views/spree/admin/payments/source_views/_wingsdk.html.erb +5 -0
  140. data/app/views/spree/admin/payout_profile_products/_form.html.erb +28 -0
  141. data/app/views/spree/admin/payout_profile_products/edit.html.erb +18 -0
  142. data/app/views/spree/admin/payout_profile_products/index.html.erb +58 -0
  143. data/app/views/spree/admin/payout_profile_products/new.html.erb +22 -0
  144. data/app/views/spree/admin/payout_profile_shipping_methods/_form.html.erb +28 -0
  145. data/app/views/spree/admin/payout_profile_shipping_methods/edit.html.erb +22 -0
  146. data/app/views/spree/admin/payout_profile_shipping_methods/index.html.erb +6 -0
  147. data/app/views/spree/admin/payout_profile_shipping_methods/new.html.erb +27 -0
  148. data/app/views/spree/admin/payout_profiles/_filter.html.erb +19 -0
  149. data/app/views/spree/admin/payout_profiles/_form.html.erb +72 -0
  150. data/app/views/spree/admin/payout_profiles/edit.html.erb +33 -0
  151. data/app/views/spree/admin/payout_profiles/index.html.erb +63 -0
  152. data/app/views/spree/admin/payout_profiles/new.html.erb +13 -0
  153. data/app/views/spree/admin/payouts/_line_item_info_with_popover.html.erb +43 -0
  154. data/app/views/spree/admin/payouts/index.html.erb +46 -0
  155. data/app/views/spree/admin/shared/_payment_methods_tabs.html.erb +15 -0
  156. data/app/views/spree/admin/shared/_shipping_method_tabs.html.erb +19 -0
  157. data/app/views/spree/admin/shared/payout_profile/_info_card.html.erb +24 -0
  158. data/app/views/spree/admin/shared/payout_profile/_status.html.erb +11 -0
  159. data/app/views/spree/checkout/payment/_acleda.html.erb +1 -0
  160. data/app/views/spree/checkout/payment/_acleda_checkout_form.html.erb +14 -0
  161. data/app/views/spree/checkout/payment/_acleda_mobile.html.erb +0 -0
  162. data/app/views/spree/checkout/payment/_payment_payway.html.erb +21 -0
  163. data/app/views/spree/checkout/payment/_payway_loader.html.erb +2 -0
  164. data/app/views/spree/checkout/payment/_payway_root.html.erb +9 -0
  165. data/app/views/spree/checkout/payment/_payway_script.html.erb +77 -0
  166. data/app/views/spree/checkout/payment/_payway_v2.html.erb +1 -0
  167. data/app/views/spree/checkout/payment/_payway_v2_loader.html.erb +2 -0
  168. data/app/views/spree/checkout/payment/_payway_v2_root.html.erb +9 -0
  169. data/app/views/spree/checkout/payment/_payway_v2_script.html.erb +79 -0
  170. data/app/views/spree/checkout/payment/_wing_checkout_form.html.erb +18 -0
  171. data/app/views/spree/checkout/payment/_wingsdk.html.erb +1 -0
  172. data/app/views/spree/checkout/payment/acleda_form.html.erb +3 -0
  173. data/app/views/spree/checkout/payment/payway_form.html.erb +10 -0
  174. data/app/views/spree/checkout/payment/payway_v2_form.html.erb +10 -0
  175. data/app/views/spree/checkout/payment/wingsdk_form.html.erb +3 -0
  176. data/app/views/spree/payway_card_popups/_form.html.erb +10 -0
  177. data/app/views/spree/payway_card_popups/show.html.erb +5 -0
  178. data/app/views/spree/payway_results/failed.html.erb +1 -0
  179. data/app/views/spree/payway_results/success.html.erb +1 -0
  180. data/app/views/spree/payway_v2_card_popups/_form.html.erb +15 -0
  181. data/app/views/spree/payway_v2_card_popups/show.html.erb +3 -0
  182. data/app/views/spree/vpago_payments/checkout.html.erb +3 -0
  183. data/app/views/spree/vpago_payments/forms/spree/gateway/_payway_v2.html.erb +13 -0
  184. data/app/views/spree/vpago_payments/processing.html.erb +49 -0
  185. data/app/views/spree/vpago_payments/success.html.erb +3 -0
  186. data/app/views/spree/wing_redirects/show.html.erb +3 -0
  187. data/bin/rails +8 -0
  188. data/build.js +9 -0
  189. data/config/initializers/assets.rb +1 -0
  190. data/config/initializers/spree_permitted_attributes.rb +5 -0
  191. data/config/locales/en.yml +28 -0
  192. data/config/locales/km.yml +24 -0
  193. data/config/routes.rb +92 -0
  194. data/db/migrate/20210128040625_create_spree_vpago_payment_sources.rb +14 -0
  195. data/db/migrate/20210430052432_add_fields_to_payment_sources.rb +7 -0
  196. data/db/migrate/20210824044737_add_preference_to_spree_vpago_payment_source.rb +5 -0
  197. data/db/migrate/20240506095140_create_spree_payout_profiles.rb +22 -0
  198. data/db/migrate/20240506095148_create_spree_payout_profile_products.rb +10 -0
  199. data/db/migrate/20240523070757_add_optional_spere_payout_profile_products.rb +5 -0
  200. data/db/migrate/20240715091228_create_spree_payouts.rb +25 -0
  201. data/db/migrate/20240718195510_create_spree_payout_profile_shipping_methods.rb +15 -0
  202. data/db/migrate/20240718201453_add_handle_by_to_spree_adjustments.rb +5 -0
  203. data/db/migrate/20240718201509_add_run_by_to_spree_promotion_actions.rb +5 -0
  204. data/db/migrate/20240718201523_add_collect_by_to_spree_tax_categories.rb +5 -0
  205. data/db/migrate/20240718201538_add_handle_by_to_spree_shipping_method.rb +5 -0
  206. data/db/migrate/20240718201554_add_handle_by_to_spree_shipping_rates.rb +5 -0
  207. data/db/migrate/20240808102853_add_vendor_reference_to_spree_payment_methods.rb +7 -0
  208. data/db/migrate/20240904030132_add_gateway_status_to_spree_payments.rb +5 -0
  209. data/db/migrate/20241029071959_add_pre_auth_response_to_spree_payment.rb +5 -0
  210. data/db/migrate/20241202104014_add_enable_pre_auth_to_spree_payment_method.rb +5 -0
  211. data/db/migrate/20250121044614_add_transaction_response_to_spree_payments.rb +5 -0
  212. data/docs/acleda.md +65 -0
  213. data/gemfiles/spree_3_7.gemfile +9 -0
  214. data/gemfiles/spree_4_0.gemfile +8 -0
  215. data/gemfiles/spree_4_1.gemfile +9 -0
  216. data/gemfiles/spree_master.gemfile +8 -0
  217. data/lib/generators/spree_vpago/install/install_generator.rb +26 -0
  218. data/lib/generators/spree_vpago/install/templates/app/assets/images/vpago/payway/acleda_merchant_logo_300x300.png +0 -0
  219. data/lib/spree_vpago/engine.rb +36 -0
  220. data/lib/spree_vpago/factories.rb +6 -0
  221. data/lib/spree_vpago/version.rb +9 -0
  222. data/lib/spree_vpago.rb +5 -0
  223. data/lib/vpago/acleda/base.rb +111 -0
  224. data/lib/vpago/acleda/checkout.rb +105 -0
  225. data/lib/vpago/acleda/deeplink_checkout.rb +74 -0
  226. data/lib/vpago/acleda/payment_request_updater.rb +38 -0
  227. data/lib/vpago/acleda/transaction_status.rb +71 -0
  228. data/lib/vpago/acleda_mobile/base.rb +28 -0
  229. data/lib/vpago/acleda_mobile/callback_validator.php +35 -0
  230. data/lib/vpago/acleda_mobile/callback_validator.rb +38 -0
  231. data/lib/vpago/acleda_mobile/checkout.rb +78 -0
  232. data/lib/vpago/acleda_mobile/payment_request_updater.rb +34 -0
  233. data/lib/vpago/acleda_mobile/payment_retriever.rb +24 -0
  234. data/lib/vpago/acleda_mobile/transaction_status.rb +35 -0
  235. data/lib/vpago/payment_amount_calculator.rb +23 -0
  236. data/lib/vpago/payment_request_updater.rb +19 -0
  237. data/lib/vpago/payment_status_marker.rb +109 -0
  238. data/lib/vpago/payway/base.rb +112 -0
  239. data/lib/vpago/payway/checkout.rb +24 -0
  240. data/lib/vpago/payway/payment_request_updater.rb +31 -0
  241. data/lib/vpago/payway/payment_status_marker.rb +84 -0
  242. data/lib/vpago/payway/transaction_status.rb +74 -0
  243. data/lib/vpago/payway.rb +13 -0
  244. data/lib/vpago/payway_v2/base.rb +153 -0
  245. data/lib/vpago/payway_v2/checkout.rb +35 -0
  246. data/lib/vpago/payway_v2/payment_request_updater.rb +65 -0
  247. data/lib/vpago/payway_v2/payouts_params_constructor.rb +47 -0
  248. data/lib/vpago/payway_v2/pre_auth_canceler.rb +43 -0
  249. data/lib/vpago/payway_v2/pre_auth_completer.rb +76 -0
  250. data/lib/vpago/payway_v2/transaction_status.rb +85 -0
  251. data/lib/vpago/wing_sdk/base.rb +58 -0
  252. data/lib/vpago/wing_sdk/checkout.rb +20 -0
  253. data/lib/vpago/wing_sdk/payment_request_updater.rb +46 -0
  254. data/lib/vpago/wing_sdk/payment_retriever.rb +34 -0
  255. data/lib/vpago/wing_sdk/transaction_status_checker.rb +64 -0
  256. data/lib/vpago/wing_sdk/transaction_status_response.rb +33 -0
  257. data/node_modules/.yarn-integrity +147 -0
  258. data/package-lock.json +1491 -0
  259. data/package.json +10 -0
  260. data/spree_vpago.gemspec +33 -0
  261. data/yarn.lock +921 -0
  262. metadata +403 -0
@@ -0,0 +1,31 @@
1
+ require 'openssl'
2
+
3
+ module Vpago
4
+ module PayoutProfiles
5
+ module Payway
6
+ class OpenSslEncrypter
7
+ attr_reader :content, :rsa_public_key
8
+
9
+ def initialize(content:, rsa_public_key:)
10
+ @content = content
11
+ @rsa_public_key = OpenSSL::PKey::RSA.new(rsa_public_key)
12
+ end
13
+
14
+ def call
15
+ # Assumes 1024 bit key and encrypts in chunks.
16
+ maxlength = 117
17
+ output = ''
18
+
19
+ source = content.dup
20
+ while source != ''
21
+ input = source.slice!(0, maxlength)
22
+ encrypted = rsa_public_key.public_encrypt(input)
23
+ output += encrypted
24
+ end
25
+
26
+ Base64.strict_encode64(output)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ module Vpago
2
+ module PayoutProfiles
3
+ module Payway
4
+ class PayoutProfileRequestCreator < BasePayoutProfileRequest
5
+ # override
6
+ def request_path
7
+ 'api/merchant-portal/merchant-access/whitelist-account/add-whitelist-payout'
8
+ end
9
+
10
+ # code:
11
+ # "00": Success!
12
+ # "PTL148": Payee already exists.
13
+ def call
14
+ json_response = request_to_payway
15
+ return false if @error_messages.any?
16
+
17
+ code = json_response['status']['code']
18
+
19
+ if code == '00'
20
+ profile.verify!(json_response['data'])
21
+ elsif code == 'PTL148'
22
+ handle_existing_account(json_response)
23
+ elsif code.present?
24
+ profile.reset_verification!
25
+ @error_messages << json_response['status']
26
+ end
27
+
28
+ error_messages.empty?
29
+ end
30
+
31
+ # if bank return that account already created,
32
+ # but account is not yet exist in our database,
33
+ # we can call updater to verify the profile as well as get account infos from bank.
34
+ def handle_existing_account(json_response)
35
+ other_existing_profile = Spree::PayoutProfile.where.not(id: profile.id).find_by(
36
+ type: profile.type,
37
+ bank_account_number: profile.bank_account_number
38
+ )
39
+
40
+ if other_existing_profile.nil?
41
+ PayoutProfileRequestUpdater.new(profile).call
42
+ else
43
+ profile.reset_verification!
44
+ @error_messages << json_response['status']
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,58 @@
1
+ module Vpago
2
+ module PayoutProfiles
3
+ module Payway
4
+ class PayoutProfileRequestParamsBuilder
5
+ attr_reader :request_time, :profile
6
+
7
+ def initialize(request_time, profile)
8
+ @request_time = request_time
9
+ @profile = profile
10
+ end
11
+
12
+ def api_key = profile.preferred_api_key
13
+ def rsa_public_key = profile.preferred_rsa_public_key
14
+ def merchant_id = profile.preferred_merchant_id
15
+ def payee = profile.preferred_payee
16
+ def status = profile.active ? '1' : '0'
17
+
18
+ def formatted_request_time
19
+ request_time.strftime('%Y%m%d%H%M%S')
20
+ end
21
+
22
+ def merchant_auth_data
23
+ {
24
+ 'mc_id' => merchant_id,
25
+ 'payee' => payee,
26
+ 'status' => status
27
+ }.to_json
28
+ end
29
+
30
+ def merchant_auth
31
+ @merchant_auth ||= OpenSslEncrypter.new(
32
+ content: merchant_auth_data,
33
+ rsa_public_key: rsa_public_key
34
+ ).call
35
+ end
36
+
37
+ def hash_data
38
+ "#{formatted_request_time}#{merchant_auth}"
39
+ end
40
+
41
+ def encoded_hash
42
+ digest_name = OpenSSL::Digest.new('sha512')
43
+ hash = OpenSSL::HMAC.digest(digest_name, api_key, hash_data)
44
+ Base64.strict_encode64(hash)
45
+ end
46
+
47
+ def request_params
48
+ {
49
+ request_time: formatted_request_time,
50
+ merchant_id: merchant_id,
51
+ merchant_auth: merchant_auth,
52
+ hash: encoded_hash
53
+ }
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,28 @@
1
+ module Vpago
2
+ module PayoutProfiles
3
+ module Payway
4
+ class PayoutProfileRequestUpdater < BasePayoutProfileRequest
5
+ # override
6
+ def request_path
7
+ 'api/merchant-portal/merchant-access/whitelist-account/update-whitelist-status'
8
+ end
9
+
10
+ def call
11
+ json_response = request_to_payway
12
+ return false if error_messages.any?
13
+
14
+ code = json_response['status']['code']
15
+
16
+ if code == '00'
17
+ profile.verify!(json_response['data'])
18
+ else
19
+ profile.reset_verification!
20
+ @error_messages << json_response['status']
21
+ end
22
+
23
+ error_messages.empty?
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # Deprecated: No longer used anymore, should ask bank to put [json] by default. So we have unified return url for payment methods.
2
+ module Vpago
3
+ class PaywayReturnOptionsBuilder
4
+ attr_reader :params
5
+
6
+ def initialize(params:)
7
+ @params = params
8
+ end
9
+
10
+ def options
11
+ if merchant_profile_content_type == 'html'
12
+ html_params
13
+ elsif merchant_profile_content_type == 'json'
14
+ json_params
15
+ end
16
+ end
17
+
18
+ def payment
19
+ @payment ||= Spree::Payment.find_by(number: tran_id)
20
+ end
21
+
22
+ def tran_id
23
+ @tran_id ||= options[:tran_id]
24
+ end
25
+
26
+ def json_params
27
+ { tran_id: params[:tran_id] }
28
+ end
29
+
30
+ def html_params
31
+ payload = JSON.parse(params[:response])
32
+ { tran_id: payload['tran_id'] }
33
+ end
34
+
35
+ def merchant_profile_content_type
36
+ ENV['PAYWAY_MERCHANT_PROFILE_CONTENT_TYPE'].presence || 'html'
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,52 @@
1
+ require 'google/cloud/firestore'
2
+
3
+ module Vpago
4
+ module UserInformers
5
+ class Firebase
6
+ attr_accessor :order
7
+
8
+ def initialize(order)
9
+ @order = order
10
+ end
11
+
12
+ def payment_is_processing(processing:, log_message: nil) = notify(:payment_is_processing, processing, log_message)
13
+ def order_is_processing(processing:, log_message: nil) = notify(:order_is_processing, processing, log_message)
14
+ def order_is_completed(processing:, log_message: nil) = notify(:order_is_completed, processing, log_message)
15
+ def order_process_failed(processing:, log_message: nil) = notify(:order_process_failed, processing, log_message)
16
+ def payment_is_refunded(processing:, log_message: nil) = notify(:payment_is_refunded, processing, log_message)
17
+ def payment_process_failed(processing:, log_message: nil) = notify(:payment_process_failed, processing, log_message)
18
+
19
+ def notify(message, processing, log_message = nil)
20
+ order.reload
21
+
22
+ data = {
23
+ processing: processing,
24
+ message_code: message,
25
+ log_message: log_message,
26
+ order_state: order.state,
27
+ payment_state: order.payment_state,
28
+ updated_at: Time.current
29
+ }.compact
30
+
31
+ firestore_reference.set(data, merge: true)
32
+ firestore_reference.col('histories').doc(message).set(data)
33
+ end
34
+
35
+ def firestore_reference
36
+ current_date = Time.current.strftime('%Y-%m-%d')
37
+ firestore.col('statuses')
38
+ .doc('cart')
39
+ .col(current_date)
40
+ .doc(order.number)
41
+ end
42
+
43
+ def firestore
44
+ @firestore ||= Google::Cloud::Firestore.new(project_id: service_account[:project_id], credentials: service_account)
45
+ end
46
+
47
+ def service_account
48
+ @service_account ||= Rails.application.credentials.cloud_firestore_service_account
49
+ end
50
+ end
51
+ end
52
+ end
File without changes
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Acleda</title>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
8
+
9
+ <%= yield :head %>
10
+ </head>
11
+
12
+ <body>
13
+ <div class='container'>
14
+ <%= yield %>
15
+ </div>
16
+ </body>
17
+
18
+ </html>
@@ -0,0 +1,24 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>PaywayGateway</title>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
8
+
9
+ <%= yield :head %>
10
+ </head>
11
+
12
+ <body>
13
+ <div class='container'>
14
+ <%= yield %>
15
+ </div>
16
+
17
+ <script type="text/javascript">
18
+ $(function(){
19
+ AbaPayway.checkout();
20
+ })
21
+ </script>
22
+ </body>
23
+
24
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>PaywayGateway</title>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
8
+
9
+ <%= yield :head %>
10
+ </head>
11
+
12
+ <body>
13
+ <div class='container'>
14
+ <%= yield %>
15
+ </div>
16
+ </body>
17
+
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Payment</title>
7
+
8
+ <%= csrf_meta_tags %>
9
+ <%= csp_meta_tag %>
10
+
11
+ <%= javascript_include_tag "vpago/vpago_payments/request_process_payment", 'data-turbo-track': 'reload' %>
12
+ <%= javascript_include_tag "vpago/vpago_payments/user_informers/#{user_informer}", 'data-turbo-track': 'reload' %>
13
+ </head>
14
+
15
+ <body>
16
+ <%= yield %>
17
+ </body>
18
+ </html>
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <title>Wing</title>
5
+ <meta charset="utf-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
8
+
9
+ <%= yield :head %>
10
+ </head>
11
+
12
+ <body>
13
+ <div class='container'>
14
+ <%= yield %>
15
+ </div>
16
+ </body>
17
+
18
+ </html>
@@ -0,0 +1,25 @@
1
+ <%
2
+ is_payway = method.class == Spree::Gateway::Payway || method.class == Spree::Gateway::PaywayV2
3
+
4
+ if is_payway
5
+ is_card_payment = method.preferences[:payment_option] == 'cards'
6
+
7
+ pm_icon = is_card_payment ? 'card' : 'payway_abapay'
8
+ pm_name = is_card_payment ? t('payment.payway') : t('payment.abapay')
9
+ pm_description = is_card_payment ? t('payment.payway_description') : t('payment.abapay_description')
10
+ else
11
+ pm_icon = method.preferences[:icon_name].presence || 'card'
12
+ pm_name = Spree.t(method.name, scope: :payment_methods, default: method.name)
13
+ pm_description= method.description
14
+ end
15
+ %>
16
+
17
+ <div class="d-flex align-items-center">
18
+ <%= image_tag "payment_method_icons/#{pm_icon}.png", alt: method.name, class: 'payment-icon' %>
19
+ <div class="ml-3">
20
+ <p class="payment-label"><%= pm_name %></p>
21
+ <% if pm_description.present? %>
22
+ <p class="payment-description"><%= pm_description %></p>
23
+ <% end %>
24
+ </div>
25
+ </div>
@@ -0,0 +1,3 @@
1
+ <% if @client_redirect.present? %>
2
+ <%= render 'spree/checkout/payment/acleda_checkout_form', gateway_params: @client_redirect.gateway_params, action_url: @client_redirect.action_url %>
3
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%
2
+ # create payment on the backend
3
+ # we don't allow payment to be created by the backend
4
+ %>
@@ -0,0 +1,7 @@
1
+ <%
2
+ # create payment on the backend
3
+ # we don't allow payment to be created by the backend
4
+
5
+ %>
6
+
7
+
@@ -0,0 +1 @@
1
+ <%= render 'spree/admin/payments/source_views/vpago_payment_tmpl', payment: payment%>
@@ -0,0 +1 @@
1
+ <%= render 'spree/admin/payments/source_views/vpago_payment_tmpl', payment: payment%>
@@ -0,0 +1,98 @@
1
+ <% if payment.source.present? %>
2
+ <fieldset data-hook="mollie_payment_source">
3
+
4
+ <legend>
5
+ <%= payment.source.payment_method.name %>
6
+ </legend>
7
+
8
+ <table class="table table-condensed table-bordered">
9
+
10
+ <tr>
11
+ <th width="210"><%= Spree.t('order_state', scope: :order_states) %></th>
12
+ <td><%= Spree.t(payment.order.state) %></td>
13
+ </tr>
14
+
15
+ <tr>
16
+ <th><%= Spree.t('payment_state') %></th>
17
+ <td>
18
+ <%= Spree.t(payment.state, scope: :payment_states, default: payment.state.capitalize) %>
19
+ </td>
20
+ </tr>
21
+
22
+ <tr>
23
+ <th><%= Spree.t('vpago.payments.query_status') %></th>
24
+ <td><%= link_to Spree.t('vpago.payments.query_status'), admin_payment_payway_querier_path(payment) %></td>
25
+ </tr>
26
+ <tr>
27
+ <th><%= Spree.t('vpago.payments.check_and_heal') %></th>
28
+ <td><%= link_to Spree.t('vpago.payments.check_and_heal'), admin_payment_payway_checker_path(payment), method: :put %></td>
29
+ </tr>
30
+
31
+ <tr>
32
+ <th><%= Spree.t('vpago.payments.updated_by_user') %></th>
33
+ <td><%= payment.source.updated_by_user&.full_name %></td>
34
+ </tr>
35
+ <tr>
36
+ <th><%= Spree.t('vpago.payments.updated_by_user_at') %></th>
37
+ <td><%= payment.source.updated_by_user_at %></td>
38
+ </tr>
39
+ <tr>
40
+ <th><%= Spree.t('vpago.payments.updated_reason') %></th>
41
+ <td><%= payment.source.updated_reason %></td>
42
+ </tr>
43
+
44
+
45
+ <tr>
46
+ <th><%= Spree.t('user') %></th>
47
+ <td><%= "#{payment.source.user&.id} - #{payment.source.user&.full_name}" %></td>
48
+ </tr>
49
+
50
+ <tr>
51
+ <th><%= Spree.t('transaction_id') %></th>
52
+ <td><%= payment.source.transaction_id %></td>
53
+ </tr>
54
+
55
+ <tr>
56
+ <th><%= Spree.t('payment_status') %></th>
57
+ <td><%= payment.source.payment_status %></td>
58
+ </tr>
59
+
60
+ <tr>
61
+ <th><%= Spree.t('payment_description') %></th>
62
+ <td><%= payment.source.payment_description %></td>
63
+ </tr>
64
+
65
+ <tr>
66
+ <th><%= Spree.t('created_at') %></th>
67
+ <td><%= payment.source.created_at %></td>
68
+ </tr>
69
+
70
+ <tr>
71
+ <th><%= Spree.t('updated_at') %></th>
72
+ <td><%= payment.source.updated_at %></td>
73
+ </tr>
74
+
75
+ <% if !payment.order.completed? %>
76
+ <tr>
77
+ <th><%= Spree.t('vpago.payments.manually_mark') %></th>
78
+ <td>
79
+ <%= form_with url: admin_payment_payway_marker_path(payment.number), method: :put do |f| %>
80
+ <div style='margin-top:10px;' >
81
+ <%= f.text_area :updated_reason, class: 'form-control' %>
82
+ </div>
83
+
84
+ <div style='margin-top:10px;' >
85
+ <%= f.button 'Save', class: 'btn btn-primary', data: { confirm: Spree.t('vpago.payments.confirm_manual_update')} %>
86
+ </div>
87
+ <% end %>
88
+ </td>
89
+ </tr>
90
+ <% end %>
91
+ </table>
92
+
93
+ </fieldset>
94
+ <% else %>
95
+ <div class="alert alert-danger">
96
+ <%= Spree.t(:empty) %>
97
+ </div>
98
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= render 'spree/admin/payments/source_views/vpago_payment_tmpl',
2
+ payment: payment,
3
+ check_status_url: admin_payment_payway_querier_path(payment),
4
+ heal_payment_url: admin_payment_payway_checker_path(payment),
5
+ manual_update_payment_url: admin_payment_payway_marker_path(payment.number) %>
@@ -0,0 +1,113 @@
1
+ <% if payment.source.present? %>
2
+ <fieldset data-hook="mollie_payment_source">
3
+
4
+ <legend>
5
+ <%= payment.source.payment_method.name %>
6
+ </legend>
7
+
8
+ <table class="table table-condensed table-bordered">
9
+
10
+ <tr>
11
+ <th width="210"><%= Spree.t('order_state', scope: :order_states) %></th>
12
+ <td><%= Spree.t(payment.order.state) %></td>
13
+ </tr>
14
+
15
+ <tr>
16
+ <th><%= Spree.t('payment_state') %></th>
17
+ <td>
18
+ <%= Spree.t(payment.state, scope: :payment_states, default: payment.state.capitalize) %>
19
+ </td>
20
+ </tr>
21
+
22
+ <% if check_status_url.present? %>
23
+ <tr>
24
+ <th><%= Spree.t('vpago.payments.query_status') %></th>
25
+ <td><%= link_to Spree.t('vpago.payments.query_status'), check_status_url %></td>
26
+ </tr>
27
+ <% end %>
28
+
29
+ <% if heal_payment_url.present? %>
30
+ <tr>
31
+ <th><%= Spree.t('vpago.payments.check_and_heal') %></th>
32
+ <td><%= link_to Spree.t('vpago.payments.check_and_heal'), heal_payment_url, method: :put %></td>
33
+ </tr>
34
+ <% end %>
35
+
36
+ <tr>
37
+ <th><%= Spree.t('vpago.payments.updated_by_user') %></th>
38
+ <td><%= payment.source.updated_by_user&.full_name %></td>
39
+ </tr>
40
+ <tr>
41
+ <th><%= Spree.t('vpago.payments.updated_by_user_at') %></th>
42
+ <td><%= payment.source.updated_by_user_at %></td>
43
+ </tr>
44
+ <tr>
45
+ <th><%= Spree.t('vpago.payments.updated_reason') %></th>
46
+ <td><%= payment.source.updated_reason %></td>
47
+ </tr>
48
+
49
+
50
+ <tr>
51
+ <th><%= Spree.t('user') %></th>
52
+ <td><%= "#{payment.source.user&.id} - #{payment.source.user&.full_name} - #{payment.source.user&.email || payment.source.user&.phone_number}" %></td>
53
+ </tr>
54
+
55
+ <tr>
56
+ <th><%= Spree.t('transaction_id') %></th>
57
+ <td><%= payment.source.transaction_id %></td>
58
+ </tr>
59
+
60
+ <tr>
61
+ <th><%= Spree.t('payment_status') %></th>
62
+ <td><%= payment.source.payment_status %></td>
63
+ </tr>
64
+
65
+ <tr>
66
+ <th> Transaction Response</th>
67
+ <td><%= payment.transaction_response %></td>
68
+ </tr>
69
+
70
+ <tr>
71
+ <th>Pre Auth Status</th>
72
+ <td><%= payment.pre_auth_response %></td>
73
+ </tr>
74
+
75
+ <tr>
76
+ <th><%= Spree.t('payment_description') %></th>
77
+ <td><%= payment.source.payment_description %></td>
78
+ </tr>
79
+
80
+ <tr>
81
+ <th><%= Spree.t('created_at') %></th>
82
+ <td><%= payment.source.created_at %></td>
83
+ </tr>
84
+
85
+ <tr>
86
+ <th><%= Spree.t('updated_at') %></th>
87
+ <td><%= payment.source.updated_at %></td>
88
+ </tr>
89
+
90
+ <% if !payment.order.completed? && manual_update_payment_url.present? %>
91
+ <tr>
92
+ <th><%= Spree.t('vpago.payments.manually_mark') %></th>
93
+ <td>
94
+ <%= form_with url: manual_update_payment_url, method: :put do |f| %>
95
+ <div style='margin-top:10px;' >
96
+ <%= f.text_area :updated_reason, class: 'form-control' %>
97
+ </div>
98
+
99
+ <div style='margin-top:10px;' >
100
+ <%= f.button 'Save', class: 'btn btn-primary', data: { confirm: Spree.t('vpago.payments.confirm_manual_update')} %>
101
+ </div>
102
+ <% end %>
103
+ </td>
104
+ </tr>
105
+ <% end %>
106
+ </table>
107
+
108
+ </fieldset>
109
+ <% else %>
110
+ <div class="alert alert-danger">
111
+ <%= Spree.t(:empty) %>
112
+ </div>
113
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= render 'spree/admin/payments/source_views/vpago_payment_tmpl',
2
+ payment: payment,
3
+ check_status_url: admin_payment_wing_sdk_querier_path(payment),
4
+ heal_payment_url: admin_payment_wing_sdk_checker_path(payment),
5
+ manual_update_payment_url: admin_payment_wing_sdk_marker_path(payment) %>