khalti 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/Rakefile +5 -3
- data/bin/console +4 -3
- data/khalti.gemspec +24 -24
- data/lib/khalti.rb +8 -5
- data/lib/khalti/errors.rb +12 -15
- data/lib/khalti/request_helper.rb +44 -37
- data/lib/khalti/transaction.rb +5 -1
- data/lib/khalti/verification.rb +29 -7
- data/lib/khalti/version.rb +3 -1
- metadata +16 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d349aa4b31e87cb15894680e1164ffa59a7bab668388ffe98b05eaf3a6bfb44
|
4
|
+
data.tar.gz: 825b86c0034a05286bf996a7790b2aa7d427a73b853e49fd1f0a01f412ad1671
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a30ec1cc2a1b44ce39c3fc74eabe373aeb454f897b55476f3f506fef2c154d185f46c4384c9effc25a95f336655106c2ab8b2d88d62cd72aa4bf3d60af03203
|
7
|
+
data.tar.gz: 22bc9c2fb9180066fa6d54112aa74de1174e883433b70c33867afa69ff45585db448271d6f50fd04251a95a5ca93c408c45fe2a0201715d9438eace5755769b2
|
data/.rubocop.yml
ADDED
data/Gemfile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
source 'https://rubygems.org'
|
4
|
+
|
5
|
+
git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
|
4
6
|
|
5
7
|
# Specify your gem's dependencies in khalti.gemspec
|
6
8
|
gemspec
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[](https://travis-ci.org/bajratech/khalti-ruby) [](https://codecov.io/gh/bajratech/khalti-ruby) [](https://badge.fury.io/rb/khalti) [](https://github.com/ellerbrock/open-source-badges/) [](https://opensource.org/licenses/mit-license.php)
|
2
2
|
|
3
3
|
# Khalti
|
4
4
|
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
require
|
4
|
-
require
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'khalti'
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +11,5 @@ require "khalti"
|
|
10
11
|
# require "pry"
|
11
12
|
# Pry.start
|
12
13
|
|
13
|
-
require
|
14
|
+
require 'irb'
|
14
15
|
IRB.start(__FILE__)
|
data/khalti.gemspec
CHANGED
@@ -1,38 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path(
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require 'khalti/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
+
spec.name = 'khalti'
|
8
9
|
spec.version = Khalti::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
10
|
+
spec.authors = ['Degendra Sivakoti']
|
11
|
+
spec.email = ['degendra.sivakoti@gmail.com']
|
12
|
+
spec.summary = 'Ruby gem for Khalti online transaction platform.'
|
13
|
+
spec.description = 'https://github.com/bajratech/khalti-ruby'
|
14
|
+
spec.homepage = 'https://github.com/bajratech/khalti-ruby'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either
|
17
|
+
# set the 'allowed_push_host' to allow pushing to a single host or
|
18
|
+
# delete this section to allow pushing to any host.
|
19
19
|
if spec.respond_to?(:metadata)
|
20
|
-
# spec.metadata["allowed_push_host"] = "
|
20
|
+
# spec.metadata["allowed_push_host"] = "Set to 'http://mygemserver.com'"
|
21
21
|
else
|
22
|
-
raise
|
23
|
-
|
22
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
23
|
+
'public gem pushes.'
|
24
24
|
end
|
25
25
|
|
26
|
-
spec.files
|
26
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
27
27
|
f.match(%r{^(test|spec|features)/})
|
28
28
|
end
|
29
|
-
spec.bindir =
|
29
|
+
spec.bindir = 'exe'
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
|
-
spec.require_paths = [
|
31
|
+
spec.require_paths = ['lib']
|
32
32
|
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
36
|
-
spec.add_development_dependency
|
37
|
-
spec.add_development_dependency
|
33
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
34
|
+
spec.add_development_dependency 'codecov', '~> 0.1'
|
35
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
36
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
37
|
+
spec.add_development_dependency 'webmock', '~> 3.3'
|
38
38
|
end
|
data/lib/khalti.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
|
-
|
2
|
-
require_relative "khalti/verification"
|
3
|
-
require_relative "khalti/transaction"
|
4
|
-
require_relative "khalti/request_helper"
|
5
|
-
require_relative "khalti/errors"
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
3
|
+
require_relative 'khalti/version'
|
4
|
+
require_relative 'khalti/verification'
|
5
|
+
require_relative 'khalti/transaction'
|
6
|
+
require_relative 'khalti/request_helper'
|
7
|
+
require_relative 'khalti/errors'
|
8
|
+
|
9
|
+
# Khalti payment gateway API wrapper
|
7
10
|
module Khalti
|
8
11
|
# Your code goes here...
|
9
12
|
end
|
data/lib/khalti/errors.rb
CHANGED
@@ -1,23 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Khalti
|
2
4
|
module Errors
|
3
|
-
class
|
4
|
-
|
5
|
-
def initialize(data)
|
6
|
-
@data = data
|
7
|
-
super
|
8
|
-
end
|
9
|
-
end
|
5
|
+
# Custom error class to handle RuntimeError
|
6
|
+
class KhaltiError < RuntimeError; end
|
10
7
|
|
11
|
-
class
|
12
|
-
end
|
8
|
+
# Custom error class to handle blank variables
|
9
|
+
class BlankError < KhaltiError; end
|
13
10
|
|
14
|
-
class
|
15
|
-
end
|
11
|
+
# Custom error class to handle invalid amount
|
12
|
+
class InvalidAmountError < KhaltiError; end
|
16
13
|
|
17
|
-
class
|
18
|
-
end
|
14
|
+
# Custom error class to handle invalid token
|
15
|
+
class InvalidTokenError < KhaltiError; end
|
19
16
|
|
20
|
-
class
|
21
|
-
end
|
17
|
+
# Custom error class to handle invalid response data
|
18
|
+
class InvalidResponseError < KhaltiError; end
|
22
19
|
end
|
23
20
|
end
|
@@ -1,48 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Khalti
|
4
|
+
# Handles API calls
|
2
5
|
module RequestHelper
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
self.validate_content_type(res['content-type'])
|
15
|
-
JSON.parse res.body
|
16
|
-
else
|
17
|
-
raise Errors::KhaltiError.new(res.message)
|
6
|
+
class << self
|
7
|
+
SECRET_KEY = ENV['KHALTI_SECRET_KEY']
|
8
|
+
def get(path)
|
9
|
+
validate_secret_key
|
10
|
+
uri = URI.parse(path)
|
11
|
+
req = Net::HTTP::Get.new(uri)
|
12
|
+
req['authorization'] = "Key #{SECRET_KEY}"
|
13
|
+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
14
|
+
http.request(req)
|
15
|
+
end
|
16
|
+
extract_response(res)
|
18
17
|
end
|
19
|
-
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
19
|
+
def post(path, params)
|
20
|
+
validate_secret_key
|
21
|
+
uri = URI.parse(path)
|
22
|
+
req = Net::HTTP::Post.new(uri)
|
23
|
+
req['authorization'] = "Key #{SECRET_KEY}"
|
24
|
+
req.set_form_data(params)
|
25
|
+
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
|
26
|
+
http.request(req)
|
27
|
+
end
|
28
|
+
extract_response(res)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def validate_secret_key
|
34
|
+
return unless SECRET_KEY.nil? || SECRET_KEY.strip.empty?
|
35
|
+
raise Errors::BlankError, 'Ensure KHALTI_SECRET_KEY is not blank.'
|
36
|
+
end
|
37
|
+
|
38
|
+
def validate_content_type(content_type)
|
39
|
+
return if content_type == 'application/json'
|
40
|
+
raise Errors::InvalidResponseError,
|
41
|
+
'Content-type is not application/json.'
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_response(res)
|
45
|
+
case res
|
31
46
|
when Net::HTTPSuccess
|
32
|
-
|
47
|
+
validate_content_type(res['content-type'])
|
33
48
|
JSON.parse res.body
|
34
49
|
else
|
35
|
-
raise Errors::KhaltiError
|
50
|
+
raise Errors::KhaltiError, res.message
|
51
|
+
end
|
36
52
|
end
|
37
53
|
end
|
38
|
-
|
39
|
-
private
|
40
|
-
def self.validate_secret_key
|
41
|
-
raise Errors::BlankError.new('Ensure KHALTI_SECRET_KEY is not blank.') if SECRET_KEY.nil? || SECRET_KEY.strip.empty?
|
42
|
-
end
|
43
|
-
|
44
|
-
def self.validate_content_type(content_type)
|
45
|
-
Errors::InvalidResponseError.new('Content-type is not application/json.') unless content_type ==='application/json'
|
46
|
-
end
|
47
54
|
end
|
48
55
|
end
|
data/lib/khalti/transaction.rb
CHANGED
@@ -1,12 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
require 'net/http'
|
3
5
|
require 'json'
|
4
6
|
|
5
7
|
module Khalti
|
8
|
+
# Khalti Transaction API wrapper
|
6
9
|
class Transaction
|
7
10
|
API_URL = 'https://khalti.com/api/merchant-transaction'
|
8
11
|
def self.find(idx)
|
9
|
-
raise Errors::BlankError
|
12
|
+
raise Errors::BlankError, 'Ensure idx is not blank.' \
|
13
|
+
if idx.nil? || idx.strip.empty?
|
10
14
|
RequestHelper.get("#{API_URL}/#{idx}/")
|
11
15
|
end
|
12
16
|
|
data/lib/khalti/verification.rb
CHANGED
@@ -1,17 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'uri'
|
2
4
|
require 'net/http'
|
3
5
|
require 'json'
|
4
6
|
|
5
7
|
module Khalti
|
8
|
+
# Khalti verification API wrapper
|
6
9
|
class Verification
|
7
|
-
API_URL =
|
10
|
+
API_URL = 'https://khalti.com/api/payment/verify/'
|
8
11
|
SECRET_KEY = ENV['KHALTI_SECRET_KEY']
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
class << self
|
13
|
+
def verify(token, amount)
|
14
|
+
validate_blank_token(token)
|
15
|
+
validate_token_length(token)
|
16
|
+
validate_ammount(amount)
|
17
|
+
params = { 'token': token, 'amount': amount.to_i }
|
18
|
+
RequestHelper.post(API_URL, params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def validate_blank_token(val)
|
22
|
+
return unless val.nil? || val.strip.empty?
|
23
|
+
raise Errors::BlankError, 'Ensure token is not blank.'
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate_token_length(val)
|
27
|
+
return if val.strip.size >= 22
|
28
|
+
raise Errors::InvalidTokenError, 'Ensure token has at least ' \
|
29
|
+
'22 characters.'
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate_ammount(val)
|
33
|
+
return if Integer(val).positive?
|
34
|
+
raise Errors::InvalidAmountError, 'Ensure amount is ' \
|
35
|
+
'greater than 0 paisa.'
|
36
|
+
end
|
15
37
|
end
|
16
38
|
end
|
17
39
|
end
|
data/lib/khalti/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: khalti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Degendra Sivakoti
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -25,63 +25,62 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.16'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: codecov
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0.1'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: webmock
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '3.3'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
83
|
-
description:
|
84
|
-
gateway. For more info visit Khalti Gateway Docs.
|
82
|
+
version: '3.3'
|
83
|
+
description: https://github.com/bajratech/khalti-ruby
|
85
84
|
email:
|
86
85
|
- degendra.sivakoti@gmail.com
|
87
86
|
executables: []
|
@@ -90,6 +89,7 @@ extra_rdoc_files: []
|
|
90
89
|
files:
|
91
90
|
- ".gitignore"
|
92
91
|
- ".rspec"
|
92
|
+
- ".rubocop.yml"
|
93
93
|
- ".travis.yml"
|
94
94
|
- CODE_OF_CONDUCT.md
|
95
95
|
- Gemfile
|