Files
Dena/app/services/vandar_service.rb
2026-08-13 19:50:53 +03:30

156 lines
5.4 KiB
Ruby

# 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