mpesarb 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68d96fb20a2f0f9d3f463f6bb4b0d6d1e520c20d1c11f2d2a938aaf451d4ef4e
4
- data.tar.gz: 92017a2a811f1f6de9f233c083be65b892ebb591bbc2c392dd31aeedac9a4212
3
+ metadata.gz: f58f3c8c8bb861948c8c2418733a9dea0ab7d51de6be5a8366503c4d778c9949
4
+ data.tar.gz: 79cdd313fc5da2e6aa4d01cbc399a4756726949d353285991ed6ec7a6a75d33b
5
5
  SHA512:
6
- metadata.gz: 3c23bd5e3eb258bf86062cfbdc5bde0745617c5d6cb8f59da3927333331ab231e1c6c8d6c1296d5b342594b7cc7acb73d4f1c8c6ddc218de39389a79f58e37e6
7
- data.tar.gz: ded8afec648b6cd69b45d4d0b4f958c27c43dbe7b2113e939c4c4f83aaeb807dc5e8e7c2091ed609709b32673f8f47c47c28b9e80b1c166049c91ebf0f9cd56e
6
+ metadata.gz: 1c8ca8bbf672b89f9fc73516000e487397f9e5aec26c35e0d12131a5e1e9a28519adc3f4bd4dad5d29304794f2052c765a68009d7ce1e47e2e91a557735629e8
7
+ data.tar.gz: bff2fd36423ad9d2601a4b5f733c1644dc00cc82ba5a33c5b49e87c3f5916533cf75496d80a72476d4cc4fb7c4bff5468175affd9f5891053f963be96402c77c
data/CHANGELOG.md CHANGED
@@ -1,4 +1,6 @@
1
- ### Unreleased
1
+ ### 2022-01-04
2
+ - Support `response` `to_hash` method
3
+ ### 2020-01-20
2
4
  - Update gemspec
3
5
  - Read certificate full path
4
6
  - Return early if get access token fail
data/Gemfile CHANGED
@@ -1,4 +1,6 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in mpesa.gemspec
4
6
  gemspec
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- mpesarb (0.3.0)
4
+ mpesarb (0.3.1)
5
5
  activesupport (>= 5.0.0)
6
6
  faraday (>= 1.1)
7
7
  faraday_middleware (~> 1.1)
@@ -10,7 +10,7 @@ PATH
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (6.1.4)
13
+ activesupport (6.1.4.1)
14
14
  concurrent-ruby (~> 1.0, >= 1.0.2)
15
15
  i18n (>= 1.6, < 2)
16
16
  minitest (>= 5.1)
@@ -32,7 +32,7 @@ GEM
32
32
  crack (0.4.5)
33
33
  rexml
34
34
  docile (1.4.0)
35
- faraday (1.7.1)
35
+ faraday (1.8.0)
36
36
  faraday-em_http (~> 1.0)
37
37
  faraday-em_synchrony (~> 1.0)
38
38
  faraday-excon (~> 1.1)
@@ -51,11 +51,12 @@ GEM
51
51
  faraday-net_http_persistent (1.2.0)
52
52
  faraday-patron (1.0.0)
53
53
  faraday-rack (1.0.0)
54
- faraday_middleware (1.1.0)
54
+ faraday_middleware (1.2.0)
55
55
  faraday (~> 1.0)
56
56
  hashdiff (1.0.1)
57
57
  i18n (1.8.10)
58
58
  concurrent-ruby (~> 1.0)
59
+ ipaddr (1.2.3)
59
60
  json (2.5.1)
60
61
  method_source (1.0.0)
61
62
  minitest (5.14.4)
@@ -65,7 +66,8 @@ GEM
65
66
  minitest (>= 5.0)
66
67
  ruby-progressbar
67
68
  multipart-post (2.1.1)
68
- openssl (2.2.0)
69
+ openssl (2.2.1)
70
+ ipaddr
69
71
  pry (0.13.1)
70
72
  coderay (~> 1.1)
71
73
  method_source (~> 1.0)
@@ -95,10 +97,11 @@ GEM
95
97
  addressable (>= 2.8.0)
96
98
  crack (>= 0.3.2)
97
99
  hashdiff (>= 0.4.0, < 2.0.0)
98
- zeitwerk (2.4.2)
100
+ zeitwerk (2.5.1)
99
101
 
100
102
  PLATFORMS
101
103
  x86_64-darwin-19
104
+ x86_64-darwin-20
102
105
 
103
106
  DEPENDENCIES
104
107
  bundler (>= 2.1.4)
@@ -113,4 +116,4 @@ DEPENDENCIES
113
116
  webmock (~> 3.7)
114
117
 
115
118
  BUNDLED WITH
116
- 2.2.17
119
+ 2.2.27
data/README.md CHANGED
@@ -12,7 +12,7 @@ This Gem provides an interface that developers can use to convert JSON to `OpenS
12
12
 
13
13
  Install via `Gemfile`
14
14
  ```
