Class: Veritrans

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Api, Client
Defined in:
lib/veritrans.rb,
lib/veritrans/api.rb,
lib/veritrans/client.rb,
lib/veritrans/config.rb,
lib/veritrans/events.rb,
lib/veritrans/result.rb,
lib/veritrans/version.rb

Defined Under Namespace

Modules: Api, Client Classes: Config, Events, Result, SnapResult

Constant Summary collapse

VERSION =
"2.4.1"

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Api

#approve, #cancel, #capture, #charge, #create_snap_redirect_url_str, #create_snap_token, #create_snap_token_string, #create_subscription, #create_vtlink, #delete_vtlink, #deny, #disable_subscription, #enable_subscription, #expire, #get_payment_account, #get_subscription, #inquiry_points, #link_payment_account, #refund, #status, #test_token, #unlink_payment_account, #update_subscription

Methods included from Client

_json_decode, #_json_encode, _json_encode, #request_with_logging

Constructor Details

#initialize(options = nil) ⇒ Veritrans

If you want to use multiple instances of Midtrans in your code (e.g. process payments in different accounts), then you can create instance of Midtrans client

mt_client = Midtrans.new(
  server_key: "My-Different-Key",
  client_key: "...",
  api_host: "https://api.sandbox.midtrans.com", # default
  http_options: { }, # optional
  logger: Logger.new(STDOUT), # optional
  file_logger: Logger.new(STDOUT), # optional
)
mt_client.status("my-different-order-id")


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/veritrans.rb', line 66

def initialize(options = nil)
  if options && options[:logger]
    self.logger = options.delete(:logger)
    options.delete("logger")
  end

  if options && options[:file_logger]
    self.file_logger = options.delete(:file_logger)
    options.delete("file_logger")
  end

  if options
    @config = Veritrans::Config.new(options)
  end
end

Class Method Details

.decode_notification_json(input) ⇒ Object

More safe json parser



39
40
41
# File 'lib/veritrans.rb', line 39

def decode_notification_json(input)
  return Veritrans::Client._json_decode(input)
end

.eventsObject

Shortcut for Veritrans::Events



29
30
31
32
33
34
35
36
# File 'lib/veritrans.rb', line 29

def events
  if defined?(ActiveSupport::Deprecation)
    ActiveSupport::Deprecation.warn("`Veritrans.events` is deprecated.  Please use `Veritrans::Events`.")
  else
    warn "`Veritrans.events` is deprecated.  Please use `Veritrans::Events`."
  end
  Veritrans::Events if defined?(Veritrans::Events)
end

.instanceObject



43
44
45
# File 'lib/veritrans.rb', line 43

def instance
  @instance ||= new
end

Instance Method Details

#checksum(params) ⇒ Object

Calculate signature_key sha512 checksum for validating HTTP notifications

Arguments:

params

A hash, should contain :order_id, :status_code, :gross_amount. Additional key :server_key is required if Midtrans.config.server_key is not set

Example

Midtrans.checksum(order_id: "aa11", status_code: "200", gross_amount: 1000, server_key: "my-key")
# => "5e00499b23a8932e833238b2f65dd4dd3d10451708c7ec4d93da69e8e7a2bac4f7f97f9f35a986a7d100d7fc58034e12..."

Raises:

  • ArgumentError when missing or invalid parameters



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/veritrans.rb', line 121

def checksum(params)
  require 'digest' unless defined?(Digest)

  params_sym = {}
  params.each do |key, value|
    params_sym[key.to_sym] = value
  end

  if (config.server_key.nil? || config.server_key == "") && params_sym[:server_key].nil?
    raise ArgumentError, "Server key is required. Please set Veritrans.config.server_key or :server_key key"
  end

  required = [:order_id, :status_code, :gross_amount]
  missing = required - params_sym.keys.select {|k| !!params_sym[k] }
  if missing.size > 0
    raise ArgumentError, "Missing required parameters: #{missing.map(&:inspect).join(", ")}"
  end

  if params_sym[:gross_amount].is_a?(Numeric)
    params_sym[:gross_amount] = "%0.2f" % params_sym[:gross_amount]
  elsif params_sym[:gross_amount].is_a?(String) && params_sym[:gross_amount] !~ /\d+\.\d\d$/
    raise ArgumentError, %{gross_amount has invalid format, should be a number or string with cents e.g "52.00" (given: #{params_sym[:gross_amount].inspect})}
  end

  seed = "#{params_sym[:order_id]}#{params_sym[:status_code]}" +
         "#{params_sym[:gross_amount]}#{params_sym[:server_key] || config.server_key}"

  logger.debug("checksum source: #{seed}")

  Digest::SHA2.new(512).hexdigest(seed)
end

#config(&block) ⇒ Object Also known as: setup

Midtrans configuration. Can be used as DSL and as object

Use with block:

Midtrans.setup do
  config.load_yml "./midtrans.yml", Rails.env # load values from config
  # also can set one by one:
  config.server_key = "..."
  config.client_key = "..."
  config.api_host = "https://api.sandbox.midtrans.com" # (default)
end

Use as object:

Midtrans.config.server_key


98
99
100
101
102
103
104
# File 'lib/veritrans.rb', line 98

def config(&block)
  if block
    instance_eval(&block)
  else
    @config ||= Veritrans::Config.new
  end
end

#eventsObject



49
50
51
# File 'lib/veritrans.rb', line 49

def events
  self.class.events
end

#file_loggerObject

Logger to file, only important information For rails apps it will write log to RAILS_ROOT/log/veritrans.log



182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/veritrans.rb', line 182

def file_logger
  if !@file_logger
    require 'logger'
    begin
      if defined?(Rails) && Rails.root
        require 'fileutils'
        FileUtils.mkdir_p(Rails.root.join("log"))
        @file_logger = Logger.new(Rails.root.join("log/veritrans.log").to_s)
      else
        @file_logger = Logger.new("/dev/null")
      end
    rescue => error
      STDERR.puts "Failed to create Midtrans.file_logger, will use /dev/null"
      STDERR.puts "#{error.class}: #{error.message}"
      STDERR.puts error.backtrace
      @file_logger = Logger.new("/dev/null")
    end
  end

  @file_logger
end

#file_logger=(value) ⇒ Object

Set custom file_logger

Midtrans.file_logger = Logger.new("./log/midtrans.log")


208
209
210
# File 'lib/veritrans.rb', line 208

def file_logger=(value)
  @file_logger = value
end

#loggerObject

General Midtrans logger. For rails apps it will try to use Rails.logger, for non-rails apps – it print to stdout

Midtrans.logger.info "Processing payment"


158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/veritrans.rb', line 158

def logger
  return @logger if @logger
  if defined?(Rails)
    Rails.logger
  else
    unless @log
      require 'logger'
      @log = Logger.new(STDOUT)
      @log.level = Logger::INFO
    end
    @log
  end
end

#logger=(value) ⇒ Object

Set custom logger

Midtrans.logger = Logger.new("./log/midtrans.log")


176
177
178
# File 'lib/veritrans.rb', line 176

def logger=(value)
  @logger = value
end