Class: Jieshun::Parking::DataReceiver

Inherits:
Object
  • Object
show all
Defined in:
lib/jieshun/parking/data_receiver.rb

Instance Method Summary collapse

Constructor Details

#initialize(secret, verify_signature) ⇒ DataReceiver

Returns a new instance of DataReceiver.



5
6
7
8
# File 'lib/jieshun/parking/data_receiver.rb', line 5

def initialize(secret, verify_signature)
  @secret = secret
  @verify_signature = verify_signature
end

Instance Method Details

#generate_signature(params) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/jieshun/parking/data_receiver.rb', line 42

def generate_signature(params)
  # sn:签名(sign),使用md5算法对密钥和ts以及dataItem进行签名,签名后的值为大写,规则如下:
  # sn=md5(secret+ts+dataItems)
  timestamp = params['ts']
  data_items = params['dataItems']
  payload = "#{@secret}#{timestamp}#{data_items}"
  md5_string = Digest::MD5.hexdigest(payload)
  md5_string.upcase
end

#receive(params, options) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/jieshun/parking/data_receiver.rb', line 10

def receive(params, options)
  error_handler = options[:error_handler]
  error_occurred = false
  internal_error_handler = lambda do |error|
    error_occurred = true
    if error.is_a?(Jieshun::Parking::InvalidSignatureError)
      error_handler.call({ resultCode: 205, message: '验签失败' })
    else
      #TODO process other errors like ip unbind
      error_handler.call({ resultCode: 1, message: '处理失败' })
    end
  end
  verify_signature(params, { error_handler: internal_error_handler }) if @verify_signature
  return nil if error_occurred
  JSON.parse(params['dataItems'])
end

#verify_signature(params, options) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/jieshun/parking/data_receiver.rb', line 27

def verify_signature(params, options)
  signature_param = params['sn']
  signature = generate_signature(params)
  unless signature_param == signature
    error_handler = options[:error_handler]
    if error_handler
      error_handler.call(Jieshun::Parking::InvalidSignatureError.new)
    else
      raise Jieshun::Parking::InvalidSignatureError.new
    end
  end
end