Class: Paynow

Inherits:
Object
  • Object
show all
Defined in:
lib/paynow_sdk.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(integration_id, integration_key, return_url, result_url) ⇒ Paynow

Returns a new instance of Paynow.



225
226
227
228
229
230
# File 'lib/paynow_sdk.rb', line 225

def initialize(integration_id, integration_key, return_url, result_url)
  @integration_id = integration_id
  @integration_key = integration_key
  @return_url = return_url
  @result_url = result_url
end

Class Method Details

.integration_idObject



409
# File 'lib/paynow_sdk.rb', line 409

def self.integration_id; @@integration_id; end

.integration_id=(val) ⇒ Object



410
# File 'lib/paynow_sdk.rb', line 410

def self.integration_id=(val); @@integration_id = val; end

.integration_keyObject



415
# File 'lib/paynow_sdk.rb', line 415

def self.integration_key; @@integration_key; end

.integration_key=(val) ⇒ Object



416
# File 'lib/paynow_sdk.rb', line 416

def self.integration_key=(val); @@integration_key = val; end

.result_urlObject



427
# File 'lib/paynow_sdk.rb', line 427

def self.result_url; @@result_url; end

.result_url=(val) ⇒ Object



428
# File 'lib/paynow_sdk.rb', line 428

def self.result_url=(val); @@result_url = val; end

.return_urlObject



421
# File 'lib/paynow_sdk.rb', line 421

def self.return_url; @@return_url; end

.return_url=(val) ⇒ Object



422
# File 'lib/paynow_sdk.rb', line 422

def self.return_url=(val); @@return_url = val; end

.url_initiate_mobile_transactionObject



403
# File 'lib/paynow_sdk.rb', line 403

def self.url_initiate_mobile_transaction; @@url_initiate_mobile_transaction; end

.url_initiate_mobile_transaction=(val) ⇒ Object



404
# File 'lib/paynow_sdk.rb', line 404

def self.url_initiate_mobile_transaction=(val); @@url_initiate_mobile_transaction = val; end

.url_initiate_transactionObject



397
# File 'lib/paynow_sdk.rb', line 397

def self.url_initiate_transaction; @@url_initiate_transaction; end

.url_initiate_transaction=(val) ⇒ Object



398
# File 'lib/paynow_sdk.rb', line 398

def self.url_initiate_transaction=(val); @@url_initiate_transaction = val; end

Instance Method Details

#build(payment) ⇒ Object

web payments



324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
# File 'lib/paynow_sdk.rb', line 324

def build(payment)
  body = {
    "id": @integration_id,
    "reference": payment.reference,
    "amount": payment.total,
    "additionalinfo": payment.info,
    "returnurl": @return_url,
    "resulturl": @result_url,
    "authemail": payment.auth_email,
    "status": "Payment for goods",
  }

  joined = body.values.join
  add_key = joined += @integration_key
  body["hash"] = createdhash(add_key)
  body = URI.encode_www_form(body)
  body
end

#build_mobile(payment, phone, method) ⇒ Object

mobile payments



345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# File 'lib/paynow_sdk.rb', line 345

def build_mobile(payment, phone, method)
  body = {
    "resulturl": @result_url,
    "returnurl": @return_url,
    "reference": payment.reference,
    "amount": payment.total,
    "id": @integration_id,
    "additionalinfo": payment.info,
    "authemail": payment.auth_email,
    "phone": phone,
    "method": method,
    "status": "Message",
  }

  joined = body.values.join
  add_key = joined += @integration_key
  body["hash"] = createdhash(add_key)
  body = URI.encode_www_form(body)
  body
end

#create_payment(reference, auth_email) ⇒ Object



240
241
242
# File 'lib/paynow_sdk.rb', line 240

def create_payment(reference, auth_email)
  Payment.new(reference, auth_email)
end

#createdhash(out) ⇒ Object



366
367
368
# File 'lib/paynow_sdk.rb', line 366

def createdhash(out)
  Digest::SHA2.new(512).hexdigest(out).upcase
end

#init(payment) ⇒ Object



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'lib/paynow_sdk.rb', line 256

def init(payment)
  if payment.total <= 0
    raise TypeError, "Transaction total cannot be less than 1"
  end

  data = build(payment)

  url = URI("https://www.paynow.co.zw/interface/initiatetransaction/")

  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Post.new(url)
  request["content-type"] = "application/x-www-form-urlencoded"
  request.body = data

  response = http.request(request)
  response.read_body

  response_object = rebuild_response(response.read_body)

  if response_object["status"].to_s.downcase == "error"
    InitResponse.new(response_object)
  end

  if !verify_hash(response_object)
    raise HashMismatchException, "Hashes do not match"
  end
  InitResponse.new(response_object)
end

#init_mobile(payment, phone, method) ⇒ Object



288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
# File 'lib/paynow_sdk.rb', line 288

