class Wechat::Ticket::JsapiBase
Attributes
access_ticket[R]
access_token[R]
client[R]
got_ticket_at[R]
jsapi_ticket_file[R]
ticket_life_in_seconds[R]
Public Class Methods
new(client, access_token, jsapi_ticket_file)
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 11 def initialize(client, access_token, jsapi_ticket_file) @client = client @access_token = access_token @jsapi_ticket_file = jsapi_ticket_file @random_generator = Random.new end
Public Instance Methods
oauth2_state()
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 28 def oauth2_state ticket @oauth2_state end
read_ticket()
click to toggle source
# File lib/generators/wechat/templates/config/initializers/wechat_redis_store.rb, line 29 def read_ticket JSON.parse(Wechat.redis.get(redis_key)) || {} end
signature(url)
click to toggle source
Obtain the wechat jssdk config signature parameter and return below hash
params = { noncestr: noncestr, timestamp: timestamp, jsapi_ticket: ticket, url: url, signature: signature }
# File lib/wechat/ticket/jsapi_base.rb, line 41 def signature(url) params = { noncestr: SecureRandom.base64(16), timestamp: Time.now.to_i, jsapi_ticket: ticket, url: url } pairs = params.keys.sort.map do |key| "#{key}=#{params[key]}" end result = Digest::SHA1.hexdigest pairs.join('&') params.merge(signature: result) end
ticket(tries = 2)
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 18 def ticket(tries = 2) # Possible two worker running, one worker refresh ticket, other unaware, so must read every time read_ticket_from_store refresh if remain_life_seconds < @random_generator.rand(30..(3 * 60)) access_ticket rescue AccessTokenExpiredError access_token.refresh retry unless (tries -= 1).zero? end
write_ticket(ticket_hash)
click to toggle source
# File lib/generators/wechat/templates/config/initializers/wechat_redis_store.rb, line 33 def write_ticket(ticket_hash) Wechat.redis.set redis_key, ticket_hash.to_json end
Protected Instance Methods
read_ticket_from_store()
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 57 def read_ticket_from_store td = read_ticket @ticket_life_in_seconds = td.fetch('ticket_expires_in').to_i @got_ticket_at = td.fetch('got_ticket_at').to_i @oauth2_state = td.fetch('oauth2_state') @access_ticket = td.fetch('ticket') # return access_ticket same time rescue JSON::ParserError, Errno::ENOENT, KeyError, TypeError refresh end
remain_life_seconds()
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 81 def remain_life_seconds ticket_life_in_seconds - (Time.now.to_i - got_ticket_at) end
write_ticket_to_store(ticket_hash)
click to toggle source
# File lib/wechat/ticket/jsapi_base.rb, line 67 def write_ticket_to_store(ticket_hash) ticket_hash['got_ticket_at'] = Time.now.to_i ticket_hash['ticket_expires_in'] = ticket_hash.delete('expires_in') write_ticket(ticket_hash) end
Private Instance Methods
redis_key()
click to toggle source
# File lib/generators/wechat/templates/config/initializers/wechat_redis_store.rb, line 39 def redis_key "my_app_wechat_ticket_#{access_token.secret}" end