Initial commit
This commit is contained in:
155
app/services/vandar_service.rb
Normal file
155
app/services/vandar_service.rb
Normal file
@@ -0,0 +1,155 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user