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