15
- gem 'mpesarb', '~> 0.3.0'
15
+ gem 'mpesarb', '~> 0.3.2'
16
16
  ```
17
17
 
18
18
  Or
@@ -100,6 +100,44 @@ respose.ResponseDescription # "Accept the service request successfully."
100
100
 
101
101
  ```
102
102
 
103
+ ### Transaction Status
104
+ Check Transation Status
105
+
106
+ ```rb
107
+ response = client.status(
108
+ shortcode: '600426',
109
+ transaction_id: 'OEI2AK4Q16',
110
+ identifier_type: 1,
111
+ initiator_username: 'testapi',
112
+ initiator_password: 'Safaricom426!',
113
+ timeout_url: 'https://example.com/result',
114
+ result_url: 'https://example.com/result'
115
+ )
116
+
117
+ response.ConversationID
118
+ response.ResponseCode
119
+ ```
120
+
121
+ ### Reversal
122
+ Initiate a reversal
123
+
124
+ ```
125
+ response = client.reversal(
126
+ initiator_password: 'Safaricom426!',
127
+ initiator_username: 'testapi',
128
+ transaction_id: 'OEI2AK4Q16',
129
+ amount: '100',
130
+ receiver: '600610',
131
+ receiver_type: '4',
132
+ timeout_url: 'https://example.com/result',
133
+ result_url: 'https://example.com/result'
134
+ )
135
+
136
+ response.ConversationID
137
+ response.ResponseCode
138
+
139
+ ```
140
+
103
141
 
104
142
  ## Development
105
143
 
data/Rakefile CHANGED
@@ -1,10 +1,12 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rake/testtask'
3
5
 
4
6
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
7
+ t.libs << 'test'
8
+ t.libs << 'lib'
9
+ t.test_files = FileList['test/**/*_test.rb']
8
10
  end
9
11
 
10
- task :default => :test
12
+ task default: :test
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'mpesa'
@@ -10,7 +11,13 @@ require 'mpesa'
10
11
  # require "pry"
11
12
  # Pry.start
12
13
 
13
- client = Mpesa::Client.new(key: 'ZtkRW6ATbVtFpNml5w5SfG26Adfyagn9', secret: 'dosFI1yQ8bvHEVFw', env: 'sandbox')
14
+ client = Mpesa::Client.new(
15
+ key: 'ZtkRW6ATbVtFpNml5w5SfG26Adfyagn9',
16
+ secret: 'dosFI1yQ8bvHEVFw',
17
+ env: 'sandbox',
18
+ shortcode: '174379',
19
+ pass_key: 'bfb279f9aa9bdbcf158e97dd71a467cd2e0c893059b10f78e6b72ada1ed2c919'
20
+ )
14
21
 
15
22
  require 'irb'
16
23
  IRB.start(__FILE__)
data/lib/mpesa/client.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'faraday_middleware'
3
5
 
@@ -30,6 +32,18 @@ module Mpesa
30
32
  Payout.new(self, args).call
31
33
  end
32
34
 
35
+ def status(**args)
36
+ Status.new(self, args).call
37
+ end
38
+
39
+ def balance(**args)
40
+ Balance.new(self, args).call
41
+ end
42
+
43
+ def reversal(**args)
44
+ Reversal.new(self, args).call
45
+ end
46
+
33
47
  def connection(basic_auth: false)
34
48
  @connection ||= Faraday.new do |conn|
35
49
  conn.url_prefix = "https://#{subdomain}.safaricom.co.ke"
data/lib/mpesa/error.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Error < StandardError; end
3
5
  end
data/lib/mpesa/object.rb CHANGED
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ostruct'
2
4
 
3
5
  module Mpesa
4
6
  class Object
7
+ attr_reader :attributes
8
+
5
9
  def initialize(attributes)
6
10
  @attributes = OpenStruct.new(attributes)
7
11
  end
@@ -14,5 +18,9 @@ module Mpesa
14
18
  def respond_to_missing?(_method, _include_private = false)
15
19
  true
16
20
  end
21
+
22
+ def to_hash
23
+ attributes.to_h
24
+ end
17
25
  end
18
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Intance < Object
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Resource
3
5
  attr_reader :client, :args
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Status < Resource
3
5
  PATH = 'mpesa/transactionstatus/v1/query'
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Payout < Resource
3
- PATH = 'mpesa/b2c/v1/paymentrequest'.freeze
5
+ PATH = 'mpesa/b2c/v1/paymentrequest'
4
6
 
5
7
  def call
6
8
  Object.new post_request(url: PATH, body: body).body
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Register < Resource
3
- PATH = 'mpesa/c2b/v1/registerurl'.freeze
5
+ PATH = 'mpesa/c2b/v1/registerurl'
4
6
 