def init_mobile(payment, phone, method)
  if payment.total <= 0
    raise TypeError, "Transaction total cannot be less than 1"
  end
  if !payment.auth_email || payment.auth_email.size <= 0
    raise TypeError, "Auth email is required for mobile transactions. You can pass the auth email as the second parameter in the create_payment method call"
  end

  data = build_mobile(payment, phone, method)

  url = URI("https://www.paynow.co.zw/interface/remotetransaction")

  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Post.new(url)
  request["content-type"] = "application/x-www-form-urlencoded"
  request.body = data

  response = http.request(request)
  response.read_body

  response_object = rebuild_response(response.read_body)

  if response_object["status"].to_s.downcase == "error"
    InitResponse.new(response_object)
  end
  if !verify_hash(response_object)
    raise HashMismatchException, "Hashes do not match"
  end
  InitResponse.new(response_object)
end

#integration_idObject



412
# File 'lib/paynow_sdk.rb', line 412

def integration_id; @integration_id = @@integration_id if @integration_id.nil?; @integration_id; end

#integration_id=(val) ⇒ Object



413
# File 'lib/paynow_sdk.rb', line 413

def integration_id=(val); @integration_id = val; end

#integration_keyObject



418
# File 'lib/paynow_sdk.rb', line 418

def integration_key; @integration_key = @@integration_key if @integration_key.nil?; @integration_key; end

#integration_key=(val) ⇒ Object



419
# File 'lib/paynow_sdk.rb', line 419

def integration_key=(val); @integration_key = val; end

#process_status_update(data) ⇒ Object



252
253
254
# File 'lib/paynow_sdk.rb', line 252

def process_status_update(data)
  StatusResponse.new(data, true)
end

#rebuild_response(response) ⇒ Object

rebuild a response from paynow into hash like the we send



393
394
395
# File 'lib/paynow_sdk.rb', line 393

def rebuild_response(response)
  URI.decode_www_form(response).to_h
end

#result_urlObject



430
# File 'lib/paynow_sdk.rb', line 430

def result_url; @result_url = @@result_url if @result_url.nil?; @result_url; end

#result_url=(val) ⇒ Object



431
# File 'lib/paynow_sdk.rb', line 431

def result_url=(val); @result_url = val; end

#return_urlObject



424
# File 'lib/paynow_sdk.rb', line 424

def return_url; @return_url = @@return_url if @return_url.nil?; @return_url; end

#return_url=(val) ⇒ Object



425
# File 'lib/paynow_sdk.rb', line 425

def return_url=(val); @return_url = val; end

#send(payment) ⇒ Object



244
245
246
# File 'lib/paynow_sdk.rb', line 244

def send(payment)
  init(payment)
end

#send_mobile(payment, phone, method) ⇒ Object



248
249
250
# File 'lib/paynow_sdk.rb', line 248

def send_mobile(payment, phone, method)
  init_mobile(payment, phone, method)
end

#set_result_url(url) ⇒ Object



232
233
234
# File 'lib/paynow_sdk.rb', line 232

def set_result_url(url)
  @result_url = url
end

#set_return_url(url) ⇒ Object



236
237
238
# File 'lib/paynow_sdk.rb', line 236

def set_return_url(url)
  @return_url = url
end

#url_initiate_mobile_transactionObject



406
# File 'lib/paynow_sdk.rb', line 406

def url_initiate_mobile_transaction; @url_initiate_mobile_transaction = @@url_initiate_mobile_transaction if @url_initiate_mobile_transaction.nil?; @url_initiate_mobile_transaction; end

#url_initiate_mobile_transaction=(val) ⇒ Object



407
# File 'lib/paynow_sdk.rb', line 407

def url_initiate_mobile_transaction=(val); @url_initiate_mobile_transaction = val; end

#url_initiate_transactionObject



400
# File 'lib/paynow_sdk.rb', line 400

def url_initiate_transaction; @url_initiate_transaction = @@url_initiate_transaction if @url_initiate_transaction.nil?; @url_initiate_transaction; end

#url_initiate_transaction=(val) ⇒ Object



401
# File 'lib/paynow_sdk.rb', line 401

def url_initiate_transaction=(val); @url_initiate_transaction = val; end

#verify(item) ⇒ Object



379
380
381
382
383
384
385
386
387
388
389
# File 'lib/paynow_sdk.rb', line 379

def verify(item)
  out = ""
  for key, value in item
    if key.to_s == "hash"
      next
    end
    out += value.to_s
  end
  out += @integration_key.downcase
  Digest::SHA2.new(512).hexdigest(out).upcase
end

#verify_hash(response) ⇒ Object



370
371
372
373
374
375
376
377
# File 'lib/paynow_sdk.rb', line 370

def verify_hash(response)
  if !response.include?("hash")
    raise TypeError, "Response from Paynow does not contain a hash"
  end
  old_hash = response["hash"]
  new_hash = verify(response)
  old_hash == new_hash
end