Class: MyActiveMerchants::GbPrimepayGateway

Inherits:
Object
  • Object
show all
Includes:
ElasticAPM::SpanHelpers
Defined in:
app/my_lib/my_active_merchants/gb_primepay_gateway.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(reservation, card) ⇒ GbPrimepayGateway

Returns a new instance of GbPrimepayGateway.

Parameters:

  • reservation (Reservation)
  • card (Hash)

    "name": null,
    "number": "453501XXXXXX5741",
    "expirationMonth": "05",
    "expirationYear": "28",
    "securityCode": null,
    "token": "7da46305-6b8f-4c8d-895b-2463fe15a666",
    "cardLocation": "I",
    "cardType": "VIS"
    



19
20
21
22
23
24
25
26
27
28
# File 'app/my_lib/my_active_merchants/gb_primepay_gateway.rb', line 19

def initialize(reservation, card)
  @reservation = reservation.presence || Reservation.new
  @card = if card.is_a?(ActionController::Parameters)
            card.permit!.to_h.with_indifferent_access
          elsif card.present?
            card.with_indifferent_access
          end
  BUSINESS_LOGGER.set_business_context({ reservation_id: reservation&.id, card: card })
  HH_LOGGER.set_business_context({ reservation_id: reservation&.id })
end

Class Method Details

.void(reference_no, gb_secret_key = nil) ⇒ Object

Parameters:

  • reference_no (String)


81
82
83
84
85
86
87
88
89
# File 'app/my_lib/my_active_merchants/gb_primepay_gateway.rb', line 81

def self.void(reference_no, gb_secret_key = nil)
  if gb_secret_key.nil?
    tmp_secret = RequestStore.store[GB_PRIMEPAY_SECRET_KEY]
    gb_secret_key = tmp_secret.presence || Figaro.env.GB_PRIMEPAY_SECRET_KEY!
  end

  client = ::MyActiveMerchants::GbPrimepayGateway.new(nil, nil)
  client.void(reference_no, gb_secret_key)
end

Instance Method Details

#charge(charge_amount, use_3d_secure: true) ⇒ Object

Parameters:

  • charge_amount (Money)


31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/my_lib/my_active_merchants/gb_primepay_gateway.rb', line 31

def charge(charge_amount, use_3d_secure: true)
  if charged_just_now?(charge_amount)
    BUSINESS_LOGGER.info('GbPrimepayGateway::PREVENT_DUPLICATE_CHARGE', {
                           reservation_id: reservation.id,
                           charge_amount: charge_amount,
                         })
    return
  end

  mark_as_charging(charge_amount)
  success = false

  Externals::Omise::Charge.transaction do
    attributes = charge_attribute(charge_amount, use_3d_secure: use_3d_secure)
    reservation.charges.build(attributes)

    external_charge_id = attributes[:omise_charge_id]

    gb_secret_key = RequestStore.store[GB_PRIMEPAY_SECRET_KEY]
    VoidFailedReservationWorker.void_later(:gb_primepay, attributes[:reference_no], gb_secret_key)

    if use_3d_secure
      set_authorization_url(external_charge_id)
      BUSINESS_LOGGER.info('Done set_authorization_url for 3d secure',
                           { reservation_id: reservation.id, external_charge_id: external_charge_id })
      check_payment_status(external_charge_id)
    else
      reservation.mark_as_valid_reservation!
      reservation.save!
      BUSINESS_LOGGER.info('Processed charge without 3d secure', { reservation_id: reservation.id })
    end
    success = true
    mark_as_charged(charge_amount)
  end

  if success
    BUSINESS_LOGGER.info('Done processing charge using GB Primepay', {
                           reservation_id: reservation.id, charge_amount: charge_amount, success: success
                         })
  else
    remove_charged_marker(charge_amount)
    BUSINESS_LOGGER.error('Failed processing charge using GB Primepay', {
                            reservation_id: reservation.id, charge_amount: charge_amount, success: success
                          })
  end
  success
end

#void(reference_no, gb_secret_key) ⇒ Object

use .void method for easy access



92
93
94
95
96
97
98
# File 'app/my_lib/my_active_merchants/gb_primepay_gateway.rb', line 92

def void(reference_no, gb_secret_key)
  url = "#{::GB_PRIMEPAY_BASE_URL}v1/void"
  body = { gbpReferenceNo: reference_no }
  payload = body_to_payload(body, gb_secret_key)

  api_call(url, payload)
end