Class: ActiveMerchant::Billing::RedsysRestGateway

Inherits:
Gateway
  • Object
show all
Defined in:
lib/active_merchant/billing/gateways/redsys_rest.rb

Overview

Redsys Merchant Gateway

Gateway support for the Spanish “Redsys” payment gateway system. This is used by many banks in Spain and is particularly well supported by Catalunya Caixa’s ecommerce department.

Redsys requires an order_id be provided with each transaction and it must follow a specific format. The rules are as follows:

* First 4 digits must be numerical
* Remaining 8 digits may be alphanumeric
* Max length: 12

If an invalid order_id is provided, we do our best to clean it up.

Written by Piers Chambers (Varyonic.com)

*** SHA256 Authentication Update ***

Redsys has dropped support for the SHA1 authentication method. Developer documentation: pagosonline.redsys.es/desarrolladores.html

Constant Summary collapse

CURRENCY_CODES =
{
  'AED' => '784',
  'ARS' => '32',
  'AUD' => '36',
  'BRL' => '986',
  'BOB' => '68',
  'CAD' => '124',
  'CHF' => '756',
  'CLP' => '152',
  'CNY' => '156',
  'COP' => '170',
  'CRC' => '188',
  'CZK' => '203',
  'DKK' => '208',
  'DOP' => '214',
  'EUR' => '978',
  'GBP' => '826',
  'GTQ' => '320',
  'HUF' => '348',
  'IDR' => '360',
  'INR' => '356',
  'JPY' => '392',
  'KRW' => '410',
  'MYR' => '458',
  'MXN' => '484',
  'NOK' => '578',
  'NZD' => '554',
  'PEN' => '604',
  'PLN' => '985',
  'RUB' => '643',
  'SAR' => '682',
  'SEK' => '752',
  'SGD' => '702',
  'THB' => '764',
  'TWD' => '901',
  'USD' => '840',
  'UYU' => '858'
}
THREEDS_EXEMPTIONS =
{
  corporate_card: 'COR',
  delegated_authentication: 'ATD',
  low_risk: 'TRA',
  low_value: 'LWV',
  stored_credential: 'MIT',
  trusted_merchant: 'NDF'
}
SUPPORTED_TRANSACTIONS =

The set of supported transactions for this gateway. More operations are supported by the gateway itself, but are not supported in this library.

{
  purchase:   '0',
  authorize:  '1',
  capture:    '2',
  refund:     '3',
  cancel:     '9',
  verify:     '7'
}
RESPONSE_TEXTS =

These are the text meanings sent back by the acquirer when a card has been rejected. Syntax or general request errors are not covered here.

{
  0 => 'Transaction Approved',
  400 => 'Cancellation Accepted',
  481 => 'Cancellation Accepted',
  500 => 'Reconciliation Accepted',
  900 => 'Refund / Confirmation approved',

  101 => 'Card expired',
  102 => 'Card blocked temporarily or under susciption of fraud',
  104 => 'Transaction not permitted',
  107 => 'Contact the card issuer',
  109 => 'Invalid identification by merchant or POS terminal',
  110 => 'Invalid amount',
  114 => 'Card cannot be used to the requested transaction',
  116 => 'Insufficient credit',
  118 => 'Non-registered card',
  125 => 'Card not effective',
  129 => 'CVV2/CVC2 Error',
  167 => 'Contact the card issuer: suspected fraud',
  180 => 'Card out of service',
  181 => 'Card with credit or debit restrictions',
  182 => 'Card with credit or debit restrictions',
  184 => 'Authentication error',
  190 => 'Refusal with no specific reason',
  191 => 'Expiry date incorrect',
  195 => 'Requires SCA authentication',

  201 => 'Card expired',
  202 => 'Card blocked temporarily or under suspicion of fraud',
  204 => 'Transaction not permitted',
  207 => 'Contact the card issuer',
  208 => 'Lost or stolen card',
  209 => 'Lost or stolen card',
  280 => 'CVV2/CVC2 Error',
  290 => 'Declined with no specific reason',

  480 => 'Original transaction not located, or time-out exceeded',
  501 => 'Original transaction not located, or time-out exceeded',
  502 => 'Original transaction not located, or time-out exceeded',
  503 => 'Original transaction not located, or time-out exceeded',

  904 => 'Merchant not registered at FUC',
  909 => 'System error',
  912 => 'Issuer not available',
  913 => 'Duplicate transmission',
  916 => 'Amount too low',
  928 => 'Time-out exceeded',
  940 => 'Transaction cancelled previously',
  941 => 'Authorization operation already cancelled',
  942 => 'Original authorization declined',
  943 => 'Different details from origin transaction',
  944 => 'Session error',
  945 => 'Duplicate transmission',
  946 => 'Cancellation of transaction while in progress',
  947 => 'Duplicate tranmission while in progress',
  949 => 'POS Inoperative',
  950 => 'Refund not possible',
  9064 => 'Card number incorrect',
  9078 => 'No payment method available',
  9093 => 'Non-existent card',
  9218 => 'Recursive transaction in bad gateway',
  9253 => 'Check-digit incorrect',
  9256 => 'Preauth not allowed for merchant',
  9257 => 'Preauth not allowed for card',
  9261 => 'Operating limit exceeded',
  9912 => 'Issuer not available',
  9913 => 'Confirmation error',
  9914 => 'KO Confirmation'
}
THREE_DS_V2 =

