Class: Vpago::PaymentRedirectHandler

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Serialization
Defined in:
app/services/vpago/payment_redirect_handler.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(payment:, override_return_deeplink_url: nil) ⇒ PaymentRedirectHandler

Returns a new instance of PaymentRedirectHandler.



15
16
17
18
19
20
21
22
23
24
25
26
# File 'app/services/vpago/payment_redirect_handler.rb', line 15

def initialize(payment:, override_return_deeplink_url: nil)
  @payment = payment
  @override_return_deeplink_url = override_return_deeplink_url

  @vapgo_checkout_service = payment.payment_method.vapgo_checkout_service.presence&.new(
    payment,
    { override_return_deeplink_url: override_return_deeplink_url }
  )

  @gateway_params = vapgo_checkout_service&.gateway_params
  @action_url = vapgo_checkout_service&.action_url
end

Instance Attribute Details

#action_urlObject (readonly)

Returns the value of attribute action_url.



8
9
10
# File 'app/services/vpago/payment_redirect_handler.rb', line 8

def action_url
  @action_url
end

#error_messageObject

Returns the value of attribute error_message.



7
8
9
# File 'app/services/vpago/payment_redirect_handler.rb', line 7

def error_message
  @error_message
end

#gateway_paramsObject (readonly)

Returns the value of attribute gateway_params.



8
9
10
# File 'app/services/vpago/payment_redirect_handler.rb', line 8

def gateway_params
  @gateway_params
end

Returns the value of attribute override_return_deeplink_url.



8
9
10
# File 'app/services/vpago/payment_redirect_handler.rb', line 8

def override_return_deeplink_url
  @override_return_deeplink_url
end

#paymentObject (readonly)

Returns the value of attribute payment.



8
9
10
# File 'app/services/vpago/payment_redirect_handler.rb', line 8

def payment
  @payment
end

#redirect_optionsObject

Returns the value of attribute redirect_options.



7
8
9
# File 'app/services/vpago/payment_redirect_handler.rb', line 7

def redirect_options
  @redirect_options
end

#vapgo_checkout_serviceObject (readonly)

Returns the value of attribute vapgo_checkout_service.



8
9
10
# File 'app/services/vpago/payment_redirect_handler.rb', line 8

def vapgo_checkout_service
  @vapgo_checkout_service
end

Instance Method Details

#check_and_process_paymentObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'app/services/vpago/payment_redirect_handler.rb', line 35

def check_and_process_payment
  @payment.process!

  if payment_method.type_payway_v2?
    process_aba_v2_gateway
  elsif payment_method.type_payway?
    process_aba_gateway
  elsif payment_method.type_wingsdk?
    process_wing_gateway
  elsif payment_method.type_acleda?
    process_acleda_gateway
  elsif payment_method.type_acleda_mobile?
    process_acleda_mobile
  end
end

#payment_methodObject



182
183
184
# File 'app/services/vpago/payment_redirect_handler.rb', line 182

def payment_method
  @payment.payment_method
end

#payment_method_typeObject



186
187
188
# File 'app/services/vpago/payment_redirect_handler.rb', line 186

def payment_method_type
  payment_method.type
end

#payment_validObject



190
191
192
# File 'app/services/vpago/payment_redirect_handler.rb', line 190

def payment_valid
  !::Spree::Payment::INVALID_STATES.include?(@payment.state)
end

#processObject



28
29
30
31
32
33
# File 'app/services/vpago/payment_redirect_handler.rb', line 28

def process
  validate_payment
  check_and_process_payment

  self
end

#process_aba_gatewayObject



122
123
124
125
# File 'app/services/vpago/payment_redirect_handler.rb', line 122

def process_aba_gateway
  payment_option = @payment.payment_method.preferences[:payment_option]
  payment_option == 'abapay' ? process_abapay_deeplink : process_payway_card
end

#process_aba_v2_gatewayObject



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/services/vpago/payment_redirect_handler.rb', line 66

def process_aba_v2_gateway
  payment_option = @payment.payment_method.preferences[:payment_option]

  if %w[abapay abapay_khqr_deeplink].include?(payment_option)
    process_abapay_v2_deeplink
  else
    # construct web url for render web view.
    # same implementation for alipay, wechat, cards, abapay_khqr.

    # - for abapay_khqr: in web view, it renders QR then request to open intent://ababank.com?... for app to open ABA app.
    # - for others: it only renders QR
    process_payway_v2_card
  end
