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.
- checksums.yaml +7 -0
- data/.env.example +3 -0
- data/.github/workflows/test_and_publish_gem.yml +96 -0
- data/.gitignore +24 -0
- data/.rspec +3 -0
- data/.rubocop.yml +56 -0
- data/.ruby-version +1 -0
- data/.tool-versions +1 -0
- data/.travis.yml +45 -0
- data/Appraisals +20 -0
- data/Gemfile +27 -0
- data/Gemfile.lock +656 -0
- data/LICENSE +26 -0
- data/README.md +151 -0
- data/Rakefile +21 -0
- data/app/.gitkeep +0 -0
- data/app/assets/config/spree_vpago_manifest.js +3 -0
- data/app/assets/images/backend-process.svg +3 -0
- data/app/assets/images/vpago/payway/abapay.png +0 -0
- data/app/assets/images/vpago/payway/cards.png +0 -0
- data/app/assets/javascripts/vpago/vpago_payments/request_process_payment.js +44 -0
- data/app/assets/javascripts/vpago/vpago_payments/user_informers/firebase.js +15802 -0
- data/app/controllers/.gitkeep +0 -0
- data/app/controllers/spree/acleda_redirects_controller.rb +22 -0
- data/app/controllers/spree/admin/payment_methods_controller_decorator.rb +65 -0
- data/app/controllers/spree/admin/payment_payway_base_controller.rb +25 -0
- data/app/controllers/spree/admin/payment_payway_checkers_controller.rb +34 -0
- data/app/controllers/spree/admin/payment_payway_markers_controller.rb +44 -0
- data/app/controllers/spree/admin/payment_payway_queriers_controller.rb +39 -0
- data/app/controllers/spree/admin/payment_wing_sdk_base_controller.rb +21 -0
- data/app/controllers/spree/admin/payment_wing_sdk_checkers_controller.rb +26 -0
- data/app/controllers/spree/admin/payment_wing_sdk_markers_controller.rb +36 -0
- data/app/controllers/spree/admin/payment_wing_sdk_queriers_controller.rb +20 -0
- data/app/controllers/spree/admin/payments_controller_decorator.rb +19 -0
- data/app/controllers/spree/admin/payout_profile_products_controller.rb +21 -0
- data/app/controllers/spree/admin/payout_profile_shipping_methods_controller.rb +21 -0
- data/app/controllers/spree/admin/payout_profiles_controller.rb +91 -0
- data/app/controllers/spree/admin/payouts_controller.rb +16 -0
- data/app/controllers/spree/api/v2/storefront/checkout_controller_decorator.rb +84 -0
- data/app/controllers/spree/payway_card_popups_controller.rb +20 -0
- data/app/controllers/spree/payway_results_controller.rb +11 -0
- data/app/controllers/spree/payway_v2_card_popups_controller.rb +20 -0
- data/app/controllers/spree/vpago_payments_controller.rb +71 -0
- data/app/controllers/spree/webhook/acleda_mobiles_controller.rb +88 -0
- data/app/controllers/spree/webhook/acledas_controller.rb +80 -0
- data/app/controllers/spree/webhook/base_controller.rb +6 -0
- data/app/controllers/spree/webhook/payways_controller.rb +77 -0
- data/app/controllers/spree/webhook/wings_controller.rb +63 -0
- data/app/controllers/spree/wing/base_controller.rb +29 -0
- data/app/controllers/spree/wing/transactions_controller.rb +27 -0
- data/app/controllers/spree/wing_redirects_controller.rb +20 -0
- data/app/helpers/vpago/admin/base_helper_decorator.rb +40 -0
- data/app/helpers/vpago/vpago_payments_helper.rb +12 -0
- data/app/javascripts/vpago/vpago_payments/user_informers/firebase.js +62 -0
- data/app/jobs/application_unique_job.rb +1 -0
- data/app/jobs/vpago/payment_processor_job.rb +8 -0
- data/app/models/.gitkeep +0 -0
- data/app/models/concerns/vpago/payoutable.rb +11 -0
- data/app/models/spree/gateway/acleda.rb +63 -0
- data/app/models/spree/gateway/acleda_mobile.rb +46 -0
- data/app/models/spree/gateway/payway.rb +66 -0
- data/app/models/spree/gateway/payway_v2.rb +174 -0
- data/app/models/spree/gateway/wing_sdk.rb +51 -0
- data/app/models/spree/payout.rb +23 -0
- data/app/models/spree/payout_profile.rb +107 -0
- data/app/models/spree/payout_profile_product.rb +14 -0
- data/app/models/spree/payout_profile_shipping_method.rb +14 -0
- data/app/models/spree/payout_profiles/payway_v2.rb +40 -0
- data/app/models/spree/vpago_payment_source.rb +21 -0
- data/app/models/vpago/adjustment_decorator.rb +28 -0
- data/app/models/vpago/line_item_decorator.rb +75 -0
- data/app/models/vpago/order_decorator.rb +78 -0
- data/app/models/vpago/payment_decorator.rb +44 -0
- data/app/models/vpago/payment_method_decorator.rb +91 -0
- data/app/models/vpago/payouts_generator.rb +125 -0
- data/app/models/vpago/product_decorator.rb +30 -0
- data/app/models/vpago/promotion_action_decorator.rb +9 -0
- data/app/models/vpago/shipment_decorator.rb +23 -0
- data/app/models/vpago/shipping_method_decorator.rb +33 -0
- data/app/models/vpago/shipping_rate_decorator.rb +25 -0
- data/app/models/vpago/store_decorator.rb +17 -0
- data/app/models/vpago/tax_category_decorator.rb +9 -0
- data/app/models/vpago/variant_decorator.rb +22 -0
- data/app/models/vpago/vendor_decorator.rb +10 -0
- data/app/overrides/spree/admin/adjustments/_adjustment/handle_by_table_body.html.erb.deface +11 -0
- data/app/overrides/spree/admin/adjustments/_adjustments_table/handle_by_table_header.html.erb.deface +3 -0
- data/app/overrides/spree/admin/adjustments/_form/handle_by_field.html.erb.deface +10 -0
- data/app/overrides/spree/admin/orders/_shipment/edit_method.html.erb.deface +26 -0
- data/app/overrides/spree/admin/orders/_shipment/show_method.html.erb.deface +27 -0
- data/app/overrides/spree/admin/payment_methods/_form/enable_pre_auth_field.html.erb.deface +17 -0
- data/app/overrides/spree/admin/payment_methods/_form/vendor_field.html.erb.deface +6 -0
- data/app/overrides/spree/admin/payment_methods/index/list.html.erb.deface +45 -0
- data/app/overrides/spree/admin/payment_methods/index/payment_methods_tabs.html.erb.deface +9 -0
- data/app/overrides/spree/admin/payment_methods/index/vendor_body.html.erb.deface +5 -0
- data/app/overrides/spree/admin/payment_methods/index/vendor_header.html.erb.deface +5 -0
- data/app/overrides/spree/admin/payments/_list/actions.html.erb.deface +13 -0
- data/app/overrides/spree/admin/promotions/_promotion_action/run_by_field.html.erb.deface +13 -0
- data/app/overrides/spree/admin/shared/_order_tabs/payouts.html.erb.deface +8 -0
- data/app/overrides/spree/admin/shared/_product_tabs/payout_profile_products.html.erb.deface +8 -0
- data/app/overrides/spree/admin/shared/sub_menu/_integrations/payout_profiles.html.erb.deface +3 -0
- data/app/overrides/spree/admin/shipping_methods/_form/handle_by.html.erb.deface +12 -0
- data/app/overrides/spree/admin/shipping_methods/edit/shipping_method_tabs.html.erb.deface +3 -0
- data/app/overrides/spree/admin/tax_categories/_form/collect_by_field.html.erb.deface +10 -0
- data/app/overrides/spree/admin/tax_categories/index/collect_by_table_body.html.erb.deface +4 -0
- data/app/overrides/spree/admin/tax_categories/index/collect_by_table_header.html.erb.deface +4 -0
- data/app/serializers/spree/api/v2/platform/vpago_payment_source_serializer.rb +11 -0
- data/app/serializers/spree/v2/storefront/payment_method_serializer_decorator.rb +23 -0
- data/app/serializers/spree/v2/storefront/payment_redirect_serializer.rb +13 -0
- data/app/serializers/spree/v2/storefront/payment_serializer_decorator.rb +13 -0
- data/app/serializers/spree/v2/storefront/vpago_payment_source_serializer.rb +9 -0
- data/app/services/.gitkeep +0 -0
- data/app/services/vpago/payment_finder.rb +27 -0
- data/app/services/vpago/payment_processor.rb +72 -0
- data/app/services/vpago/payment_redirect_handler.rb +194 -0
- data/app/services/vpago/payment_url_constructor.rb +32 -0
- data/app/services/vpago/payments/find_or_create.rb +51 -0
- data/app/services/vpago/payout_profiles/payway/base_payout_profile_request.rb +38 -0
- data/app/services/vpago/payout_profiles/payway/open_ssl_encrypter.rb +31 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_creator.rb +50 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_params_builder.rb +58 -0
- data/app/services/vpago/payout_profiles/payway/payout_profile_request_updater.rb +28 -0
- data/app/services/vpago/payway_return_options_builder.rb +39 -0
- data/app/services/vpago/user_informers/firebase.rb +52 -0
- data/app/views/.gitkeep +0 -0
- data/app/views/layouts/acleda.html.erb +18 -0
- data/app/views/layouts/payway.html.erb +24 -0
- data/app/views/layouts/payway_v2.html.erb +18 -0
- data/app/views/layouts/vpago_payments.html.erb +18 -0
- data/app/views/layouts/wing.html.erb +18 -0
- data/app/views/spree/_payment_icon.html.erb +25 -0
- data/app/views/spree/acleda_redirects/show.html.erb +3 -0
- data/app/views/spree/admin/payments/source_forms/_payment_payway.html.erb +4 -0
- data/app/views/spree/admin/payments/source_forms/_payway_v2.html.erb +7 -0
- data/app/views/spree/admin/payments/source_views/_acleda.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_acleda_mobile.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_payment_payway.html.erb +98 -0
- data/app/views/spree/admin/payments/source_views/_payway_v2.html.erb +5 -0
- data/app/views/spree/admin/payments/source_views/_vpago_payment_tmpl.html.erb +113 -0
- data/app/views/spree/admin/payments/source_views/_wingsdk.html.erb +5 -0
- data/app/views/spree/admin/payout_profile_products/_form.html.erb +28 -0
- data/app/views/spree/admin/payout_profile_products/edit.html.erb +18 -0
- data/app/views/spree/admin/payout_profile_products/index.html.erb +58 -0
- data/app/views/spree/admin/payout_profile_products/new.html.erb +22 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/_form.html.erb +28 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/edit.html.erb +22 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/index.html.erb +6 -0
- data/app/views/spree/admin/payout_profile_shipping_methods/new.html.erb +27 -0
- data/app/views/spree/admin/payout_profiles/_filter.html.erb +19 -0
- data/app/views/spree/admin/payout_profiles/_form.html.erb +72 -0
- data/app/views/spree/admin/payout_profiles/edit.html.erb +33 -0
- data/app/views/spree/admin/payout_profiles/index.html.erb +63 -0
- data/app/views/spree/admin/payout_profiles/new.html.erb +13 -0
- data/app/views/spree/admin/payouts/_line_item_info_with_popover.html.erb +43 -0
- data/app/views/spree/admin/payouts/index.html.erb +46 -0
- data/app/views/spree/admin/shared/_payment_methods_tabs.html.erb +15 -0
- data/app/views/spree/admin/shared/_shipping_method_tabs.html.erb +19 -0
- data/app/views/spree/admin/shared/payout_profile/_info_card.html.erb +24 -0
- data/app/views/spree/admin/shared/payout_profile/_status.html.erb +11 -0
- data/app/views/spree/checkout/payment/_acleda.html.erb +1 -0
- data/app/views/spree/checkout/payment/_acleda_checkout_form.html.erb +14 -0
- data/app/views/spree/checkout/payment/_acleda_mobile.html.erb +0 -0
- data/app/views/spree/checkout/payment/_payment_payway.html.erb +21 -0
- data/app/views/spree/checkout/payment/_payway_loader.html.erb +2 -0
- data/app/views/spree/checkout/payment/_payway_root.html.erb +9 -0
- data/app/views/spree/checkout/payment/_payway_script.html.erb +77 -0
- data/app/views/spree/checkout/payment/_payway_v2.html.erb +1 -0
- data/app/views/spree/checkout/payment/_payway_v2_loader.html.erb +2 -0
- data/app/views/spree/checkout/payment/_payway_v2_root.html.erb +9 -0
- data/app/views/spree/checkout/payment/_payway_v2_script.html.erb +79 -0
- data/app/views/spree/checkout/payment/_wing_checkout_form.html.erb +18 -0
- data/app/views/spree/checkout/payment/_wingsdk.html.erb +1 -0
- data/app/views/spree/checkout/payment/acleda_form.html.erb +3 -0
- data/app/views/spree/checkout/payment/payway_form.html.erb +10 -0
- data/app/views/spree/checkout/payment/payway_v2_form.html.erb +10 -0
- data/app/views/spree/checkout/payment/wingsdk_form.html.erb +3 -0
- data/app/views/spree/payway_card_popups/_form.html.erb +10 -0
- data/app/views/spree/payway_card_popups/show.html.erb +5 -0
- data/app/views/spree/payway_results/failed.html.erb +1 -0
- data/app/views/spree/payway_results/success.html.erb +1 -0
- data/app/views/spree/payway_v2_card_popups/_form.html.erb +15 -0
- data/app/views/spree/payway_v2_card_popups/show.html.erb +3 -0
- data/app/views/spree/vpago_payments/checkout.html.erb +3 -0
- data/app/views/spree/vpago_payments/forms/spree/gateway/_payway_v2.html.erb +13 -0
- data/app/views/spree/vpago_payments/processing.html.erb +49 -0
- data/app/views/spree/vpago_payments/success.html.erb +3 -0
- data/app/views/spree/wing_redirects/show.html.erb +3 -0
- data/bin/rails +8 -0
- data/build.js +9 -0
- data/config/initializers/assets.rb +1 -0
- data/config/initializers/spree_permitted_attributes.rb +5 -0
- data/config/locales/en.yml +28 -0
- data/config/locales/km.yml +24 -0
- data/config/routes.rb +92 -0
- data/db/migrate/20210128040625_create_spree_vpago_payment_sources.rb +14 -0
- data/db/migrate/20210430052432_add_fields_to_payment_sources.rb +7 -0
- data/db/migrate/20210824044737_add_preference_to_spree_vpago_payment_source.rb +5 -0
- data/db/migrate/20240506095140_create_spree_payout_profiles.rb +22 -0
- data/db/migrate/20240506095148_create_spree_payout_profile_products.rb +10 -0
- data/db/migrate/20240523070757_add_optional_spere_payout_profile_products.rb +5 -0
- data/db/migrate/20240715091228_create_spree_payouts.rb +25 -0
- data/db/migrate/20240718195510_create_spree_payout_profile_shipping_methods.rb +15 -0
- data/db/migrate/20240718201453_add_handle_by_to_spree_adjustments.rb +5 -0
- data/db/migrate/20240718201509_add_run_by_to_spree_promotion_actions.rb +5 -0
- data/db/migrate/20240718201523_add_collect_by_to_spree_tax_categories.rb +5 -0
- data/db/migrate/20240718201538_add_handle_by_to_spree_shipping_method.rb +5 -0
- data/db/migrate/20240718201554_add_handle_by_to_spree_shipping_rates.rb +5 -0
- data/db/migrate/20240808102853_add_vendor_reference_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20240904030132_add_gateway_status_to_spree_payments.rb +5 -0
- data/db/migrate/20241029071959_add_pre_auth_response_to_spree_payment.rb +5 -0
- data/db/migrate/20241202104014_add_enable_pre_auth_to_spree_payment_method.rb +5 -0
- data/db/migrate/20250121044614_add_transaction_response_to_spree_payments.rb +5 -0
- data/docs/acleda.md +65 -0
- data/gemfiles/spree_3_7.gemfile +9 -0
- data/gemfiles/spree_4_0.gemfile +8 -0
- data/gemfiles/spree_4_1.gemfile +9 -0
- data/gemfiles/spree_master.gemfile +8 -0
- data/lib/generators/spree_vpago/install/install_generator.rb +26 -0
- data/lib/generators/spree_vpago/install/templates/app/assets/images/vpago/payway/acleda_merchant_logo_300x300.png +0 -0
- data/lib/spree_vpago/engine.rb +36 -0
- data/lib/spree_vpago/factories.rb +6 -0
- data/lib/spree_vpago/version.rb +9 -0
- data/lib/spree_vpago.rb +5 -0
- data/lib/vpago/acleda/base.rb +111 -0
- data/lib/vpago/acleda/checkout.rb +105 -0
- data/lib/vpago/acleda/deeplink_checkout.rb +74 -0
- data/lib/vpago/acleda/payment_request_updater.rb +38 -0
- data/lib/vpago/acleda/transaction_status.rb +71 -0
- data/lib/vpago/acleda_mobile/base.rb +28 -0
- data/lib/vpago/acleda_mobile/callback_validator.php +35 -0
- data/lib/vpago/acleda_mobile/callback_validator.rb +38 -0
- data/lib/vpago/acleda_mobile/checkout.rb +78 -0
- data/lib/vpago/acleda_mobile/payment_request_updater.rb +34 -0
- data/lib/vpago/acleda_mobile/payment_retriever.rb +24 -0
- data/lib/vpago/acleda_mobile/transaction_status.rb +35 -0
- data/lib/vpago/payment_amount_calculator.rb +23 -0
- data/lib/vpago/payment_request_updater.rb +19 -0
- data/lib/vpago/payment_status_marker.rb +109 -0
- data/lib/vpago/payway/base.rb +112 -0
- data/lib/vpago/payway/checkout.rb +24 -0
- data/lib/vpago/payway/payment_request_updater.rb +31 -0
- data/lib/vpago/payway/payment_status_marker.rb +84 -0
- data/lib/vpago/payway/transaction_status.rb +74 -0
- data/lib/vpago/payway.rb +13 -0
- data/lib/vpago/payway_v2/base.rb +153 -0
- data/lib/vpago/payway_v2/checkout.rb +35 -0
- data/lib/vpago/payway_v2/payment_request_updater.rb +65 -0
- data/lib/vpago/payway_v2/payouts_params_constructor.rb +47 -0
- data/lib/vpago/payway_v2/pre_auth_canceler.rb +43 -0
- data/lib/vpago/payway_v2/pre_auth_completer.rb +76 -0
- data/lib/vpago/payway_v2/transaction_status.rb +85 -0
- data/lib/vpago/wing_sdk/base.rb +58 -0
- data/lib/vpago/wing_sdk/checkout.rb +20 -0
- data/lib/vpago/wing_sdk/payment_request_updater.rb +46 -0
- data/lib/vpago/wing_sdk/payment_retriever.rb +34 -0
- data/lib/vpago/wing_sdk/transaction_status_checker.rb +64 -0
- data/lib/vpago/wing_sdk/transaction_status_response.rb +33 -0
- data/node_modules/.yarn-integrity +147 -0
- data/package-lock.json +1491 -0
- data/package.json +10 -0
- data/spree_vpago.gemspec +33 -0
- data/yarn.lock +921 -0
- 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
|
data/app/views/.gitkeep
ADDED
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 @@
|
|
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) %>
|