Created
March 12, 2025 06:42
-
-
Save swombat/62b80e0d8048e1634684062afd268fe9 to your computer and use it in GitHub Desktop.
Sumsub API example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SumsubApi < GenericApi | |
BASE_URL = "https://api.sumsub.com" | |
def initialize(api_token: Rails.application.credentials[:sumsub][:api_token], secret_key: Rails.application.credentials[:sumsub][:secret], | |
base_url: BASE_URL, debug: true) | |
@api_token = api_token | |
@secret_key = secret_key | |
@base_url = base_url | |
@debug = debug | |
end | |
def get_applicant_levels | |
wrap_errors do | |
http_client.get("/resources/applicants/-/levels") | |
end | |
end | |
def create_applicant(level_name: "id-and-liveness", id:, email:, phone_number:) | |
wrap_errors do | |
http_client.post("/resources/applicants/?levelName=#{level_name}", { externalUserId: id, email: email, phone: phone_number }.to_json) | |
end | |
end | |
def http_client | |
faraday = Faraday.new(base_url) do |faraday| | |
faraday.headers['X-App-Token'] = @api_token | |
faraday.headers['X-App-Access-Ts'] = Time.now.to_i.to_s | |
faraday.request :multipart | |
faraday.request :url_encoded | |
faraday.headers['Content-Type'] = 'application/json' | |
# faraday.request :retry | |
faraday.response :logger, ::Logger.new($stdout), { bodies: true } do |logger| | |
logger.filter(/(X-App-Token) (\S+)/, '\1REDACTED') | |
end | |
faraday.response :raise_error | |
faraday.response :json | |
end | |
SumSubHttpClient.new(faraday, @secret_key) | |
end | |
def base_url | |
@base_url | |
end | |
def wrap_errors | |
response = yield | |
Rails.logger.debug("Sumsub API response: #{response.inspect}") if @debug | |
response.body.respond_to?(:attributize!) ? response.body.attributize! : response | |
rescue => e | |
error_detail = if e.respond_to?(:response) && e.response && e.response[:body] && e.response[:body]["detail"] | |
"- #{e.response[:body]["detail"]}" | |
else | |
"" | |
end | |
Rails.logger.error("Sumsub API error: #{e.message} #{error_detail}") | |
Rails.logger.error("\n== Sumsub API error Inspect: #{e.inspect}") if @debug | |
raise e | |
end | |
class SumSubHttpClient | |
def initialize(faraday, secret_key) | |
@faraday = faraday | |
@secret_key = secret_key | |
end | |
def get(*args) | |
@faraday.headers['X-App-Access-Sig'] = sign(:get, *args) | |
@faraday.get(*args) | |
end | |
def post(*args) | |
@faraday.headers['X-App-Access-Sig'] = sign(:post, *args) | |
@faraday.post(*args) | |
end | |
def sign(method, *args) | |
data = "#{Time.now.to_i}#{method.to_s.upcase}#{args[0]}#{args[1] && args[1]}" | |
Rails.logger.debug "Signing for Sumsub: `#{data}`" | |
digest = OpenSSL::Digest.new('sha256') | |
OpenSSL::HMAC.hexdigest(digest, @secret_key, data) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment