|
- class Wechat::Weapp
- class << self
- attr_accessor :appid, :secret
-
- delegate :access_token, :jscode2session, to: :client
-
- def client
- @_client ||= Wechat::Client.new(appid, secret)
- end
-
- def session_key(openid)
- Rails.cache.read(session_key_cache_key(openid))
- end
-
- def write_session_key(openid, session_key)
- Rails.cache.write(session_key_cache_key(openid), session_key)
- end
-
- def verify?(openid, str, signature)
- session_key = session_key(openid)
- Digest::SHA1.hexdigest("#{str}#{session_key}") == signature
- end
-
- def decrypt(session_key, encrypted_data, iv)
- session_key = Base64.decode64(session_key)
- encrypted_data = Base64.decode64(encrypted_data)
- iv = Base64.decode64(iv)
-
- cipher = OpenSSL::Cipher::AES.new(128, :CBC)
- cipher.decrypt
- cipher.padding = 0
- cipher.key = session_key
- cipher.iv = iv
- Rails.logger.info("[Weapp] encrypted_data: #{encrypted_data}")
- data = cipher.update(encrypted_data) << cipher.final
- Rails.logger.info("[Weapp] data: #{data}")
- result = JSON.parse(data[0...-data.last.ord])
-
- raise Wechat::Error.new(-1, '解密错误') if result.dig('watermark', 'appid') != appid
- result
- end
-
- private
-
- def session_key_cache_key(openid)
- "weapp:#{appid}:#{openid}:session_key"
- end
- end
- end
|