# vandar is payment proxy module Vandar # data keys are: # api_key string required # amount Integer required # callback_url String required # mobile_number String optional # factorNumber String optional # description String optional # valid_card_number String optional module Deposit def generate_token(data) url = 'https://ipg.vandar.io/api/v3/send' # POST JSON content data.merge!(api_key: VandarService::API_KEY) parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json') end # step two # handle by ui, open payment page by token # METHOD: get # URL: https://ipg.vandar.io/v3/{token} # step three def transaction(token) url = 'https://vandar.io/api/ipg/2step/transaction' data = { api_key: VandarService::API_KEY, token: token } # POST JSON content parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json') end # step four def verify(token) url = 'https://ipg.vandar.io/api/v3/verify' data = { api_key: VandarService::API_KEY, token: token } # POST JSON content parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json') end end # vandar withdraw fiat module Withdraw def list_withdraw url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement" headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" } Faraday.get(url, nil, headers).body end def create_withdraw(data) # amount: تومان و بزرگتر یا مساوی 5000 url = "https://api.vandar.io/v3/business/#{VandarService::BUSINESS_NAME}/settlement/store" headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" } # POST JSON content data.merge!(track_id: ::SecureRandom.uuid) self.class.parse Faraday.post(url, data.to_json, headers) end def info_withdraw(id) url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement/#{id}" headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" } self.class.parse Faraday.get(url, nil, headers) end def delete_withdraw url = "https://api.vandar.io/v2.1/business/#{VandarService::BUSINESS_NAME}/settlement/{transaction_id}" headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" } self.class.parse Faraday.delete(url, nil, headers) end end # for login in Vandar Account module Login MOBILE = ENV.fetch('VANDAR_MOBILE') || raise('please set Vandar mobile') PASSWORD = ENV.fetch('VANDAR_PASSWORD') || raise('please set Vandar password') def login return @login_token if @login_token.present? url = 'https://api.vandar.io/v3/login' # POST JSON content data = { mobile: MOBILE, password: PASSWORD } response = self.class.parse Faraday.post(url, data.to_json, 'Content-Type' => 'application/json') @login_token = response.dig('access_token') || raise('login in vandar accrued error') ::Rails.cache.write('vandar_login_token', @login_token, expires_in: 345_600) @login_token end end # related to Vandar transactions module Transaction # Name Type Status # fromDate String optional # toDate String optional # statusKind String optional # status String optional # channel String optional # formId String optional # ref_id String optional # tracking_code String optional # per_page String optional # q String optional # # # status # 1: نشان دهنده تراکنش با وضعیت موفق # - 1: نشان دهنده تراکنش با وضعیت ناموفق # 3 : نشان دهنده تراکنش با وضعیت درحال انجام # 2 : نشان دهنده تسویه با وضعیت موفق # -2 : نشان دهنده تسویه با وضعیت درحال انجام # -3 : نشان دهنده تسویه با وضعیت ناموفق # -4 : نشان دهنده تسویه با وضعیت لغو شده # 5 : نشان دهنده تراکنش واریزی از نوع انتقال وجه داخلی # -5 : نشان دهنده تراکنش خروجی از نوع انتقال وجه داخلی # 6 : نشان دهنده تراکنش نوع حق اشتراک def list_transactions(**filters) url = "https://api.vandar.io/v2/business/#{VandarService::BUSINESS_NAME}/transaction" headers = { 'Content-Type' => 'application/json', 'authorization' => "Bearer #{@login_token}" } response = Faraday.get(url, filters, headers) self.class.parse response end end end class VandarService API_KEY = ENV.fetch('VANDAR_API_KEY') || raise('please set Vandar Api_Key') BUSINESS_NAME = ENV.fetch('VANDAR_BUSINESS_NAME') || 'developers' SUCCESS_WITHDRAW = [2].freeze UNSUCCESS_WITHDRAW = [-3, -4].freeze attr_accessor :login_token def initialize @login_token = ::Rails.cache.read('vandar_login_token') || login end extend Vandar::Deposit include Vandar::Login include Vandar::Withdraw include Vandar::Transaction class << self # # step one def parse(response) raise 'response is empty' unless response.present? raise "unexpected response status #{response.status}" unless response.status == 200 JSON.parse(response.body) end end end