end


144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'app/services/vpago/payment_redirect_handler.rb', line 144

def process_abapay_deeplink
  send_process_payment

  return unless @response.status == 200

  json_response = JSON.parse(@response.body)

  if json_response['status'] == '0'
    @redirect_options = json_response
  else
    @error_message = json_response['description']
  end
end


90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/services/vpago/payment_redirect_handler.rb', line 90

def process_abapay_v2_deeplink
  response = send_process_payway_v2_payment

  return unless response.status == 200

  json_response = JSON.parse(response.body)

  if json_response['status']['code'] == '00'
    @redirect_options = json_response
  else
    @error_message = json_response['description']
  end
end

#process_acleda_gatewayObject



51
52
53
54
55
56
57
# File 'app/services/vpago/payment_redirect_handler.rb', line 51

def process_acleda_gateway
  data = {
    href: "#{ENV.fetch('DEFAULT_URL_HOST', nil)}/acleda_redirects?payment_number=#{@payment.number}"
  }

  @redirect_options = data
end

#process_acleda_mobileObject



59
60
61
62
63
64
# File 'app/services/vpago/payment_redirect_handler.rb', line 59

def process_acleda_mobile
  service = Vpago::AcledaMobile::Checkout.new(@payment)
  service.call

  @redirect_options = service.results
end

#process_payway_cardObject



127
128
129
130
131
132
133
134
# File 'app/services/vpago/payment_redirect_handler.rb', line 127

def process_payway_card
  ## TO DO: generate redirect url
  data = {
    href: "#{ENV.fetch('DEFAULT_URL_HOST', nil)}/payway_card_popups?payment_number=#{@payment.number}"
  }

  @redirect_options = data
end

#process_payway_v2_cardObject



81
82
83
84
85
86
87
88
# File 'app/services/vpago/payment_redirect_handler.rb', line 81

def process_payway_v2_card
  ## TO DO: generate redirect url
  data = {
    href: "#{ENV.fetch('DEFAULT_URL_HOST', nil)}/payway_v2_card_popups?payment_number=#{@payment.number}"
  }

  @redirect_options = data
end

#process_wing_gatewayObject



136
137
138
139
140
141
142
# File 'app/services/vpago/payment_redirect_handler.rb', line 136

def process_wing_gateway
  data = {
    href: "#{ENV.fetch('DEFAULT_URL_HOST', nil)}/wing_redirects?payment_number=#{@payment.number}"
  }

  @redirect_options = data
end

#send_process_paymentObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'app/services/vpago/payment_redirect_handler.rb', line 158

def send_process_payment
  options = {
    app_checkout: true
  }

  abapay_payment = ::Vpago::Payway::Checkout.new(@payment, options)
  gateway_params = abapay_payment.gateway_params
  gateway_params[:payment_option] = 'abapay_deeplink'

  conn = Faraday::Connection.new do |faraday|
    faraday.request :url_encoded
  end

  @response = conn.post(abapay_payment.action_url, gateway_params) do |request|
    request.headers['Referer'] = ENV.fetch('DEFAULT_URL_HOST', nil)
  end
end

#send_process_payway_v2_paymentObject



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'app/services/vpago/payment_redirect_handler.rb', line 104

def send_process_payway_v2_payment
  options = {
    app_checkout: true,
    override_return_deeplink_url:
  }

  abapay_payment = ::Vpago::PaywayV2::Checkout.new(@payment, options)
  gateway_params = abapay_payment.gateway_params

  conn = Faraday::Connection.new do |faraday|
    faraday.request :url_encoded
  end

  conn.post(abapay_payment.checkout_url, gateway_params) do |request|
    request.headers['Referer'] = ENV.fetch('DEFAULT_URL_HOST', nil)
  end
end

#validate_paymentObject

Raises:

  • (ActiveRecord::RecordNotFound)


176
177
178
179
180
# File 'app/services/vpago/payment_redirect_handler.rb', line 176

def validate_payment
  raise ActiveRecord::RecordNotFound if !payment_valid || !payment_method.vpago_payment?

  true
end