forked from Trustie/forgeplus
49 lines
1.3 KiB
Ruby
49 lines
1.3 KiB
Ruby
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 |