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