5
7
  def call
6
8
  Object.new post_request(url: PATH, body: body).body
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mpesa
4
+ class Reversal < Resource
5
+ PATH = 'mpesa/reversal/v1/request'
6
+
7
+ def call
8
+ Object.new post_request(url: PATH, body: body).body
9
+ end
10
+
11
+ def body
12
+ {
13
+ "Initiator": args[:initiator_username],
14
+ "SecurityCredential": credentials,
15
+ "CommandID": 'TransactionReversal',
16
+ "TransactionID": args[:transaction_id],
17
+ "Amount": args[:amount],
18
+ "ReceiverParty": args[:receiver],
19
+ "RecieverIdentifierType": args[:receiver_type],
20
+ "Remarks": args[:remarks] || 'check status',
21
+ "QueueTimeOutURL": args[:timeout_url],
22
+ "ResultURL": args[:result_url],
23
+ "Occasion": args[:occasion] || 'check status'
24
+ }
25
+ end
26
+
27
+ def credentials
28
+ SecurityCred.new(args[:initiator_password], client.env).password_credential
29
+ end
30
+ end
31
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
4
  class Status < Resource
3
5
  PATH = 'mpesa/transactionstatus/v1/query'
@@ -7,8 +9,21 @@ module Mpesa
7
9
 
8
10
  def body
9
11
  {
10
-
12
+ "CommandID": 'TransactionStatusQuery',
13
+ "PartyA": args[:shortcode] || client.shortcode,
14
+ "IdentifierType": args[:identifier_type],
15
+ "Remarks": args[:remarks] || 'check status',
16
+ "Initiator": args[:initiator_username],
17
+ "SecurityCredential": credentials,
18
+ "QueueTimeOutURL": args[:timeout_url],
19
+ "ResultURL": args[:result_url],
20
+ "TransactionID": args[:transaction_id],
21
+ "Occasion": args[:occasion] || 'check status'
11
22
  }
12
23
  end
24
+
25
+ def credentials
26
+ SecurityCred.new(args[:initiator_password], client.env).password_credential
27
+ end
13
28
  end
14
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'base64'
2
4
 
3
5
  module Mpesa
@@ -10,13 +12,13 @@ module Mpesa
10
12
 
11
13
  def body
12
14
  {
13
- 'BusinessShortCode': args[:shortcode] || client.shortcode,
15
+ 'BusinessShortCode': shortcode,
14
16
  'Password': password,
15
17
  'Timestamp': timestamp.to_s,
16
18
  'TransactionType': 'CustomerPayBillOnline',
17
19
  'Amount': args[:amount],
18
20
  'PartyA': args[:phone],
19
- 'PartyB': args[:shortcode] || client.shortcode,
21
+ 'PartyB': shortcode,
20
22
  'PhoneNumber': args[:phone],
21
23
  'CallBackURL': args[:callback_url],
22
24
  'AccountReference': args[:reference],
@@ -25,11 +27,15 @@ module Mpesa
25
27
  end
26
28
 
27
29
  def password
28
- Base64.strict_encode64("#{args[:shortcode]}#{client.pass_key || args[:pass_key]}#{timestamp}")
30
+ Base64.strict_encode64("#{shortcode}#{args[:pass_key] || client.pass_key}#{timestamp}")
29
31
  end
30
32
 
31
33
  def timestamp
32
34
  Time.now.strftime('%Y%m%d%H%M%S').to_i
33
35
  end
36
+
37
+ def shortcode
38
+ args[:shortcode] || client.shortcode
39
+ end
34
40
  end
35
41
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/cache'
2
4
  require 'active_support/cache/memory_store'
3
5
  require 'active_support/notifications'
data/lib/mpesa/version.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Mpesa
2
- VERSION = '0.3.1'
4
+ VERSION = '0.3.2'
3
5
  end
data/lib/mpesa.rb CHANGED
@@ -16,6 +16,7 @@ module Mpesa
16
16
  autoload :Payout, 'mpesa/resources/payout'
17
17
  autoload :Status, 'mpesa/resources/status'
18
18
  autoload :Balance, 'mpesa/resources/balance'
19
+ autoload :Reversal, 'mpesa/resources/reversal'
19
20
 
20
21
  autoload :Instance, 'mpesa/objects/instace'
21
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mpesarb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moses Gathuku
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-15 00:00:00.000000000 Z
11
+ date: 2022-01-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -224,6 +224,7 @@ files:
224
224
  - lib/mpesa/resources/balance.rb
225
225
  - lib/mpesa/resources/payout.rb
226
226
  - lib/mpesa/resources/register.rb
227
+ - lib/mpesa/resources/reversal.rb
227
228
  - lib/mpesa/resources/status.rb
228
229
  - lib/mpesa/resources/stk.rb
229
230
  - lib/mpesa/resources/token.rb