Class: MpesaStk::AccessToken
- Inherits:
-
Object
- Object
- MpesaStk::AccessToken
- 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
- #access_token ⇒ Object
-
#initialize(key = nil, secret = nil) ⇒ AccessToken
constructor
A new instance of AccessToken.
- #load_from_redis ⇒ Object
- #new_access_token ⇒ Object
- #refresh ⇒ Object
- #token? ⇒ Boolean
- #token_expired? ⇒ Boolean
- #valid? ⇒ Boolean
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_token ⇒ Object
84 85 86 87 |
# File 'lib/mpesa_stk/access_token.rb', line 84 def access_token refresh unless valid? @token end |
#load_from_redis ⇒ Object
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 = nil @expires_in = nil else parsed = JSON.parse(data) @token = parsed['access_token'] = parsed['time_stamp'] @expires_in = parsed['expires_in'] end rescue Redis::BaseError => e raise StandardError, "Redis error: #{e.message}" end |
#new_access_token ⇒ Object
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 |
#refresh ⇒ Object
63 64 65 66 |
# File 'lib/mpesa_stk/access_token.rb', line 63 def refresh new_access_token load_from_redis end |
#token? ⇒ Boolean
59 60 61 |
# File 'lib/mpesa_stk/access_token.rb', line 59 def token? !@token.nil? end |
#token_expired? ⇒ Boolean
54 55 56 57 |
# File 'lib/mpesa_stk/access_token.rb', line 54 def token_expired? expire_time = .to_i + @expires_in.to_i expire_time < Time.now.to_i + 58 end |
#valid? ⇒ Boolean
50 51 52 |
# File 'lib/mpesa_stk/access_token.rb', line 50 def valid? token? && !token_expired? end |