mpesarb 0.3.1 → 0.3.2

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