class CompletePaymentSystems::Request

Attributes

params[R]
xml[R]

Public Class Methods

new(params) click to toggle source
# File lib/complete_payment_systems/request_processing.rb, line 6
def initialize(params)
  @params = params #|| File.read("#{CPS.root}/response.xml")
  @xml = build_request_xml
end

Public Instance Methods

send!() click to toggle source
# File lib/complete_payment_systems/request_processing.rb, line 11
def send!
  response = Unirest.post CPS.config.cps_url,
                      #headers:{ "Accept" => "application/json" },
                      parameters:{ type: CPS.config.cps_method, xml: xml }

  puts response.code # Status code
  puts response.headers # Response headers
  puts response.body # Parsed body

  return "OK" if response.body.to_s.match(CPS.config.success_regex).present?
  return "ERROR"
end

Private Instance Methods

build_request_xml() click to toggle source
# File lib/complete_payment_systems/request_processing.rb, line 32
def build_request_xml
  values = {
    user: (params[:user] || CPS.config.default_user), # "test_pasta_sign" for direct, "pasta_test_3d" for direct with 3D
    callback_url: (params[:callback_url] || CPS.config.default_callback_url),
    redirect_url: (params[:redirect_url] || CPS.config.default_redirect_url),
    order: (params[:order] || Time.now.to_i), # TO-DO remove fallback
    value: (params[:value]),
    currency: (params[:currency]),
    holder_name: params[:holder_name],
    holder_surname: params[:holder_surname],
    holder_street: (params[:holder_street] || CPS.config.placeholder_value),
    holder_zip: (params[:holder_zip] || CPS.config.placeholder_value),
    holder_city: (params[:holder_city] || CPS.config.placeholder_value),
    holder_country: (params[:holder_country] || CPS.config.default_country),
    holder_email: (params[:holder_email] || CPS.config.placeholder_value),
    holder_ip: ( params[:holder_ip] ),
    card_number: params[:card_number], # 4012001037167778 for direct, For 3D-Secure number is 4314229999999913
    card_exp: params[:card_exp], # 06/18 for direct, 3D-sec is "01/18"
    card_cvv: params[:card_cvv], # 999 for direct, 3D-sec is "123"
    product_name: (params[:product_name] || CPS.config.default_product_name),
    product_url: (params[:product_url] || CPS.config.default_product_url)
  }

  values[:signature] = sign(order_id: values[:order], value: values[:value], currency: values[:currency], card_number: values[:card_number]).gsub(/\n/, '')

  values[:signature_line] = '<digiSignature>' + values[:signature] + '</digiSignature>'

  xml_string = ""
  xml_string = %Q|<?xml version="1.0" encoding="UTF-8" ?>\n| +
    %Q|<cpsxml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n| +
    %Q|        xsi:schemaLocation="http://www.cps.lv/xml/ns/cpsxml https://3ds.cps.lv/GatorServo/Gator_SendForAuth.xsd"\n| +
    %Q|        xmlns="http://www.cps.lv/xml/ns/cpsxml">\n| +
    %Q|  <header xmlns="">\n| +
    %Q|    <responsetype>direct</responsetype>\n| +
    %Q|    <user>#{values[:user]}</user>\n| +
    %Q|    <type>sendForAuth</type>\n| +
    %Q|    <transType>DB</transType>\n| +
    %Q|    | + values[:signature_line] + "\n" +
    %Q|    <callbackUrl>#{values[:callback_url]}</callbackUrl>\n| +
    %Q|    <redirectUrl>#{values[:redirect_url]}</redirectUrl>\n| +
    %Q|  </header>\n| +
    %Q|  <request xmlns="">\n| +
    %Q|    <orderNumber>#{values[:order]}</orderNumber>\n| +
    %Q|    <cardholder>\n| +
    %Q|      <firstName>#{values[:holder_name]}</firstName>\n| +
    %Q|      <lastName>#{values[:holder_surname]}</lastName>\n| +
    %Q|      <street>#{values[:holder_street]}</street>\n| +
    %Q|      <zip>#{values[:holder_zip]}</zip>\n| +
    %Q|      <city>#{values[:holder_city]}</city>\n| +
    %Q|      <country>#{values[:holder_country]}</country>\n| +
    %Q|      <email>#{values[:holder_email]}</email>\n| +
    %Q|      <ip>#{values[:holder_ip]}</ip>\n| +
    %Q|    </cardholder>\n| +
    %Q|    <card>\n| +
    %Q|      <cardNumber>#{values[:card_number]}</cardNumber>\n| +
    %Q|      <expires>#{values[:card_exp]}</expires>\n| +
    %Q|      <cvv>#{values[:card_cvv]}</cvv>\n| +
    %Q|    </card>\n| +
    %Q|    <amount>\n| +
    %Q|      <value>#{values[:value]}</value>\n| +
    %Q|      <currency>#{values[:currency]}</currency>\n| +
    %Q|    </amount>\n| +
    %Q|    <product>\n| +
    %Q|      <productName>#{values[:product_name]}</productName>\n| +
    %Q|      <productUrl>#{values[:product_url]}</productUrl>\n| +
    %Q|    </product>\n| +
    %Q|  </request>\n| +
    %Q|</cpsxml>|
end
sign(type: CPS.config.cps_method, user: CPS.config.default_user, order_id: "", value: "", currency: "", card_number: "", product: CPS.config.default_product_name) click to toggle source
# File lib/complete_payment_systems/request_processing.rb, line 25
def sign(type: CPS.config.cps_method, user: CPS.config.default_user, order_id: "", value: "", currency: "", card_number: "", product: CPS.config.default_product_name)
  sign_string = [type, user, order_id, value, currency, card_number, product].join()
  rsa         = OpenSSL::PKey::RSA.new(File.read(CPS.config.rsa_cert_path), CPS.config.cert_pass )
  signed_hash = rsa.sign(OpenSSL::Digest::SHA1.new, sign_string)
  Base64.encode64(signed_hash)
end