module AliyunVod::Service::Base def request(method, params) params = AliyunVod::Sign.format_params(params.compact) # 多层hash需要预先处理,保证值为string params[:Signature] = AliyunVod::Sign.generate(params, method: method.to_s.upcase) Rails.logger.info("[AliyunVod] request => method: #{method}, params: #{params}") response = Faraday.public_send(method, AliyunVod.base_url, params) result = JSON.parse(response.body) Rails.logger.info("[AliyunVod] response => status: #{response.status}, result: #{result}") raise AliyunVod::Error, result['Code'] if response.status != 200 result rescue => ex ::Util.logger_error(ex) raise AliyunVod::Error, ex.message end def base_params { AccessKeyId: AliyunVod.access_key_id, Format: 'JSON', Version: '2017-03-21', SignatureMethod: 'HMAC-SHA1', SignatureVersion: '1.0', SignatureNonce: signature_nonce, Timestamp: timestamp, UserData: user_data } end def user_data { MessageCallback: { CallbackURL: AliyunVod.callback_url } } end def timestamp Time.now.utc.iso8601 end def signature_nonce chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a chars.sample(16).join('') end end