Class: CobroDigital::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/cobro_digital.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attrs = {}) ⇒ Client

Returns a new instance of Client.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/cobro_digital.rb', line 49

def initialize(attrs={})
  @id_comercio    = attrs[:id_comercio]
  @sid            = attrs[:sid]
  @client_to_use  = attrs[:con_client].to_s.empty? ? CobroDigital::SOAP : attrs[:con_client]
  # @with_handshake = attrs[:handshake].present? ? attrs[:handshake] : true
  @pagadores      = []
  @boletas        = []
  @transacciones  = []
  @micrositios    = []
  @request_xml    = nil

  unless CobroDigital::CLIENTS.include?(@client_to_use)
    raise ArgumentError, "client_to_use inválido: #{@client_to_use.inspect} (esperado uno de #{CobroDigital::CLIENTS.inspect})"
  end
end

Instance Attribute Details

#boletasObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def boletas
  @boletas
end

#client_to_useObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def client_to_use
  @client_to_use
end

#http_methodObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def http_method
  @http_method
end

#id_comercioObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def id_comercio
  @id_comercio
end

#micrositiosObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def micrositios
  @micrositios
end

#pagadoresObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def pagadores
  @pagadores
end

#request_xmlObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def request_xml
  @request_xml
end

#requestsObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def requests
  @requests
end

#sidObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def sid
  @sid
end

#transaccionesObject

NOTA: sid y request_xml contienen datos sensibles (credencial del comercio y XML con sid + PII del pagador). No loguear estos accessors.



47
48
49
# File 'lib/cobro_digital.rb', line 47

def transacciones
  @transacciones
end

Instance Method Details

#call(request) ⇒ Object



111
112
113
# File 'lib/cobro_digital.rb', line 111

def call(request)
  send("#{client_to_use}_client", comercio.merge(request))
end

#comercioObject



115
116
117
# File 'lib/cobro_digital.rb', line 115

def comercio
  { 'idComercio' => @id_comercio, 'sid' => @sid, 'handshake' => Digest::MD5.hexdigest(Time.now.to_f.to_s) }
end

#https_client(params) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/cobro_digital.rb', line 89

def https_client(params)
  case http_method
  when CobroDigital::Https::POST
    uri = ::URI.parse(CobroDigital::URI)
    req = Net::HTTP::Post.new(uri)
    req.set_form_data(params)
  when CobroDigital::Https::GET
    uri = ::URI.parse([CobroDigital::URI, ::URI.encode_www_form(params)].join('?'))
    req = Net::HTTP::Get.new(uri)
  end

  Net::HTTP.start(
    uri.hostname,
    uri.port,
    use_ssl: uri.scheme == CobroDigital::HTTPS,
    open_timeout: CobroDigital::TIMEOUT,
    read_timeout: CobroDigital::TIMEOUT
  ) do |http|
    http.request(req)
  end
end

#soap_client(params) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/cobro_digital.rb', line 65

def soap_client(params)
  # `log: true` para que se sigan registrando errores SOAP/HTTP; la
  # verbosidad la controla `log_level` (default :error → no loguea el body).
  # `filters` enmascara el nodo con sid + PII como ***FILTERED*** si algo se
  # llega a loguear. ADVERTENCIA: con COBRODIGITAL_LOG_LEVEL=debug el XML
  # formateado incluye el sid en claro — no habilitar debug en producción.
  client = Savon.client(
    wsdl: CobroDigital::WSDL,
    log: true,
    log_level: CobroDigital::LOG_LEVEL,
    filters: CobroDigital::LOG_FILTERS,
    pretty_print_xml: CobroDigital::DEBUG_LOG,
    open_timeout: CobroDigital::TIMEOUT,
    read_timeout: CobroDigital::TIMEOUT
  )
  operation = client.operation(:webservice_cobrodigital)
  request = operation.build(message: { 'parametros_de_entrada' => params.to_json })
  # Contrato público: `@request_xml` siempre disponible tras el call. Retiene
  # el XML con sid + PII en memoria — el consumidor no debe loguearlo.
  @request_xml = request.pretty

  client.call(:webservice_cobrodigital, message: { 'parametros_de_entrada' => params.to_json })
end