Class: Wechat::JsapiTicket

Inherits:
Object
  • Object
show all
Defined in:
lib/wechat/jsapi_ticket.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(client, access_token, jsapi_ticket_file) ⇒ JsapiTicket

Returns a new instance of JsapiTicket.



7
8
9
10
11
# File 'lib/wechat/jsapi_ticket.rb', line 7

def initialize(client, access_token, jsapi_ticket_file)
  @client = client
  @access_token = access_token
  @jsapi_ticket_file = jsapi_ticket_file
end

Instance Attribute Details

#access_tokenObject (readonly)

Returns the value of attribute access_token.



5
6
7
# File 'lib/wechat/jsapi_ticket.rb', line 5

def access_token
  @access_token
end

#clientObject (readonly)

Returns the value of attribute client.



5
6
7
# File 'lib/wechat/jsapi_ticket.rb', line 5

def client
  @client
end

#jsapi_ticket_dataObject (readonly)

Returns the value of attribute jsapi_ticket_data.



5
6
7
# File 'lib/wechat/jsapi_ticket.rb', line 5

def jsapi_ticket_data
  @jsapi_ticket_data
end

#jsapi_ticket_fileObject (readonly)

Returns the value of attribute jsapi_ticket_file.



5
6
7
# File 'lib/wechat/jsapi_ticket.rb', line 5

def jsapi_ticket_file
  @jsapi_ticket_file
end

Instance Method Details

#refreshObject

刷新 jsapi_ticket



35
36
37
38
39
40
# File 'lib/wechat/jsapi_ticket.rb', line 35

def refresh
  data = client.get('ticket/getticket', params: { access_token: access_token.token, type: 'jsapi' })
  data.merge!(created_at: Time.now.to_i)
  File.open(jsapi_ticket_file, 'w') { |f| f.write(data.to_json) } if valid_ticket(data)
  @jsapi_ticket_data = data
end

#signature(url) ⇒ Object

获取 jssdk 签名及注册所需其他参数, 返回具有如下结构的 hash:

params = {
  noncestr: noncestr,
  timestamp: timestamp,
  jsapi_ticket: ticket,
  url: url,
  signature: signature
}


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/wechat/jsapi_ticket.rb', line 50

def signature(url)
  timestamp = Time.now.to_i
  noncestr = SecureRandom.base64(16)
  params = {
    noncestr: noncestr,
    timestamp: timestamp,
    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

#ticketObject

获取微信 jssdk 签名所需的 jsapi_ticket, 返回具有如下结构的 hash:

{
  "errcode":0,
  "errmsg":"ok",
  "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
  "expires_in":7200
}


20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/wechat/jsapi_ticket.rb', line 20

def ticket
  begin
    @jsapi_ticket_data ||= JSON.parse(File.read(jsapi_ticket_file))
    created_at = jsapi_ticket_data['created_at'].to_i
    expires_in = jsapi_ticket_data['expires_in'].to_i
    if Time.now.to_i - created_at >= expires_in - 3 * 60
      fail 'jsapi_ticket may be expired'
    end
  rescue
    refresh
  end
  valid_ticket(@jsapi_ticket_data)
end