Expected values as per documentation

'2.1.0'

Constants inherited from Gateway

Gateway::CREDIT_DEPRECATION_MESSAGE, Gateway::RECURRING_DEPRECATION_MESSAGE, Gateway::STANDARD_ERROR_CODE

Instance Attribute Summary

Attributes inherited from Gateway

#options

Instance Method Summary collapse

Methods inherited from Gateway

#add_field_to_post_if_present, #add_fields_to_post_if_present, #card_brand, card_brand, #generate_unique_id, inherited, #supported_countries, supported_countries, supported_countries=, supports?, #supports_network_tokenization?, #test?

Methods included from CreditCardFormatting

#expdate, #format, #strftime_yyyymm

Methods included from PostsData

included, #raw_ssl_request, #ssl_get, #ssl_post, #ssl_request

Constructor Details

#initialize(options = {}) ⇒ RedsysRestGateway

Creates a new instance

Redsys requires a login and secret_key, and optionally also accepts a non-default terminal.

Options

  • :login – The Redsys Merchant ID (REQUIRED)

  • :secret_key – The Redsys Secret Key. (REQUIRED)

  • :terminal – The Redsys Terminal. Defaults to 1. (OPTIONAL)

  • :testtrue or false. Defaults to false. (OPTIONAL)



185
186
187
188
189
190
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 185

def initialize(options = {})
  requires!(options, :login, :secret_key)
  options[:terminal] ||= 1
  options[:signature_algorithm] = 'sha256'
  super
end

Instance Method Details

#authorize(money, payment, options = {}) ⇒ Object



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 209

def authorize(money, payment, options = {})
  requires!(options, :order_id)

  post = {}
  add_action(post, :authorize, options)
  add_amount(post, money, options)
  add_stored_credentials(post, options)
  add_threeds_exemption_data(post, options)
  add_order(post, options[:order_id])
  add_payment(post, payment)
  add_description(post, options)
  add_direct_payment(post, options)
  add_threeds(post, options)

  commit(post, options)
end

#capture(money, authorization, options = {}) ⇒ Object



226
227
228
229
230
231
232
233
234
235
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 226

def capture(money, authorization, options = {})
  post = {}
  add_action(post, :capture)
  add_amount(post, money, options)
  order_id, = split_authorization(authorization)
  add_order(post, order_id)
  add_description(post, options)

  commit(post, options)
end

#purchase(money, payment, options = {}) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 192

def purchase(money, payment, options = {})
  requires!(options, :order_id)

  post = {}
  add_action(post, :purchase, options)
  add_amount(post, money, options)
  add_stored_credentials(post, options)
  add_threeds_exemption_data(post, options)
  add_order(post, options[:order_id])
  add_payment(post, payment)
  add_description(post, options)
  add_direct_payment(post, options)
  add_threeds(post, options)

  commit(post, options)
end

#refund(money, authorization, options = {}) ⇒ Object



250
251
252
253
254
255
256
257
258
259
260
261
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 250

def refund(money, authorization, options = {})
  requires!(options, :order_id)

  post = {}
  add_action(post, :refund)
  add_amount(post, money, options)
  order_id, = split_authorization(authorization)
  add_order(post, order_id)
  add_description(post, options)

  commit(post, options)
end

#scrub(transcript) ⇒ Object



282
283
284
285
286
287
288
289
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 282

def scrub(transcript)
  merchant_parameters = filter_merchant_parameters(transcript)

  transcript.
    gsub(%r((Ds_MerchantParameters=)(\w+)), '\1' + merchant_parameters.to_s + '\3').
    gsub(%r((PAN\"=>\")(\d+)), '\1[FILTERED]').
    gsub(%r((CVV2\"=>\")(\d+)), '\1[FILTERED]')
end

#supports_scrubbing?Boolean

Returns:

  • (Boolean)


278
279
280
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 278

def supports_scrubbing?
  true
end

#verify(creditcard, options = {}) ⇒ Object



263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 263

def verify(creditcard, options = {})
  requires!(options, :order_id)

  post = {}
  add_action(post, :verify, options)
  add_amount(post, 0, options)
  add_order(post, options[:order_id])
  add_payment(post, creditcard)
  add_description(post, options)
  add_direct_payment(post, options)
  add_threeds(post, options)

  commit(post, options)
end

#void(authorization, options = {}) ⇒ Object



237
238
239
240
241
242
243
244
245
246
247
248
# File 'lib/active_merchant/billing/gateways/redsys_rest.rb', line 237

def void(authorization, options = {})
  requires!(options, :order_id)

  post = {}
  add_action(post, :cancel)
  order_id, amount, currency = split_authorization(authorization)
  add_amount(post, amount, currency:)
  add_order(post, order_id)
  add_description(post, options)

  commit(post, options)
end