Class: MpesaStk::AccessToken

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

Overview

Handles OAuth access token generation, caching, and refreshing for M-Pesa APIs

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key = nil, secret = nil) ⇒ AccessToken

Returns a new instance of AccessToken.



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/mpesa_stk/access_token.rb', line 38

def initialize(key = nil, secret = nil)
  @key = key.nil? ? ENV.fetch('key', nil) : key
  @secret = secret.nil? ? ENV.fetch('secret', nil) : secret
  begin
    @redis = Redis.new
  rescue Redis::CannotConnectError, Redis::ConnectionError => e
    raise StandardError, "Failed to connect to Redis: #{e.message}"
  end

  load_from_redis
end

Class Method Details

.call(key = nil, secret = nil) ⇒ Object



33
34
35
# File 'lib/mpesa_stk/access_token.rb', line 33

def call(key = nil, secret = nil)
  new(key, secret).access_token
end

Instance Method Details

#access_tokenObject



84
85
86
87
# File 'lib/mpesa_stk/access_token.rb', line 84

def access_token
  refresh unless valid?
  @token
end

#load_from_redisObject



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

def load_from_redis
  data = @redis.get(@key)
  if data.nil? || data.empty?
    @token = nil
    @timestamp = nil
    @expires_in = nil
  else
    parsed = JSON.parse(data)
    @token = parsed['access_token']
    @timestamp = parsed['time_stamp']
    @expires_in = parsed['expires_in']
  end
rescue Redis::BaseError => e
  raise StandardError, "Redis error: #{e.message}"
end

#new_access_tokenObject



89
90
91
92
93
94
95
96
97
98
# File 'lib/mpesa_stk/access_token.rb', line 89

def new_access_token
  response = HTTParty.get(url, headers: headers)

  raise StandardError, "Failed to get access token: #{response.code} - #{response.body}" unless response.success?

  hash = JSON.parse(response.body).merge({ 'time_stamp' => Time.now.to_i })
  @redis.set @key, hash.to_json
rescue Redis::BaseError => e
  raise StandardError, "Redis error while saving token: #{e.message}"
end

#refreshObject



63
64
65
66
# File 'lib/mpesa_stk/access_token.rb', line 63

def refresh
  new_access_token
  load_from_redis
end

#token?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/mpesa_stk/access_token.rb', line 59

def token?
  !@token.nil?
end

#token_expired?Boolean

Returns:

  • (Boolean)


54
55
56
57
# File 'lib/mpesa_stk/access_token.rb', line 54

def token_expired?
  expire_time = @timestamp.to_i + @expires_in.to_i
  expire_time < Time.now.to_i + 58
end

#valid?Boolean

Returns:

  • (Boolean)


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

def valid?
  token? && !token_expired?
end