Code Samples: Ruby
IMPORTANT! C# is our Official client and the only code that we support. This Ruby code has been provided by another customer; and we encourage you to let us know if you find any problems, so that we can update accordingly.
Sendfax Method
Fax.rb
require './doxipher.rb' require 'faraday' require 'pp' require 'time' require 'json' USERNAME = "" #Enter Valid Username APIKEY = "" # Enter Valid ApiKey VECTOR = "x49e*wJVXr8BrALE" ENCRYPTIONKEY = ""# Enter Valid EncryptionKey FAX_SERVER_URL = "https://api.sfaxme.com" #FAX_SERVER_URL = "http://127.0.0.1:5000" # for testing you can use `nc -k -l 5000` on the cmd def get_token timestr = Time.now.utc.iso8601() raw = "Username=#{USERNAME}&ApiKey=#{APIKEY}&GenDT=#{timestr}" dox = Doxipher.new(ENCRYPTIONKEY, {:base64=>true}) cipher = dox.encrypt(raw) return cipher end def send_fax(fax_no, filename) tid = nil conn = Faraday.new(:url => FAX_SERVER_URL, :ssl => { :ca_file => 'C:/Ruby200/cacert.pem' } ) do |faraday|#Certificate required #conn = Faraday.new(:url => FAX_SERVER_URL) do |faraday|# None SSL faraday.request :multipart # checks for files in the payload, otherwise leaves everything untouched faraday.request :url_encoded # form-encode POST params faraday.response :logger # log requests to STDOUT faraday.adapter Faraday.default_adapter # make requests with Net::HTTP end #pp conn token = get_token() parts = ["sendfax?", "token=#{CGI.escape(token)}", "ApiKey=#{CGI.escape(APIKEY)}", "RecipientFax=#{fax_no}", "RecipientName=Gene", "OptionalParams=&" ] path = "/api/" + parts.join("&") response = conn.post path do |req| req.body = {} req.body['file'] = Faraday::UploadIO.new(filename, 'application/pdf', 'test2.pdf') end pp response end filename = 'C:/temp/test2.pdf' fax_no = ""#Enter a valid 11 digit US Fax Number send_fax(fax_no, filename)
Returned response
body="{\"SendFaxQueueId\":\"9A4CEBC407C247419DCAAB1D3BE55D6A\",\"isSuccess\":true,\"message\":\"Fax is received and being processed\"}",
SendfaxStatus Method
Faxstatus.rb
require './doxipher.rb' require 'faraday' require 'pp' require 'time' USERNAME = ""# Enter a valid Username APIKEY = ""# Enter a valid ApiKey VECTOR = "x49e*wJVXr8BrALE" ENCRYPTIONKEY = ""#Enter a valid encryptionkey FAX_SERVER_URL = "https://api.sfaxme.com" def get_token timestr = Time.now.utc.iso8601() raw = "Username=#{USERNAME}&ApiKey=#{APIKEY}&GenDT=#{timestr}" dox = Doxipher.new(ENCRYPTIONKEY, {:base64=>true}) cipher = dox.encrypt(raw) return cipher end def send_fax_status(faxid) #faxid = nil conn = Faraday.new(:url => FAX_SERVER_URL, :ssl => { :ca_file => 'C:/Ruby200/cacert.pem' } ) do |faraday| faraday.request :url_encoded # form-encode POST params faraday.response :logger # log requests to STDOUT faraday.adapter Faraday.default_adapter # make requests with Net::HTTP end #pp conn token = get_token() parts = ["sendfaxstatus?", "token=#{CGI.escape(token)}", "ApiKey=#{CGI.escape(APIKEY)}", "SendFaxQueueId=#{faxid}" #Third ] path = "/api/" + parts.join("&") response = conn.get path do |req| req.body = {} end pp response end faxid = ''# Enter a valid FaxId from the SendFax JSON response returned in the body as SendFaxQueueId send_fax_status(faxid)
Returned Response
body= "{\"RecipientFaxStatusItems\":[],\"isSuccess\":true,\"message\":\"Processing fax request\"}", Check the status every 3 minutes thereafter. A successful response is shown next body="{\"RecipientFaxStatusItems\":[{\"SendFaxQueueId\":\"CB7BE649CDB54D399F753F381F48D950\",\"IsSuccess\":true,\"ResultCode\":0,\"ErrorCode\":0,\"ResultMessage\":\"OK\",\"RecipientName\":\"Gene\",\"RecipientFax\":\"15123668506\",\"TrackingCode\":\"\",\"FaxDateUtc\":\"2013-07-29T13:19:20Z\",\"FaxId\":2130729131840997919,\"Pages\":2,\"Attempts\":1}],\"isSuccess\":true,\"message\":\"Fax request is complete\"}",
ReceiveInboundFax Method
ReceiveInboundFax.rb
require './doxipher.rb' require 'faraday' require 'pp' require 'time' USERNAME = ""#Enter a valid username APIKEY = ""#Enter a valid ApiKey VECTOR = "x49e*wJVXr8BrALE" ENCRYPTIONKEY = ""#Enter a valid encryptionkey FAX_SERVER_URL = "https://api.sfaxme.com" def get_token timestr = Time.now.utc.iso8601() raw = "Username=#{USERNAME}&ApiKey=#{APIKEY}&GenDT=#{timestr}" dox = Doxipher.new(ENCRYPTIONKEY, {:base64=>true}) cipher = dox.encrypt(raw) return cipher end def receive_inbound_fax(maxitems) conn = Faraday.new(:url => FAX_SERVER_URL, :ssl => { :ca_file => 'C:/Ruby200/cacert.pem' } ) do |faraday| faraday.request :url_encoded # form-encode POST params faraday.response :logger # log requests to STDOUT faraday.adapter Faraday.default_adapter # make requests with Net::HTTP end #pp conn token = get_token() parts = ["receiveinboundfax?", "token=#{CGI.escape(token)}", "ApiKey=#{CGI.escape(APIKEY)}", "StartDateUTC=#{}", "EndDateUTC=#{}", "MaxItems=#{maxitems}", ] path = "/api/" + parts.join("&") response = conn.get path do |req| req.body = {} end pp response end startdate = ''# Enter a valid Start Date in UTC time enddate = ''# Enter a valid End Date in UTC time to complete the date range criteria maxitems = '500'#Enter a number from 1 to 500 to retrieve that number of results receive_inbound_fax(maxitems)
Returned Response
body="{\"InboundFaxItems\":[{\"FaxId\":\"XXXXXXXXXXXXXXXXXXX\",\"Pages\":\"2\",\"ToFaxNumber\":\"15125314406\",\"FromFaxNumber\":\"5125314401\",\"FromCSID\":\"512.531.4401\",\"FaxDateUtc\":\"10/18/2012 2:56:04 PM\"},{\"FaxId\":\" XXXXXXXXXXXXXXXXXXX \",\"Pages\":\"2\",\"ToFaxNumber\":\"15125314407\",\"FromFaxNumber\":\"5125314401\",\"FromCSID\":\"512.531.4401\",\"FaxDateUtc\":\"10/18/2012 2:56:04 PM}],\"FaxCount\":101,\"LastWatermark\":\" XXXXXXXXXXXXXXXXXXX \",\"HasMoreItems\":\"false\",\"isSuccess\":true,\"message\":\"Success\"}",
Note: If there are more items to retrieve the HasMoreItems will be set to “true”.
DownloadInboundFaxAsPdf Method
DownloadInboundFaxAsPdf.rb
require './doxipher.rb' require 'faraday' require 'pp' require 'time' USERNAME = ""#Enter a valid Username APIKEY = ""Enter a valid Apikey VECTOR = "x49e*wJVXr8BrALE" ENCRYPTIONKEY = ""#Enter a valid EncryptionKey FAX_SERVER_URL = "https://api.sfaxme.com" def get_token timestr = Time.now.utc.iso8601() raw = "Username=#{USERNAME}&ApiKey=#{APIKEY}&GenDT=#{timestr}" dox = Doxipher.new(ENCRYPTIONKEY, {:base64=>true}) cipher = dox.encrypt(raw) return cipher end def download_inbound_fax_as_pdf(faxid) conn = Faraday.new(:url => FAX_SERVER_URL, :ssl => { :ca_file => 'C:/Ruby200/cacert.pem' } ) do |faraday| faraday.request :url_encoded # form-encode POST params faraday.response :logger # log requests to STDOUT faraday.adapter Faraday.default_adapter # make requests with Net::HTTP end token = get_token() parts = ["downloadinboundfaxaspdf?", "token=#{CGI.escape(token)}", "ApiKey=#{CGI.escape(APIKEY)}", "FaxId=#{faxid}" ] path = "/api/" + parts.join("&") response = conn.get path a = response.body File.open('C:/temp/2121206215127980253.pdf', 'wb') do |f| f.write (a) f.close end pp response end faxid = '2121206215127980253'#Enter a faxid from the ReceiveInboundFax list download_inbound_fax_as_pdf(faxid)
DownloadInboundFaxAsTif Method
DownloadInboundFaxAsTif.rb
require './doxipher.rb' require 'faraday' require 'pp' require 'time' USERNAME = ""#Enter a valid Username APIKEY = ""#Enter a valid ApiKey VECTOR = "x49e*wJVXr8BrALE" ENCRYPTIONKEY = ""#Enter a valid EncryptionKey FAX_SERVER_URL = "https://api.sfaxme.com" def get_token timestr = Time.now.utc.iso8601() raw = "Username=#{USERNAME}&ApiKey=#{APIKEY}&GenDT=#{timestr}" dox = Doxipher.new(ENCRYPTIONKEY, {:base64=>true}) cipher = dox.encrypt(raw) return cipher end def download_inbound_fax_as_tif(faxid) conn = Faraday.new(:url => FAX_SERVER_URL, :ssl => { :ca_file => 'C:/Ruby200/cacert.pem' } ) do |faraday| #conn = Faraday.new(:url => FAX_SERVER_URL) do |faraday| faraday.request :url_encoded # form-encode POST params faraday.response :logger # log requests to STDOUT faraday.adapter :net_http end token = get_token() parts = ["downloadinboundfaxastif?", "token=#{CGI.escape(token)}", "ApiKey=#{CGI.escape(APIKEY)}", "FaxId=#{faxid}" ] path = "/api/" + parts.join("&") response = conn.get path a = response.body File.open('C:/temp/2121206215127980253.tif', 'wb') do |f| #a.each do | byte | f.write (a) f.close end pp response end faxid = '2121206215127980253'#Enter a faxid from the ReceiveInboundFax list download_inbound_fax_as_tif(faxid)
AES Encryption
doxifer.rb
require 'openssl' require "base64" class Doxipher #:iv => #Pass in a 16 byte value. Defaults to 16 0 bytes which is not good. class Doxipher def initialize( key, options = {} ) @base64 = options[:base64] || false @key = key.clone #@iv = options[:iv] || "\0" * 16 @iv = 'x49e*wJVXr8BrALE' end def encrypt( plain = nil, &block ) if @base64 Base64.encode64( cipher( plain, false, &block )) else cipher( plain, false, &block ) end end def decrypt( cipher_text = nil, &block ) cipher(cipher_text, true, &block) end def <<( data) @data << @cipher.update( decode_if_needed(data) ) end private def decode_if_needed(data) @base64 && @decrypt ? Base64.decode64(data) : data end def cipher( data = nil, _decrypt = false, &block ) @decrypt = _decrypt @cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') if _decrypt @cipher.decrypt else @cipher.encrypt end @cipher.key = @key @cipher.iv = @iv if block_given? @data = '' block.call self else @data = @cipher.update decode_if_needed(data) rescue nil @data = data if @data.nil? end @data << @cipher.final @data end end