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