class SoPaid::Cybersource

Public Class Methods

get_secret_key_for(targ_env) click to toggle source
# File lib/so_paid/cybersource.rb, line 101
def self.get_secret_key_for(targ_env)
  (@@pv_defaults[targ_env] and @@pv_defaults[targ_env][:secret_key]) || @@pv_defaults[:secret_key]
end
sign_params(field_list, params, secret_key) click to toggle source
# File lib/so_paid/cybersource.rb, line 91
def self.sign_params(field_list, params, secret_key)
  field_list = field_list.split(",") if field_list.is_a? String
  data = []
  field_list.each do |key|
    data << key.to_s + "=" + params[key].to_s
  end
  data = data.join(",")
  encode_hop(data, secret_key)
end
verify_transaction_signature(params) click to toggle source
# File lib/so_paid/cybersource.rb, line 81
def self.verify_transaction_signature(params)
  if params[:req_merchant_defined_data100].present? and params[:req_merchant_defined_data100] == "test"
    secret_key = get_secret_key_for(:test)
  else
    secret_key = get_secret_key_for(:live)
  end
  pub_digest = sign_params(params[:signed_field_names], params, secret_key)
  pub_digest.eql?(params[:signature].strip)
end

Public Instance Methods

generate_params() click to toggle source

refer to apps.cybersource.com/library/documentation/dev_guides/Secure_Acceptance_WM/html/wwhelp/wwhimpl/js/html/wwhelp.htm#href=SC_api.12.1.html#1113432 for more info on required keys needed signed fields: “access_key,profile_id,transaction_uuid,signed_field_names,unsigned_field_names,signed_date_time,locale,transaction_type,reference_number,amount,currency”

# File lib/so_paid/cybersource.rb, line 64
def generate_params
  return @pv_order_params if @pv_order_params.present?

  set_pv_fields
  set_order_specific_params
  set_signature

  return @pv_order_params
end
hop_url(use_post_url=nil) click to toggle source
# File lib/so_paid/cybersource.rb, line 75
def hop_url(use_post_url=nil)
  # test/live url has already been determined by test_mode or user_email
  @merged_pv_opts[:post_urls][ use_post_url.presence || @config_options[:use_post_url]]
end

Private Instance Methods

live?() click to toggle source
# File lib/so_paid/cybersource.rb, line 157
def live?
  !test?
end
set_order_specific_params() click to toggle source
# File lib/so_paid/cybersource.rb, line 131
def set_order_specific_params
  o_specific = { :amount=>"cs_amount", :reference_number=>"cs_reference_number", :transaction_uuid=>"cs_transaction_uuid" }
  
  o_specific.each_pair do |key, method|
    if @pv_order_params[key].present?
      next
    elsif @order.respond_to? method
      @pv_order_params[key] = @order.send(method.to_sym)
    else
      raise "No key/value pair given for order specific key '#{key.to_s}'. You must manually pass this pair in the opt_hash when calling SoPaid.vendor.new(order_obj, opt_hash, config_hash) or define a method/alias '#{method}' in your order_obj '#{@order.class.to_s}' model/class."
    end
  end

  @pv_order_params[:signed_date_time] = self.class.get_isotime if @pv_order_params[:signed_date_time].blank?
end
set_pv_fields() click to toggle source
# File lib/so_paid/cybersource.rb, line 107
def set_pv_fields
  @pv_order_params = {}
  if live?
    pv_opts = @pv_options[:live].presence || @pv_options
  else
    pv_opts = @pv_options[:test].presence || @pv_options
  end

  # we just set them above and are done with them
  @pv_options.delete(:live)
  @pv_options.delete(:test)
  # merge pv_order_params on top of pv_options which is
  # the combination of the class defaults and the configuration file defaults
  @merged_pv_opts = merge_defaults(pv_opts, @pv_options)
  @merged_pv_opts[:merchant_defined_data100] = live? ? "live" : "test"
  order_keys = @merged_pv_opts[:signed_field_names] + @merged_pv_opts[:unsigned_field_names]
  
  order_keys.each do |o_key|
    value = @merged_pv_opts[o_key].is_a?(Array) ? @merged_pv_opts[o_key].join(",") : @merged_pv_opts[o_key]
    @pv_order_params[o_key] = value
  end
end
set_signature() click to toggle source
# File lib/so_paid/cybersource.rb, line 148
def set_signature
  @pv_order_params[:signature] = self.class.sign_params(@merged_pv_opts[:signed_field_names], @pv_order_params, @merged_pv_opts[:secret_key])
end
test?() click to toggle source
# File lib/so_paid/cybersource.rb, line 153
def test?
  @config_options[:test_mode] or (@config_options[:test_user_email].present? and @config_options[:test_user_email] == @current_user_email)
end