Class: RedsysRuby::TPV

Inherits:
Object
  • Object
show all
Defined in:
lib/redsys-ruby/tpv.rb

Constant Summary collapse

PRODUCTION_URL =
"https://sis.redsys.es/sis/realizarPago"
TEST_URL =
"https://sis-t.redsys.es:25443/sis/realizarPago"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(merchant_key:) ⇒ TPV

Returns a new instance of TPV.

Raises:

  • (ArgumentError)


14
15
16
17
# File 'lib/redsys-ruby/tpv.rb', line 14

def initialize(merchant_key:)
  raise ArgumentError, "merchant_key is required" if merchant_key.nil? || merchant_key.to_s.strip.empty?
  @merchant_key = merchant_key
end

Instance Attribute Details

#merchant_keyObject (readonly)

Returns the value of attribute merchant_key.



12
13
14
# File 'lib/redsys-ruby/tpv.rb', line 12

def merchant_key
  @merchant_key
end

Instance Method Details

#decode_parameters(merchant_parameters_64) ⇒ Object



70
71
72
# File 'lib/redsys-ruby/tpv.rb', line 70

def decode_parameters(merchant_parameters_64)
  JSON.parse(Base64.decode64(merchant_parameters_64))
end

#generate_merchant_parameters(params) ⇒ Object



31
32
33
34
# File 'lib/redsys-ruby/tpv.rb', line 31

def generate_merchant_parameters(params)
  json_params = params.to_json
  Base64.strict_encode64(json_params)
end

#generate_merchant_signature(order, merchant_parameters_64) ⇒ Object



36
37
38
39
# File 'lib/redsys-ruby/tpv.rb', line 36

def generate_merchant_signature(order, merchant_parameters_64)
  digest = calculate_digest(order, merchant_parameters_64)
  Base64.strict_encode64(digest)
end

#generate_merchant_signature_notif(merchant_parameters_64) ⇒ Object

Raises:

  • (ArgumentError)


53
54
55
56
57
58
59
60
61
62
# File 'lib/redsys-ruby/tpv.rb', line 53

def generate_merchant_signature_notif(merchant_parameters_64)
  # For notifications, we need to extract the order from the decoded parameters.
  decoded_params = decode_parameters(merchant_parameters_64)
  order = decoded_params["Ds_Order"] || decoded_params["Ds_Merchant_Order"]
  
  raise ArgumentError, "Order is missing in merchant parameters" if order.nil?

  digest = calculate_digest(order, merchant_parameters_64)
  Base64.urlsafe_encode64(digest)
end

#payment_data(params) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
# File 'lib/redsys-ruby/tpv.rb', line 41

def payment_data(params)
  params = params.transform_keys(&:to_s)
  merchant_parameters_64 = generate_merchant_parameters(params)
  order = params["Ds_Merchant_Order"]
  
  {
    Ds_SignatureVersion: "HMAC_SHA256_V1",
    Ds_MerchantParameters: merchant_parameters_64,
    Ds_Signature: generate_merchant_signature(order.to_s, merchant_parameters_64)
  }
end

#valid_signature?(merchant_parameters_64, signature) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
67
68
# File 'lib/redsys-ruby/tpv.rb', line 64

def valid_signature?(merchant_parameters_64, signature)
  expected_signature = generate_merchant_signature_notif(merchant_parameters_64)
  # We should use a constant-time comparison here for security
  secure_compare(expected_signature, signature)
end