base.rb 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. module Payment
  2. class Base
  3. def self.charge_from_card(payment, customer, card, pre_auth, saved_card = true)
  4. amount = pre_auth ? 0 : payment[:amount]
  5. event_type = pre_auth ? "pre_authorization" : "credit_card_payment"
  6. id = {id: "c-#{Billing::WalletTransaction.id_generator}"}
  7. payment.merge!(id)
  8. request, response = default_gateway.charge_from_card(payment, customer, card, pre_auth, saved_card)
  9. {event_type: event_type, amount: amount, currency: payment[:currency], metadata: {response: response, request: request, external_id: payment[:id], gateway: default_gateway.to_s, refunded: false}, success: response[:success]}
  10. end
  11. def self.cancel_transaction(refundable, pre_auth)
  12. event_type = pre_auth ? "cancel_pre_auth" : "cancel_transaction"
  13. amount = pre_auth ? 0 : -(refundable[:amount])
  14. request, response = default_gateway.cancel_transaction(refundable)
  15. request.merge!({amount: -refundable[:amount]}) if pre_auth
  16. {event_type: event_type, amount: amount, currency: refundable[:currency], metadata: {"request" => request, "response" => response, external_id: refundable[:id] , gateway: default_gateway.to_s}, success: response[:success]}
  17. end
  18. def self.refund_money(refundable)
  19. request, response = default_gateway.refund_money(refundable)
  20. {event_type: "credit_card_refund", amount: -(refundable[:amount]), currency: refundable[:currency], metadata: {"request" => request, "response" => response, external_id: refundable[:id], gateway: default_gateway.to_s}, success: response[:success]}
  21. end
  22. def self.query_saved_cards(customer)
  23. _, response = default_gateway.query_saved_cards(customer)
  24. response
  25. end
  26. def self.delete_card(tokens)
  27. success = true
  28. tokens.each do |adapter, token|
  29. _, response = adapter.constantize.delete_card(token)
  30. success = success && response[:success] # rubocop:disable Style/SelfAssignment
  31. end
  32. success
  33. end
  34. def self.currency_exchange(from, to, amount)
  35. _, response = default_gateway.currency_exchange(from, to, amount)
  36. response
  37. end
  38. def self.query_bin_number(bin)
  39. _, response = default_gateway.query_bin_number(bin)
  40. response
  41. end
  42. def self.query_card_type_with_bin_number(bin)
  43. _, response = default_gateway.query_bin_number(bin)
  44. response[:success] ? (response[:bin]["cardBrand"] == "VISA" ? "visa" : "mastercard") : "other" # rubocop:disable Style/NestedTernaryOperator
  45. end
  46. def self.default_gateway(user = nil)
  47. return Payment::TestGateway if Rails.env.test?
  48. case user&.country
  49. when "TR"
  50. Payment::Paratika
  51. when "US", "UK"
  52. Payment::Stripe
  53. when "CN"
  54. Payment::AliPay
  55. when "RU"
  56. Payment::YandexPay
  57. else
  58. Payment.adapter
  59. end
  60. end
  61. end
  62. end