class Wechat::Qy::Client

Constants

API_BASE

Attributes

corp_id[R]
corp_secret[R]
logger[RW]

Public Class Methods

new(corp_id, corp_secret) click to toggle source
# File lib/wechat/qy/client.rb, line 18
def initialize(corp_id, corp_secret)
  @corp_id, @corp_secret = corp_id, corp_secret
  @logger = Logger.new(STDOUT)
  @token_file = File.join('/tmp', "wechat-api-#{corp_id}")
end

Public Instance Methods

access_token() click to toggle source
# File lib/wechat/qy/client.rb, line 24
def access_token
  @access_token ||= begin
    token = MultiJson.load(File.read(@token_file))
    token['access_token']
  rescue
    refresh
  end
end
get(uri, params = {}) click to toggle source
# File lib/wechat/qy/client.rb, line 43
def get(uri, params = {})
  with_access_token(uri, params) do |url, params_with_token|
    debug_request do
      connection.get do |req|
        req.url url, params_with_token
        req.headers[:accept] = 'application/json'
        req.headers[:content_type] = 'application/json'
      end
    end
  end
end
post(uri, data = {}) click to toggle source
# File lib/wechat/qy/client.rb, line 55
def post(uri, data = {})
  with_access_token(uri, {}) do |url, params|
    logger.debug { [:data, data] }
    debug_request do
      connection.post do |req|
        req.url url, params
        req.headers[:accept] = 'application/json'
        req.headers[:content_type] = 'application/json'
        req.body = MultiJson.dump(data)
      end
    end
  end
end
refresh() click to toggle source
# File lib/wechat/qy/client.rb, line 33
def refresh
  url = format('%sgettoken', API_BASE)
  resp = connection.get(url, token_params)
  response = MultiJson.load(resp.body)
  return handle_error(response) if response['errcode']
  @access_token = response['access_token']
  File.open(@token_file, 'w') { |f| f.write(resp.body) } if @access_token
  @access_token
end
with_access_token(uri, params, tried = 2) { |url, merge(access_token: access_token)| ... } click to toggle source
# File lib/wechat/qy/client.rb, line 69
def with_access_token(uri, params, tried = 2)
  url = format('%s%s', API_BASE, uri)
  begin
    resp = yield(url, params.merge(access_token: access_token))
    response = MultiJson.load(resp.body)
    handle_error(response)
  rescue AccessTokenExpiredError => e
    refresh
    retry unless (tried -= 1).zero?
    raise e
  end
end

Private Instance Methods

connection() click to toggle source
# File lib/wechat/qy/client.rb, line 108
def connection
  @connection ||= begin
    Faraday.new do |faraday|
      faraday.adapter Faraday.default_adapter
    end
  end
end
debug_request() { || ... } click to toggle source
# File lib/wechat/qy/client.rb, line 84
def debug_request
  response = yield
  logger.debug { response }
  response
end
handle_error(response) click to toggle source
# File lib/wechat/qy/client.rb, line 90
def handle_error(response)
  case response['errcode']
  when 0, nil
    response
  when 40_001, 42_001, 40_014
    fail AccessTokenExpiredError, response
  else
    fail ResponseError, response
  end
end
token_params() click to toggle source
# File lib/wechat/qy/client.rb, line 101
def token_params
  {
    corpid: corp_id,
    corpsecret: corp_secret
  }
end