Class: Veritrans

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

Defined Under Namespace

Modules: Api, CLI, Client Classes: Config, Events, InstallGenerator, PaymentFormGenerator, Result, SnapResult, TestingLib

Constant Summary collapse

Testing =
Veritrans::TestingLib.new
VERSION =
"2.2.0"

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Api

#approve, #cancel, #capture, #charge, #create_snap_token, #create_vtlink, #delete_vtlink, #expire, #inquiry_points, #status

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")


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

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



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

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

.eventsObject

Shortcut for Veritrans::Events



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

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



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

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



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
152
# File 'lib/veritrans.rb', line 122

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


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

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

#eventsObject



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

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



183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/veritrans.rb', line 183

def file_logger
  if !@file_logger
    if defined?(Rails) && Rails.root
      @file_logger = Logger.new(Rails.root.join("log/veritrans.log").to_s)
    else
      require 'logger'
      @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")


200
201
202
# File 'lib/veritrans.rb', line 200

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"


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

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")


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

def logger=(value)
  @logger = value
end