class Kmflow::Pagos
Public Class Methods
loger(m)
click to toggle source
# File lib/kmflow.rb, line 38 def self.loger(m) log.info m.to_s end
nuevo(data)
click to toggle source
# File lib/kmflow.rb, line 6 def self.nuevo(data) pedido = "c="+CGI::escape(cfg['email_tienda'].to_s)+"&ti="+cfg['tipo_pago'].to_s+"&oc="+CGI::escape(data[:orden].to_s)+"&mp="+cfg['medio_pago'].to_s+ "&o="+CGI::escape(data[:concepto].to_s)+"&m="+CGI::escape(data[:monto].to_s)+"&ue="+CGI::escape((cfg['url']+cfg['url_exito']).to_s)+"&uf="+CGI::escape((cfg['url']+cfg['url_fracaso']).to_s)+ "&uc="+CGI::escape((cfg['url']+cfg['url_confirmacion']).to_s)+"&e="+CGI::escape(data[:email].to_s) enc = flow_sign(pedido) flowHash = pedido + '&s=' + enc log.info "Boton creado correctamente" if data[:boton] btntxt = data[:boton] else if cfg['medio_pago'] == 1 btntxt = 'Pagar con Webpay' elsif cfg['medio_pago'] == 2 btntxt = 'Pagar con Servipag' else btntxt = 'Pagar con Flow' end end form = "<form method=\"post\" action=\"#{cfg['url_form']}\" class=\"#{data[:class]? data[:class] : 'flow-form'}\"> <input type=\"hidden\" name=\"parameters\" value=\"#{flowHash}\"/><button type=\"submit\">#{btntxt}</button></form>" data[:return] == 'hash' ? flowHash : form.html_safe end
verificar_respuesta(flowParams)
click to toggle source
# File lib/kmflow.rb, line 29 def self.verificar_respuesta(flowParams) order = Rack::Utils.parse_nested_query(flowParams) noKey = flowParams.split('&s=').first kDecode = Base64.decode64(order['s']) ver = public_key.verify OpenSSL::Digest::SHA1.new, kDecode, noKey log.info 'Firma pública verificada correctamente' if ver { 'response' => ver, 'order' => order } end
Private Class Methods
build_response(result_bool)
click to toggle source
# File lib/kmflow.rb, line 47 def self.build_response(result_bool) r = result_bool ? 'ACEPTADO' : 'RECHAZADO' data = ['status' => r, 'c' => cfg['email_tienda']] log.info "Status: #{r}" q = URI.encode_www_form(data) sign = flow_sign(q) q+'&s='+sign.html_content end
cfg()
click to toggle source
# File lib/kmflow.rb, line 43 def self.cfg YAML.load_file("#{::Rails.root.to_s}/config/kmflow.yml")[Rails.env] end
flow_sign(data)
click to toggle source
# File lib/kmflow.rb, line 56 def self.flow_sign(data) prvkey = private_key() enc = prvkey.sign(OpenSSL::Digest::SHA1.new, data) log.error 'No se pudo firmar con la llave privada' if !enc Base64.encode64(enc) end
log()
click to toggle source
# File lib/kmflow.rb, line 82 def self.log @@log ||= Logger.new("#{Rails.root}/log/kmflow.log") end
private_key()
click to toggle source
# File lib/kmflow.rb, line 74 def self.private_key OpenSSL::PKey::RSA.new File.read cfg['key_privada'] end
public_key()
click to toggle source
# File lib/kmflow.rb, line 78 def self.public_key OpenSSL::PKey::RSA.new File.read cfg['key_publica'] end
read_confirm(r)
click to toggle source
# File lib/kmflow.rb, line 63 def self.read_confirm(r) order = Rack::Utils.parse_nested_query(r) {'status' => order['status']} log.error 'invalid response status' if !order log.error 'Mensaje no tiene firma' if !order['s'] log.error 'Firma invalida' if !verificar_respuesta(r) log.error 'No hay número de orden' if !order['kpf_orden'] rescue render text: 'FRACASO' end